波打際のブログさん

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

シェーダー入門したくないけど書いてみたい その3 プロパティ編

はじめに

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

今回はプロパティを使ったシェーダを書いてみます。

事前準備

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

03.PepertyShader

 `03.PropertyShader/PropertyShader.unity` を開いてみてください。開くと赤い箱が現れるので、ヒエラルキービューからCubeオブジェクトを選択し、マテリアルのプロパティを確認してみてください。すると次のように色の強さが調整できるようになっています。

f:id:alfa-jpn:20150804234217p:plain

色の強さを変更すると箱の色(赤色成分)が変化します。このシェーダは次の様に実装されています。

Shader "ShaderLesson/03.PropertyShader/Question" {
    Properties {
        _Intensity("色の強さ", Float) = 1.0
    }

    SubShader {
        Pass {
	    Tags { "RenderType" = "Opaque" }
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
           
            uniform fixed _Intensity;

            float4 vert(float4 v:POSITION) : SV_POSITION {
                return mul (UNITY_MATRIX_MVP, v);
            }

            fixed4 frag() : SV_Target {
                return fixed4(_Intensity, 0, 0, 1.0);
            }
            ENDCG
        }
    }
}

このシェーダのポイント

 このシェーダのポイントは、プロパティブロックで任意の値をセットできること、その値をシェーダのCgコード内から参照することができることです。

Cgコードという言葉が突然出てきましたが、CGPROGRAM〜ENDCGで囲まれているC言語のようなプログラムのことです。

プロパティブロック

 シェーダに外部から任意の値を渡すときに使用します。数値や色、テクスチャ等をセットすることができます。このシェーダでは `_Intensity`という名前で浮動小数点数を受け渡しするためのプロパティを定義しています。

Cgコード内から参照

 プロパティの値はCgコード内に同名の変数を定義することで参照することができます。

uniform fixed _Intensity;

と変数を定義することで、_Intensityプロパティの値をCgコード内から参照できるようにしています。

先頭につけているuniform修飾子コンパイラに外部の値であることを通知していますが、Unityにおいてuniform修飾子は必須ではないので省略しても動作します。

演習

 プロパティシェーダを書き換えて、下記のように指定した色で箱をレンダリングできるシェーダを作ってください。
(演習問題の進め方は 第一回目の 事前準備->演習問題について を参照してください。)
f:id:alfa-jpn:20150804235402p:plain


今回はここまでです。
次回はテクスチャのマッピングについて解説と演習を行います。