Difference between revisions of "love.graphics.drawInstanced (日本語)"
(Created page with "{{newin (日本語)|11.0|110|type=関数}} ハードウェア・ジオメトリによるインスタンス化を用いることで、一度の描画命...") |
m (translation updated.) |
||
Line 3: | Line 3: | ||
ハードウェア・ジオメトリによるインスタンス化を用いることで、一度の描画命令で [[Mesh (日本語)|Mesh]] の複数インスタンスを描画します。 | ハードウェア・ジオメトリによるインスタンス化を用いることで、一度の描画命令で [[Mesh (日本語)|Mesh]] の複数インスタンスを描画します。 | ||
− | インスタンスごとに固有プロパティ値 (位置、配色など) を有していますが、カスタム・[[Shader (日本語)|シェーダ]]から[[Mesh:attachAttribute| | + | インスタンスごとに固有プロパティ値 (位置、配色など) を有していますが、カスタム・[[Shader (日本語)|シェーダ]]から[[Mesh:attachAttribute|各インスタンスの頂点属性]]、またはGLSL 3 の頂点 [[Shader Variables (日本語)|シェーダ変数]]である <code>love_InstanceID</code> のどちらかを用いるまでデフォルトにはなりません。さもなければ、すべて同一位置へ相互レンダリングされます。 |
OpenGL ES 2 または OpenGL 2 機能だけの旧型 GPU ではインスタンス化は非対応です。対応状況は [[love.graphics.getSupported (日本語)|love.graphics.getSupported]] で確認します。 | OpenGL ES 2 または OpenGL 2 機能だけの旧型 GPU ではインスタンス化は非対応です。対応状況は [[love.graphics.getSupported (日本語)|love.graphics.getSupported]] で確認します。 | ||
Line 38: | Line 38: | ||
=== 返値 === | === 返値 === | ||
ありません。 | ありません。 | ||
+ | |||
+ | == 用例 == | ||
+ | === 複数の三角形を描画するために頂点属性のインスタンス化を使用します === | ||
+ | <source lang="Lua"> | ||
+ | -- デフォルトの位置、テクスチャ座標、頂点属性の配色による小さな三角形。 | ||
+ | local vertices = { | ||
+ | {0, 0, 0,0, 1.0,0.2,0.2,1.0}, | ||
+ | {20,0, 0,0, 0.2,1.0,0.2,1.0}, | ||
+ | {20,20, 0,0, 0.2,0.2,1.0,1.0}, | ||
+ | } | ||
+ | |||
+ | local mesh = love.graphics.newMesh(vertices, "triangles", "static") | ||
+ | |||
+ | -- レンダリング対象となるインスタンスごとの固有位置。 | ||
+ | local instancepositions = {} | ||
+ | for y=0, love.graphics.getHeight()-1, 30 do | ||
+ | for x = 0, love.graphics.getWidth()-1, 30 do | ||
+ | local pos = {x, y} | ||
+ | table.insert(instancepositions, pos) | ||
+ | end | ||
+ | end | ||
+ | |||
+ | -- 各インスタンスの位置を有するメッシュを作成します。 | ||
+ | -- 描画は直接行われませんが、三角形のメッシュから参照されます。 | ||
+ | local instancemesh = love.graphics.newMesh({{"InstancePosition", "float", 2}}, instancepositions, nil, "static") | ||
+ | |||
+ | -- 三角形のメッシュがレンダリングされた後、シェーダは頂点ごとではなく、 | ||
+ | -- インスタンスごとの InstancePosition の各値で各種処理を行います。 | ||
+ | mesh:attachAttribute("InstancePosition", instancemesh, "perinstance") | ||
+ | |||
+ | -- 頂点シェーダで InstancePosition 頂点属性を使用します。 | ||
+ | local shader = love.graphics.newShader[[ | ||
+ | attribute vec2 InstancePosition; | ||
+ | |||
+ | vec4 position(mat4 transform_projection, vec4 vertex_position) | ||
+ | { | ||
+ | vertex_position.xy += InstancePosition; | ||
+ | return transform_projection * vertex_position; | ||
+ | } | ||
+ | ]] | ||
+ | |||
+ | function love.draw() | ||
+ | love.graphics.setShader(shader) | ||
+ | |||
+ | -- インスタンス化の使用により、一回の描画呼び出しでメッシュを何度も描画します。 | ||
+ | local instancecount = #instancepositions | ||
+ | love.graphics.drawInstanced(mesh, instancecount, 0, 0) | ||
+ | end | ||
+ | </source> | ||
== 関連 == | == 関連 == |
Latest revision as of 02:58, 12 November 2019
LÖVE 11.0 から使用可能 |
この関数は以前のバージョンでは非対応です。 |
ハードウェア・ジオメトリによるインスタンス化を用いることで、一度の描画命令で Mesh の複数インスタンスを描画します。
インスタンスごとに固有プロパティ値 (位置、配色など) を有していますが、カスタム・シェーダから各インスタンスの頂点属性、またはGLSL 3 の頂点 シェーダ変数である love_InstanceID
のどちらかを用いるまでデフォルトにはなりません。さもなければ、すべて同一位置へ相互レンダリングされます。
OpenGL ES 2 または OpenGL 2 機能だけの旧型 GPU ではインスタンス化は非対応です。対応状況は love.graphics.getSupported で確認します。
Contents
関数
概要
love.graphics.drawInstanced( mesh, instancecount, x, y, r, sx, sy, ox, oy, kx, ky )
引数
Mesh mesh
- レンダリングをするインスタンス。
number instancecount
- レンダリングをするインスタンスの個数。
number x (0)
- インスタンス描画位置 (x-軸)。
number y (0)
- インスタンス描画位置 (y-軸)。
number r (0)
- 方向 (弧度)。
number sx (1)
- 尺度変更係数 (x-軸)。
number sy (sx)
- 尺度変更係数 (x-軸)。
number ox (0)
- 原点の支距 (x-軸)。
number oy (0)
- 原点の支距 (y-軸)。
number kx (0)
- 剪断係数 (x-軸)。
number ky (0)
- 剪断係数 (y-軸)。
返値
ありません。
関数
概要
love.graphics.drawInstanced( mesh, instancecount, transform )
引数
Mesh mesh
- レンダリングをするインスタンス。
number instancecount
- レンダリングをするインスタンスの個数。
Transform transform
- Transform オブジェクト。
返値
ありません。
用例
複数の三角形を描画するために頂点属性のインスタンス化を使用します
-- デフォルトの位置、テクスチャ座標、頂点属性の配色による小さな三角形。
local vertices = {
{0, 0, 0,0, 1.0,0.2,0.2,1.0},
{20,0, 0,0, 0.2,1.0,0.2,1.0},
{20,20, 0,0, 0.2,0.2,1.0,1.0},
}
local mesh = love.graphics.newMesh(vertices, "triangles", "static")
-- レンダリング対象となるインスタンスごとの固有位置。
local instancepositions = {}
for y=0, love.graphics.getHeight()-1, 30 do
for x = 0, love.graphics.getWidth()-1, 30 do
local pos = {x, y}
table.insert(instancepositions, pos)
end
end
-- 各インスタンスの位置を有するメッシュを作成します。
-- 描画は直接行われませんが、三角形のメッシュから参照されます。
local instancemesh = love.graphics.newMesh({{"InstancePosition", "float", 2}}, instancepositions, nil, "static")
-- 三角形のメッシュがレンダリングされた後、シェーダは頂点ごとではなく、
-- インスタンスごとの InstancePosition の各値で各種処理を行います。
mesh:attachAttribute("InstancePosition", instancemesh, "perinstance")
-- 頂点シェーダで InstancePosition 頂点属性を使用します。
local shader = love.graphics.newShader[[
attribute vec2 InstancePosition;
vec4 position(mat4 transform_projection, vec4 vertex_position)
{
vertex_position.xy += InstancePosition;
return transform_projection * vertex_position;
}
]]
function love.draw()
love.graphics.setShader(shader)
-- インスタンス化の使用により、一回の描画呼び出しでメッシュを何度も描画します。
local instancecount = #instancepositions
love.graphics.drawInstanced(mesh, instancecount, 0, 0)
end
関連
- love.graphics (日本語)
- Mesh (日本語)
- Mesh:attachAttribute (日本語)
- love.graphics.newShader (日本語)
- GraphicsFeature (日本語)