Spec-Zone.ru › LÖVE

love.graphics.stencil

Доступно с LÖVE 0.10.0
Вместе с love.graphics.setStencilTest, оно заменило love.graphics.setStencil.

Отображает геометрию как штамп.

Геометрия, нарисованная предоставленной функцией, устанавливает невидимые значения штампа пикселей, а не цвета пикселей. Буфер штампа (который содержит эти значения штампа) может действовать как маска/штамп — love.graphics.setStencilTest может быть использован позже для определения того, как дальнейшее рендеринг будет зависеть от значений штампа в каждом пикселе.

Значения штампа — целые числа в диапазоне [0, 255].


Начиная с версии 11.0, буфер штампа должен быть установлен или запрошен в love.graphics.setCanvas при использовании штампов с Canvas. love.graphics.setCanvas{canvas, stencil=true} — это простой способ использовать автоматически предоставленный временный буфер штампа в этом случае.

Функция

Описание

love.graphics.stencil( stencilfunction, action, value, keepvalues )

Аргументы

function stencilfunction
Функция, которая рисует геометрию. Значения штампа пикселей, а не цвет каждого пикселя, будут затронуты геометрией.
StencilAction action ("replace")
Как изменять любые значения штампа пикселей, которые затронуты тем, что нарисовано в функции штампа.
number value (1)
Новое значение штампа для использования для пикселей, если используется действие штампа "замена". Не оказывает влияния на другие действия штампа. Должно быть между 0 и 255.
boolean keepvalues (false)
True для сохранения старых значений штампа пикселей, false для сброса значения штампа каждого пикселя до 0 перед выполнением функции штампа. love.graphics.clear также сбросит все значения штампа.

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

Ничего.

Примечания

Возможна одновременная отрисовка на экран и значения штампов пикселей, используя love.graphics.setColorMask внутри функции штампа для включения отрисовки всех цветовых компонентов.

Примеры

Рисование окружностей, замаскированных прямоугольником

local function myStencilFunction()
   love.graphics.rectangle("fill", 225, 200, 350, 300)
end
 
function love.draw()
    -- draw a rectangle as a stencil. Each pixel touched by the rectangle will have its stencil value set to 1. The rest will be 0.
    love.graphics.stencil(myStencilFunction, "replace", 1)
 
   -- Only allow rendering on pixels which have a stencil value greater than 0.
    love.graphics.setStencilTest("greater", 0)
 
    love.graphics.setColor(1, 0, 0, 0.45)
    love.graphics.circle("fill", 300, 300, 150, 50)
 
    love.graphics.setColor(0, 1, 0, 0.45)
    love.graphics.circle("fill", 500, 300, 150, 50)
 
    love.graphics.setColor(0, 0, 1, 0.45)
    love.graphics.circle("fill", 400, 400, 150, 50)
 
    love.graphics.setStencilTest()
end

Использование изображения в качестве маски штампа

-- a black/white mask image: black pixels will mask, white pixels will pass.
local mask = love.graphics.newImage("mymask.png")
 
local mask_shader = love.graphics.newShader[[
   vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) {
      if (Texel(texture, texture_coords).rgb == vec3(0.0)) {
         // a discarded pixel wont be applied as the stencil.
         discard;
      }
      return vec4(1.0);
   }
]]
 
local function myStencilFunction()
   love.graphics.setShader(mask_shader)
   love.graphics.draw(mask, 0, 0)
   love.graphics.setShader()
end
 
function love.draw()
    love.graphics.stencil(myStencilFunction, "replace", 1)
    love.graphics.setStencilTest("greater", 0)
    love.graphics.rectangle("fill", 0, 0, 256, 256)
    love.graphics.setStencilTest()
end

Разрешить отрисовку везде, кроме пересечений нескольких окружностей

local function myStencilFunction()
   -- Draw four overlapping circles as a stencil.
   love.graphics.circle("fill", 200, 250, 100)
   love.graphics.circle("fill", 300, 250, 100)
   love.graphics.circle("fill", 250, 200, 100)
   love.graphics.circle("fill", 250, 300, 100)
end
 
function love.draw()
   -- Each pixel touched by each circle will have its stencil value incremented by 1.
   -- The stencil values for pixels where the circles overlap will be at least 2.
   love.graphics.stencil(myStencilFunction, "increment")
 
   -- Only allow drawing in areas which have stencil values that are less than 2.
   love.graphics.setStencilTest("less", 2)
 
   -- Draw a big rectangle.
   love.graphics.rectangle("fill", 0, 0, 500, 500)
 
   love.graphics.setStencilTest()
end

Страница вики love.graphics.setStencilTest содержит дополнительные примеры.

См. также

  • love.graphics
  • love.graphics.setStencilTest
  • love.graphics.clear


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

Spec-Zone.ru

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