以前Unityでステンシルテストをやってみた記事の続きです。
前回はキューブ(メッシュの形)をマスクにしましたが、今回は任意のテクスチャを使ってマスク表現をしてみます。
こちらのアルファチャンネルを含んだ画像を使ってマスクやってみます。
試しにアルファブレンドしてステンシルを設定しても、
このようにメッシュの形(正方形)でマスクされてしまい、意図した表現にはなりません。
先に不要なピクセルを破棄する
解決策として、フラグメントシェーダ内で予めピクセルを破棄させ、該当するピクセルでステンシルテストが実行されないようにする方法が考えられます。
※ステンシルテストはスクリーンに描画される直前で行われる処理です。
ゲーム制作者になるための3Dグラフィックス技術より
fixed4 frag (v2f_img i) : SV_Target { fixed4 c = tex2D(_MainTex, i.uv); // 透明な部分のピクセルを破棄させてステンシルテストを実行しない clip(c.a - 0.1); return c; }
このようにフラグメントシェーダで不要なピクセル(透明なピクセル)を破棄することで、意図したマスクを作ることが出来ます。
今回のサンプルコードはコチラ
マスクする方のシェーダしかサンプルにはありませんが、マスクさせる方の処理についてはUnityステンシルを使ったマスク表現の記事を参考にして頂ければと思います。