love.graphics.drawInstanced (日本語)

LÖVE 11.0 から使用可能
この関数は以前のバージョンでは非対応です。


ハードウェア・ジオメトリによるインスタンス化を用いることで、一度の描画命令で Mesh の複数インスタンスを描画します。

インスタンスごとに固有プロパティ値 (位置、配色など) を有していますが、カスタム・シェーダから各インスタンスの頂点属性、またはGLSL 3 の頂点 シェーダ変数である love_InstanceID のどちらかを用いるまでデフォルトにはなりません。さもなければ、すべて同一位置へ相互レンダリングされます。

OpenGL ES 2 または OpenGL 2 機能だけの旧型 GPU ではインスタンス化は非対応です。対応状況は love.graphics.getSupported で確認します。

関数

概要

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

関連


そのほかの言語