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

波打際のブログさん

主に、プログラミング備忘録など。

シェーダー入門したくないけど書いてみたい その4 テクスチャ編

3D Unity シェーダ

はじめに

 この記事ではシェーダに関して入門することができません。とりえあずUnityでシェーダを書いて見たい人向けのブログです。

今回はテクスチャを利用したシェーダを書いてみます。

事前準備

 事前準備が済んでいない方は、第一回目の事前準備の項目を参考に事前準備を行ってください。
シェーダー入門したくないけど書いてみたい その1 - 波打際のブログさん

04.TextureShader

 `04.TextureShader/TextureShader.unity` を開いてみてください。開くと箱に世界の理(ことわり)がレンダリングされていると思います。
f:id:alfa-jpn:20150806005229p:plain

このシェーダは次のように実装されています。

Shader "ShaderLesson/04.TextureShader/Question" {
    Properties {
        _MainTex("テクスチャ", 2D) = "white" { }
    }

    SubShader {
        Pass {
            Tags { "RenderType" = "Opaque" }
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            
            uniform sampler2D _MainTex;
            uniform fixed4 _MainTex_ST;

            struct appdata {
                float4 vertex   : POSITION;
                float4 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 pos : SV_POSITION;
                float2 uv  : TEXCOORD0;
            };
        
            v2f vert (appdata v) {
                v2f o;
                o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                return o;
            }

            fixed4 frag(v2f v) : SV_Target {
                return tex2D(_MainTex, v.uv);
            }
            ENDCG
        }
    }
}

このシェーダのポイント

 このシェーダのポイントは、TRANSFORM_TEXマクロでテクスチャ用のUV座標を作成していること、tex2D関数でテクスチャのピクセルカラーを取得していることです。

TRANSFORM_TEXマクロ

 TRANSFORM_TEXマクロは `UnityCG.cginc` をインクルードすることで使えるUnityの便利マクロです。テクスチャに設定されたタイリングとオフセットを反映したUV座標(テクスチャ座標)を取得するためのマクロです。また、このマクロを利用するために `uniform fixed4 _MainTex_ST;` という一時変数を定義しています。

tex2D関数

 tex2D関数はUV座標(テクスチャ座標)を指定してテクスチャのピクセルカラーを取得することができます。今回はTRANSFORM_TEXマクロで取得したUV座標を指定して `_MainTex` のピクセルカラーを取得しています。

演習

 テクスチャシェーダを書き換えて、下記のように灰色の背景のテクスチャから黄色の背景の箱がレンダリングされるシェーダを作ってください。(ヒント: 赤+緑=黄色、つまり青色成分を出力しなければ・・・)
f:id:alfa-jpn:20150806011237p:plain


今回はここまでです。
次回は透過に対応したシェーダについて解説と演習を行います。