ユニティちゃんでShader学習②、座標色シェーダー

ユニティちゃんでShader学習②、座標色シェーダー

ユニティちゃんで学習。座標を色に変換するUnity 3Dシェーダーの作り方。
スクリーン座標について。

関連ページ 参考URL
前回 はマテリアルに単色を代入するシェーダーを作りました。


今回はモデルの座標を無理やり色に変換するシェーダーを作っていきます。

テストに使う3Dモデル

3Dモデルは ユニティちゃんPackege UnityToonShader を使っていきます。
Unityちゃんパッケージ

スクリーン座標を色に変換するシェーダー

頂点シェーダーで受け取った座標を、ピクセルシェーダーで色に変換するコードを書いていきます。
実用的ではないですが、シェーダーの仕組みを知るのに割と便利です。
以下コード全文です。
Shader "Unlit/CoordinatesColor"
{
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            
//後述のComputeScreenPos関数に必要な宣言

            #include "UnityCG.cginc"
            
            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                
//スクリーン座標を保存してピクセルシェーダーに伝えるために追加

                float4 screenPos : TEXCOORD0;
            };

            
// 頂点シェーダー

            v2f vert (appdata v)
            {
                v2f o;
                
// ワールド座標をカメラを原点とする座標系に変換し、

                
// かつカメラの画角外の頂点を削ります

                o.vertex = UnityObjectToClipPos(v.vertex);
                
// クリップ座標を正規化してスクリーン座標に変換

                o.screenPos = ComputeScreenPos(o.vertex);
                return o;
            }

            
// ピクセルシェーダー

            fixed4 frag (v2f i) : SV_Target
            {
                
//座標情報を無理やり色に変換

                
//x軸をrに、y軸をgに、z軸をbに代入する

                return fixed4(i.screenPos.x, i.screenPos.y, i.screenPos.z, 1);
            }
            ENDCG
        }
    }
}

ユニティちゃんの服に使っているdef_matのシェーダーを、作成したシェーダーに変更します。 Unityちゃんの服のシェーダーの設定
シェーダーの変更

実装した結果は次のようなものになります。

スクリーン座標とは何か

Unityシェーダーで言うスクリーン座標とは、UnityC#でいうビューポート座標のことです。
カメラの画角の左下をx=0, y=0として、右上をx=1, y=1とする、正規化された座標の事を言います。
z軸はカメラを原点として、カメラの描画方向の奥に進むごとに値が増えていきます。

コードを少し解説

最初に、使いたい関数を使うのに必要なコンポーネントをincludeしています。
C#でいうusingと同じような処理です。
            
//後述のComputeScreenPos関数に必要な宣言

            #include "UnityCG.cginc"

出力頂点構造体の方にのみ、ピクセルシェーダーに渡す変数を追加しています。
                
//スクリーン座標を保存してピクセルシェーダーに伝えるために追加

                float4 screenPos : TEXCOORD0;
この変数には頂点シェーダー内でスクリーン座標を代入します。

下がその、実際にスクリーン座標を代入している処理です。
                
// クリップ座標を正規化してスクリーン座標に変換

                o.screenPos = ComputeScreenPos(o.vertex);

最後にスクリーン座標を無理やり色に変換して完成。
                
//座標情報を無理やり色に変換

                
//x軸をrに、y軸をgに、z軸をbに代入する

                return fixed4(i.screenPos.x, i.screenPos.y, i.screenPos.z, 1);
0
0