シェーダー入門したくないけど書いてみたい その3 プロパティ編
はじめに
この記事ではシェーダに関して入門することができません。とりえあずUnityでシェーダを書いて見たい人向けのブログです。
今回はプロパティを使ったシェーダを書いてみます。
事前準備
事前準備が済んでいない方は、第一回目の事前準備の項目を参考に事前準備を行ってください。
シェーダー入門したくないけど書いてみたい その1 - 波打際のブログさん
03.PepertyShader
`03.PropertyShader/PropertyShader.unity` を開いてみてください。開くと赤い箱が現れるので、ヒエラルキービューからCubeオブジェクトを選択し、マテリアルのプロパティを確認してみてください。すると次のように色の強さが調整できるようになっています。
色の強さを変更すると箱の色(赤色成分)が変化します。このシェーダは次の様に実装されています。
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修飾子は必須ではないので省略しても動作します。