love.graphics.drawInstanced (Français)

Disponible depuis LÖVE 11.0
Ce-tte function n'est pas supporté-e par des versions plus anciennes.

Trace plusieurs instances d'un Mesh (maillage) à partir d'un unique appel de tracé, en utilisant l'instanciation géométrique matérielle.

Chauqe instance peut avoir des propriétés unique (positions, couleurs, etc) mais, ne les auront pas par défaut, à moins que'un Shader personnalisé, ainsi que soit des attributs de vecteur par instance ou bien la variable d'ombrage de vecteur love_InstanceID GLSL 3 soit utilisé, autrement ils seront tous rendus à la même position les uns au dessus des autres.

L'instanciation n'est pas supporté par certains GPU anciens, qui ne sont pas capable d'utiliser OpenGL ES 2 ou OpenGL 2. Veuillez utiliiser love.graphics.getSupported pour le vérifier.

Fonction

Synopsis

love.graphics.drawInstanced( mesh, instancecount, x, y, r, sx, sy, ox, oy, kx, ky )

Arguments

Mesh (Français) mesh
Maillage à rendre.
number (Français) instancecount
Nombre d'instances à rendre.
number (Français) x (0)
Position à laquelle les instances doivent être tracées (axe des x).
number (Français) y (0)
Position à laquelle les instances doivent être tracées (axe des y).
number (Français) r (0)
Orientation (radians).
number (Français) sx (1)
Facteur d'échelle (axe des x).
number (Français) sy (sx)
Facteur d'échelle (axe des y).
number (Français) ox (0)
Décalage de l'origine (axe des x).
number (Français) oy (0)
Décalage de l'origine (axe des y).
number (Français) kx (0)
Facteur de déformation (axe des x).
number (Français) ky (0)
Facteur de déformation (axe des y).

Retourne

Rien.

Fonction

Synopsis

love.graphics.drawInstanced( mesh, instancecount, transform )

Arguments

Mesh (Français) mesh
Maillage à rendre.
number (Français) instancecount
Nombre d'instances à rendre.
Transform (Français) transform
Un objet de transformation (transform).

Retourne

Rien.

Exemples

Utiliser l'instanciation d'attributs de vecteurs pour tracer plusieurs triangles en un unique appel de tracé

-- Un simple petit triangle avec la position par défaut, les coordonnées de texture, et les attributs de couleur de vecteur.
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")

-- Positions uniques pour chaque instance qui sera rendu.
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

-- Crée un maillage contenant les données de positions par instance.
-- Il ne sera pas tracé directement, mais il sera référencé par le maillage de triangles.
local instancemesh = love.graphics.newMesh({{"InstancePosition", "float", 2}}, instancepositions, nil, "static")

-- Lorsque le maillage de triangles est rendu, l'ombrage de vecteur y mettra une valeur différente
--  de l'attribut InstancePosition (position de l'instance) pour chaque instance, plutôt que pour chaque vecteur.
mesh:attachAttribute("InstancePosition", instancemesh, "perinstance")

-- Ombrage de vecteur utilisant l'attribut de vecteur 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)

	-- Trace le maillage de plusieurs fois en un seul appel, en utilisant l'instanciation.
	local instancecount = #instancepositions
	love.graphics.drawInstanced(mesh, instancecount, 0, 0)
end

Voir également


Autres langues