love.graphics.stencil (Français)

Disponible depuis LÖVE 0.10.0
Together with love.graphics.setStencilTest (Français), it has replaced love.graphics.setStencil (Français).

Trace des formes géométriques comme un stencil.

Les formes géométriques tracées par la fonction définie, règle les valeurs invisible du stencil des pixels, au lieu de régler les couleurs des pixels. Le tampon de stencil (qui contient ces valeurs de stencil) peut agir comme un masque / stencil — love.graphics.setStencilTest (Français) peut être utilisé ensuite afin de déterminer la façon dont d'évantage de rendu sera affecté par les valeurs du stencil pour chaque pixel.

Les valeurs de stencil sont des entiers compris dans l'étendue [0, 255].


O.png À partir de la version 11.0, un tampon de stencil doit être réglé ou demandé par love.graphics.setCanvas (Français) lorsque les stencils sont utilisés avec un Canvas. love.graphics.setCanvas{canvas, stencil=true} est une méthode simple pour utiliser un tampon de stencil temporaire fourni automatiquement dans ce cas.  


Fonction

Synopsis

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

Arguments

function (Français) stencilfunction
Fonction qui trace les formes géométriques. Les valeurs de pixels du stencil, plutôt que les couleurs de chaque pixel, seront affecté par les formes géométriques.
StencilAction (Français) action ("replace")
Comment modifier les valeurs des pixels du stencil qui sont affectés par ce qui est tracé dans la fonction de stencil.
number (Français) value (1)
La nouvelle valeur de stencil à utiliser pour les pixels si l'action de stencil « replace » (remplace) est utilisée. N'a acuun effet avec les autres actions de stencil. Doit être compris entre 0 et 255.
boolean (Français) keepvalues (false)
True (vrai) pour préserver les anciennes valeurs de pixels du stencil, false (faux) pour re-régler les valeurs de chaque pixels du stencil à 0 avant d'exécuter la fonction stencil. love.graphics.clear (Français) re-réglera également toutes els valeurs du stencil.

Retourne

Rien.

Notes

Il est possible de tracer à l'écran et dans les valeurs de stencil des pixels au même moment, en utilisant la fonction love.graphics.setColorMask (Français) dans la fonction de stencil pour activer le traçage sur tous les composants couleurs.

Exemples

Tracer des cercles masqués par un rectangle

local function myStencilFunction()
   love.graphics.rectangle("fill", 225, 200, 350, 300)
end

function love.draw()
    -- trace un rectangle comme un stencil. Chaque pixel touché par le rectangle aura sa valeur de stencil réglée à 1. Le reste à 0.
    love.graphics.stencil(myStencilFunction, "replace", 1)

   -- Permet de ne faire du rendu que sur les pixels dont la valeur de stencil est plus grand que 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

Utiliser une Image comme un masque de stencil

-- une image de masque noir et blanc : Les pixels noirs masquerons, les blancs laisseront passer.
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)) {
         // Un pixel annulé ne sera pas appliqué au 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

Autorise le traçage partout, aux intersections de plusieurs cercles

local function myStencilFunction()
   -- Trace quatres cercles se superposant comme un 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()
   -- Chaque pixel touché par chaque cercle aura sa valeur de stencil incrémentée d'1.
   -- Les valeurs du stencil pour les pixels où les cercles se superposent seront au moins de 2.
   love.graphics.stencil(myStencilFunction, "increment")
 
   -- Permet uniquement le tracé dans les aires qui ont des valeurs de stencil inférieures à 2.
   love.graphics.setStencilTest("less", 2)
 
   -- Trace un grand rectangle.
   love.graphics.rectangle("fill", 0, 0, 500, 500)
 
   love.graphics.setStencilTest()
end

La page du wiki love.graphics.setStencilTest (Français) inclus d'avantage d'exemples.

Voir également


Autres langues