読者です 読者をやめる 読者になる 読者になる

Unity Days

Unity や VR/AR に関することを書いていきたい。

Shader 勉強メモ 「サンプルを理解する」

今回はUnityドキュメントのサンプルを理解していきます。

Unity - マニュアル: シェーダー: 頂点とフラグメントプログラム

最初のサンプルはメッシュの法線情報を色情報に変換するシェーダーです。

f:id:Dmiyamo3:20170308142124p:plain

Shader "Tutorial/DisplayNormal"{
    SubShader{
    Pass{

        CGPROGRAM

        // バーテックスシェーダーとフラグメントシェーダーの関数宣言
        #pragma vertex vert
        #pragma fragment frag

        // 内臓のシェーダーincludeファイル
        // UnityCG.cginc はビルトインシェーダーヘルパー機能
        // UnityCG.cginc は例えば以下のデータ構造を持つ
        // struct appdata_base:位置/法線/テクスチャ座標/頂点シェーダー入力
        // また、UnityObjectToClipPos()などが使えるようになる
        #include "UnityCG.cginc"

        // v2f:vertex to fragment
        // 頂点プログラムからフラグメントプログラムに渡される情報を定義します
        struct v2f {
            float4 pos : SV_POSITION;
            fixed3 color : COLOR0;
        };

        v2f vert(appdata_base v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex);
            o.color = v.normal * 0.5 + 0.5;
            return o;
        }

        fixed4 frag(v2f i) : SV_Target{
            return fixed4(i.color,1);
        }
        ENDCG
    }
    }
}

次のサンプルですが、一行だけ変えてMain ColorとTextureの色を足し合わせるようにしました。

f:id:Dmiyamo3:20170308150058p:plain f:id:Dmiyamo3:20170308150108p:plain

Shader "Tutorial/Textured Colored" {
    Properties{
        _Color("Main Color", Color) = (1,1,1,0.5)
        _MainTex("Texture", 2D) = "white" { }
    }
    SubShader{
    Pass{

    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag

    #include "UnityCG.cginc"

    fixed4 _Color;
    sampler2D _MainTex;

    struct v2f {
        float4 pos : SV_POSITION;
        float2 uv : TEXCOORD0;
    };

    float4 _MainTex_ST;

    v2f vert(appdata_base v)
    {
        v2f o;
        o.pos = UnityObjectToClipPos(v.vertex);
        // UnityCG.cgincからTRANSFORM_TEXマクロを使用して
        // テクスチャスケールとオフセットが正しく適用されていることを確認
        o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
        return o;
    }

    fixed4 frag(v2f i) : SV_Target
    {
        fixed4 texcol = tex2D(_MainTex, i.uv);
        return texcol + _Color;   //変更点
    }
    ENDCG

    }
    }
}

テクスチャにチェック模様を入れれば黒い部分だけ色がつくようにできたりします。

f:id:Dmiyamo3:20170308162129p:plain f:id:Dmiyamo3:20170308162136p:plain f:id:Dmiyamo3:20170308162154p:plain

次回は、 Unity - マニュアル: Vertex and fragment shader examples のサンプルを触っていこうと思います。

参考サイト:

dragon & teapot model : http://graphics.cs.williams.edu/data/meshes.xml#7

Unity - マニュアル: シェーダーリファレンス

Unity Shader のコミュニティ