Difference between revisions of "love.graphics.setStencil (日本語)"

m
m (画像へステンシルのマスクを使用する)
 
(One intermediate revision by the same user not shown)
Line 66: Line 66:
 
=== 画像へステンシルのマスクを使用する ===
 
=== 画像へステンシルのマスクを使用する ===
 
<source lang="lua">
 
<source lang="lua">
-- 白と黒で画像をマスク: 黒ピクセルはマスクされますが、白ピクセルはそのまま通り抜けます。
+
-- 白と黒で画像をマスク: 黒ピクセルはマスクされますが、白ピクセルマスクされません。
 
local mask = love.graphics.newImage("mymask.png")
 
local mask = love.graphics.newImage("mymask.png")
  
Line 72: Line 72:
 
   vec4 effect (vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) {
 
   vec4 effect (vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) {
 
       if (Texel(texture, texture_coords).rgb == vec3(0.0)) {
 
       if (Texel(texture, texture_coords).rgb == vec3(0.0)) {
         // a discarded pixel wont be applied as the stencil.
+
         // 破棄されたピクセルはステンシルとして適用されません。
 
         discard;
 
         discard;
 
       }
 
       }

Latest revision as of 04:42, 26 September 2016

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()

関連




そのほかの言語