Difference between revisions of "love.graphics.setStencilTest"

m
m
(5 intermediate revisions by the same user not shown)
Line 2: Line 2:
 
Configures or disables stencil testing.
 
Configures or disables stencil testing.
  
When stencil testing is enabled, the geometry of everything that is drawn afterward will be clipped / stencilled out based on the arguments of this function compared with the stencil value of each pixel that the geometry touches. The stencil values of pixels are affected via [[love.graphics.stencil]].
+
When stencil testing is enabled, the geometry of everything that is drawn afterward will be clipped / stencilled out based on a comparison between the arguments of this function and the stencil value of each pixel that the geometry touches. The stencil values of pixels are affected via [[love.graphics.stencil]].
  
Each [[Canvas]] has its own per-pixel stencil values.
+
 
 +
{{notice|1=Starting with version [[11.0]], a stencil buffer must be set or requested in [[love.graphics.setCanvas]] when using stencils with a Canvas. <code>love.graphics.setCanvas{canvas, stencil=true}</code> is an easy way to use an automatically provided temporary stencil buffer in that case.}}
 
== Function ==
 
== Function ==
 
=== Synopsis ===
 
=== Synopsis ===
Line 38: Line 39:
 
     love.graphics.stencil(myStencilFunction, "replace", 1)
 
     love.graphics.stencil(myStencilFunction, "replace", 1)
  
     -- enable testing against the stencil value of each pixel.
+
     -- Only allow rendering on pixels whose stencil value is greater than 0.
 
     love.graphics.setStencilTest("greater", 0)
 
     love.graphics.setStencilTest("greater", 0)
  
     love.graphics.setColor(255, 0, 0, 120)
+
     love.graphics.setColor(1, 0, 0, 0.45)
 
     love.graphics.circle("fill", 300, 300, 150, 50)
 
     love.graphics.circle("fill", 300, 300, 150, 50)
  
     love.graphics.setColor(0, 255, 0, 120)
+
     love.graphics.setColor(0, 255, 0, 0.45)
 
     love.graphics.circle("fill", 500, 300, 150, 50)
 
     love.graphics.circle("fill", 500, 300, 150, 50)
  
     love.graphics.setColor(0, 0, 255, 120)
+
     love.graphics.setColor(0, 0, 255, 0.45)
 
     love.graphics.circle("fill", 400, 400, 150, 50)
 
     love.graphics.circle("fill", 400, 400, 150, 50)
  
Line 53: Line 54:
 
end
 
end
 
</source>
 
</source>
 +
 
=== Drawing a circle with a hole ===
 
=== Drawing a circle with a hole ===
 
<source lang="lua">
 
<source lang="lua">
Line 65: Line 67:
  
 
   -- Configure the stencil test to only allow rendering on pixels whose stencil value is equal to 0.
 
   -- Configure the stencil test to only allow rendering on pixels whose stencil value is equal to 0.
 +
  -- This will end up being every pixel *except* ones that were touched by the circle drawn as a stencil.
 
   love.graphics.setStencilTest("equal", 0)
 
   love.graphics.setStencilTest("equal", 0)
 
   love.graphics.circle("fill", 400, 300, 150)
 
   love.graphics.circle("fill", 400, 300, 150)
Line 70: Line 73:
 
end
 
end
 
</source>
 
</source>
 +
 
=== Drawing two masked triangles with different colors ===
 
=== Drawing two masked triangles with different colors ===
 
<source lang="lua">
 
<source lang="lua">
Line 82: Line 86:
 
   -- Only allow rendering on pixels whose stencil value is greater than 0.
 
   -- Only allow rendering on pixels whose stencil value is greater than 0.
 
   love.graphics.setStencilTest("greater", 0)
 
   love.graphics.setStencilTest("greater", 0)
   love.graphics.setColor(155, 0, 128)
+
   love.graphics.setColor(0.6, 0, 0.5)
 
   love.graphics.polygon("fill", 400, 200, 486, 350, 314, 350)
 
   love.graphics.polygon("fill", 400, 200, 486, 350, 314, 350)
 
   
 
   
 
   -- Now only allow rendering on pixels whose stencil value is equal to 0.
 
   -- Now only allow rendering on pixels whose stencil value is equal to 0.
 
   love.graphics.setStencilTest("equal", 0)
 
   love.graphics.setStencilTest("equal", 0)
   love.graphics.setColor(144, 214, 128)
+
   love.graphics.setColor(0.55, 0.85, 0.5)
 
   love.graphics.polygon("fill", 400, 200, 486, 350, 314, 350)
 
   love.graphics.polygon("fill", 400, 200, 486, 350, 314, 350)
  

Revision as of 00:10, 4 April 2018

Available since LÖVE 0.10.0
Together with love.graphics.stencil, it has replaced love.graphics.setStencil.

Configures or disables stencil testing.

When stencil testing is enabled, the geometry of everything that is drawn afterward will be clipped / stencilled out based on a comparison between the arguments of this function and the stencil value of each pixel that the geometry touches. The stencil values of pixels are affected via love.graphics.stencil.


O.png Starting with version 11.0, a stencil buffer must be set or requested in love.graphics.setCanvas when using stencils with a Canvas. love.graphics.setCanvas{canvas, stencil=true} is an easy way to use an automatically provided temporary stencil buffer in that case.  


Function

Synopsis

love.graphics.setStencilTest( comparemode, comparevalue )

Arguments

CompareMode comparemode
The type of comparison to make for each pixel.
number comparevalue
The value to use when comparing with the stencil value of each pixel. Must be between 0 and 255.

Returns

Nothing.

Function

Disables stencil testing.

Synopsis

love.graphics.setStencilTest( )

Arguments

None.

Returns

Nothing.

Examples

Drawing circles masked by a rectangle

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 whose stencil value is 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, 255, 0, 0.45)
    love.graphics.circle("fill", 500, 300, 150, 50)

    love.graphics.setColor(0, 0, 255, 0.45)
    love.graphics.circle("fill", 400, 400, 150, 50)

    love.graphics.setStencilTest()
end

Drawing a circle with a hole

local function myStencilFunction()
   -- Draw a small circle as a stencil. This will be the hole.
   love.graphics.circle("fill", 400, 300, 50)
end

function love.draw()
   -- Each pixel touched by the circle will have its stencil value set to 1. The rest will be 0.
   love.graphics.stencil(myStencilFunction, "replace", 1)

   -- Configure the stencil test to only allow rendering on pixels whose stencil value is equal to 0.
   -- This will end up being every pixel *except* ones that were touched by the circle drawn as a stencil.
   love.graphics.setStencilTest("equal", 0)
   love.graphics.circle("fill", 400, 300, 150)
   love.graphics.setStencilTest()
end

Drawing two masked triangles with different colors

local function myStencilFunction()
   love.graphics.circle("fill", 400, 300, 60, 25)
end

function love.draw()
   -- Each pixel touched by the circle will have its stencil value set to 1. The rest will be 0.
   love.graphics.stencil(myStencilFunction, "replace", 1)

   -- Only allow rendering on pixels whose stencil value is greater than 0.
   love.graphics.setStencilTest("greater", 0)
   love.graphics.setColor(0.6, 0, 0.5)
   love.graphics.polygon("fill", 400, 200, 486, 350, 314, 350)
 
   -- Now only allow rendering on pixels whose stencil value is equal to 0.
   love.graphics.setStencilTest("equal", 0)
   love.graphics.setColor(0.55, 0.85, 0.5)
   love.graphics.polygon("fill", 400, 200, 486, 350, 314, 350)

   love.graphics.setStencilTest()
end

The love.graphics.stencil wiki page includes more examples.

See Also


Other Languages