Spec-Zone.ru › LÖVE

love.graphics.drawInstanced

Доступно начиная с LÖVE 11.0
Эта функция не поддерживается в более ранних версиях.

Отрисовывает множество экземпляров сетки с помощью одного вызова отрисовки, используя аппаратное геометрическое инстанцирование.

Каждый экземпляр может иметь уникальные свойства (позиции, цвета и т.д.), но по умолчанию это не так, если не используется пользовательская тень вместе с атрибутами вершин для каждого экземпляра или love_InstanceID переменной GLSL 3 шейдера переменная шейдера, в противном случае все они будут отрисованы в одной и той же позиции друг поверх друга.

Инстанцирование не поддерживается некоторыми более старыми графическими процессорами, которые способны использовать только OpenGL ES 2 или OpenGL 2. Используйте 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)
Коэффициент масштабирования (ось Y).
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
Объект преобразования.

Возвращаемое значение

Ничего.

Примеры

Использование инстанцирования атрибутов вершин для отрисовки многих треугольников в одном вызове отрисовки

-- A simple small triangle with the default position, texture coordinate, and color vertex attributes.
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")
 
-- Unique positions for each instance that will be rendered.
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
 
-- Create a mesh containing the per-instance position data.
-- It won't be drawn directly, but it will be referenced by the triangle's mesh.
local instancemesh = love.graphics.newMesh({{"InstancePosition", "float", 2}}, instancepositions, nil, "static")
 
-- When the triangle's mesh is rendered, the vertex shader will pull in a different
-- value of the InstancePosition attribute for each instance, instead of for each vertex.
mesh:attachAttribute("InstancePosition", instancemesh, "perinstance")
 
-- Vertex shader which uses the InstancePosition vertex attribute.
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)
 
	-- Draw the mesh many times in one draw call, using instancing.
	local instancecount = #instancepositions
	love.graphics.drawInstanced(mesh, instancecount, 0, 0)
end

См. также

  • love.graphics
  • Сетка
  • Mesh:attachAttribute
  • love.graphics.newShader
  • Возможность графики


© 2006–2020 LÖVE Development Team
Licensed under the GNU Free Documentation License, Version 1.3.
https://love2d.org/wiki/love.graphics.drawInstanced

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API