love.graphics.setStencil (日本語)

LÖVE 0.8.0 まで使用可能でしたが LÖVE 0.10.0 で廃止されました
love.graphics.stencil および love.graphics.setStencilTest へ移行。

描画操作に対してステンシルの定義または解放します。

関数が渡されると透明および不透明なピクセルのある画像を作成して、画面ではなくステンシルへ描画します。有効である間は、ピクセルを描画または廃棄するか判断するために使用されます。画像の内容はステンシルへ直接影響しないため、それに関するワークアラウンド(解決方法)に関しては下記を参照してください。

引数なしで関数を呼ぶと有効なステンシルを解放します。

関数

概要

love.graphics.setStencil( stencilFunction )

引数

function stencilFunction
ステンシルを描画する関数。

返値

ありません。

関数

有効なステンシルを解放します。

概要

love.graphics.setStencil( )

引数

なし。

返値

ありません。

用例

長方形でマスクしてから円を描画します

myStencilFunction = function()
   love.graphics.rectangle("fill", 225, 200, 350, 300)
end
 
love.graphics.setStencil(myStencilFunction)
 
love.graphics.setColor(255, 0, 0, 120)
love.graphics.circle("fill", 300, 300, 150, 50)
love.graphics.setColor(0, 255, 0, 120)
love.graphics.circle("fill", 500, 300, 150, 50)
love.graphics.setColor(0, 0, 255, 120)
love.graphics.circle("fill", 400, 400, 150, 50)

穴が開いた円を描画します

myStencilFunction = function()
   love.graphics.circle("fill", 400, 300, 50)
end
 
love.graphics.setInvertedStencil(myStencilFunction)
love.graphics.circle("fill", 400, 300, 150)

マスクされた二つの三角形を別々の色で描画します

myStencilFunction = function()
   love.graphics.circle("fill", 400, 300, 60, 25)
end
 
love.graphics.setStencil(myStencilFunction)
love.graphics.setColor(155, 0, 128)
love.graphics.polygon("fill", 400, 200, 486, 350, 314, 350)
 
 
love.graphics.setInvertedStencil(myStencilFunction)
love.graphics.setColor(144, 214, 128)
love.graphics.polygon("fill", 400, 200, 486, 350, 314, 350)

画像へステンシルのマスクを使用する

-- 白と黒で画像をマスク: 黒ピクセルはマスクされますが、白ピクセルマスクされません。
local mask = love.graphics.newImage("mymask.png")
 
local mask_effect = love.graphics.newShader[[
   vec4 effect (vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) {
      if (Texel(texture, texture_coords).rgb == vec3(0.0)) {
         // 破棄されたピクセルはステンシルとして適用されません。
         discard;
      }
      return vec4(1.0);
   }
]]
 
function myStencilFunction()
   love.graphics.setShader(mask_effect)
   love.graphics.draw(mask, 0, 0)
   love.graphics.setShader()
end
 
love.graphics.setStencil(myStencilFunction)
love.graphics.rectangle("fill", 0, 0, 256, 256)
love.graphics.setStencil()

関連




そのほかの言語