渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

Unity任意のテクスチャを使ったステンシルマスク



以前Unityでステンシルテストをやってみた記事の続きです。

前回はキューブ(メッシュの形)をマスクにしましたが、今回は任意のテクスチャを使ってマスク表現をしてみます。

f:id:esakun:20170526105705p:plain:w120
こちらのアルファチャンネルを含んだ画像を使ってマスクやってみます。

f:id:esakun:20170628101608g:plain
試しにアルファブレンドしてステンシルを設定しても、
このようにメッシュの形(正方形)でマスクされてしまい、意図した表現にはなりません。

先に不要なピクセルを破棄する

解決策として、フラグメントシェーダ内で予めピクセルを破棄させ、該当するピクセルでステンシルテストが実行されないようにする方法が考えられます。

※ステンシルテストはスクリーンに描画される直前で行われる処理です。
ゲーム制作者になるための3Dグラフィックス技術より

fixed4 frag (v2f_img i) : SV_Target
{
    fixed4 c = tex2D(_MainTex, i.uv);
    // 透明な部分のピクセルを破棄させてステンシルテストを実行しない
    clip(c.a - 0.1);
    return c;
}

このようにフラグメントシェーダで不要なピクセル(透明なピクセル)を破棄することで、意図したマスクを作ることが出来ます。

f:id:esakun:20170628103330g:plain

今回のサンプルコードはコチラ

マスクする方のシェーダしかサンプルにはありませんが、マスクさせる方の処理についてはUnityステンシルを使ったマスク表現の記事を参考にして頂ければと思います。