Difference between revisions of "Mesh:setInstanceCount"

m (draw 1000 triangles in different positions with a single draw call)
m (Examples)
Line 26: Line 26:
 
     {5, 5,  0,0},
 
     {5, 5,  0,0},
 
}
 
}
mesh = love.graphics.newMesh(vertices, nil, "triangles")
+
mesh = love.graphics.newMesh(vertices)
  
 
-- Set its instance count to 1000 when drawing it.
 
-- Set its instance count to 1000 when drawing it.

Revision as of 08:32, 12 February 2014

Available since LÖVE 0.9.1
This function is not supported in earlier versions.

Sets how many individual instances of this Mesh will be drawn at once. This will make use of graphics hardware to draw many copies of the Mesh far more efficiently than is possible by calling love.graphics.draw in a loop in Lua code.

O.png Currently, the only way to have different properties (position, color, ...) for each unique instance of the Mesh is to have a vertex shader which makes use of the built-in variable love_InstanceID. Because of this, instanced drawing of Meshes is a fairly advanced technique.  


Function

Synopsis

Mesh:setInstanceCount( count )

Arguments

number count
The number of individual instances of this Mesh that will be drawn with love.graphics.draw.

Returns

Nothing.

Notes

If love.graphics.isSupported("instancing") returns true, drawing tens or hundreds of thousands of instances at once will probably have very little performance impact. When it returns false this functionality will still work but it will use a slower fallback, in which case it's best to stick to instance counts of a couple thousand or lower.

Examples

draw 1000 triangles in different positions with a single draw call, using Mesh instancing

-- Create our mesh. It's just a single triangle.
local vertices = {
    {0, 0,  0,0},
    {10,0,  0,0},
    {5, 5,  0,0},
}
mesh = love.graphics.newMesh(vertices)

-- Set its instance count to 1000 when drawing it.
mesh:setInstanceCount(1000)

-- Create a vertex shader which will modify the triangle's position based on the current instance being drawn.
shader = love.graphics.newShader[[
// This is the standard function prototype for a vertex shader.
vec4 position(mat4 transform_projection, vec4 vertex_pos)
{
    // Add to the position based on the current Instance ID. Note that it's an integer variable.
    vertex_pos.x += mod(float(love_InstanceID) * 20.0, 800.0);
    vertex_pos.y += float(love_InstanceID * 20 / 800) * 20.0;

    // Do the standard transformation to return the modified vertex position in normalized screen-space.
    return transform_projection * vertex_pos;
}
]]

function love.draw()
    love.graphics.setShader(shader)

    -- Draw the triangle mesh 1000 times with a single call to love.graphics.draw.
    love.graphics.draw(mesh, 0, 0)

    love.graphics.setShader()
end

See Also

Other Languages