本日は昨日に引き続きShader枠です。
昨日に引き続き先日筆者の所属している会社で行ったShader勉強会の内容をまとめていきます。
〇独自シェーダーを書く 色を変える
ここからは実際に手を動かしながら学んでいきます。
前回まで解説していたUnityのUnlitシェーダーではテクスチャを貼り付けて色を付けることができます。
まずは色を変えていきましょう。
色はフラグメントシェーダーで4次元の値として記述されています。
fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv); // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return col; }
ここではcolにテクスチャを貼り付けて出力しています。
つまりcolが色情報になっています。 次のように書き換えてみます。
fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = fixed4(1,0,0,1); //変更 // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return col; }
赤色が出力されます。
第二成分(y)を1へ変更することで緑が出力されます。
fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = fixed4(0,1,0,1); //tex2D(_MainTex, i.uv); // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return col; }
第三成分(z)を1へ変更することで青が出力されます。
fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = fixed4(0,0,1,1); //tex2D(_MainTex, i.uv); // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return col; }
〇マテリアル側で色を変えれるようにする
さて、上記の例ではコード内に直接数値を入れて変化を学びました。
ここからはUnityのマテリアルのパラメータとして色を調整できるようにしていきます。
マテリアルのパラメータとして表に出すためにはShaderLabのPropertiesブロックに変数を定義します。
色の場合はcolorを定義します。
Properties { // _MainTex ("Texture", 2D) = "white" {} 今は使わないのでいったんコメントアウト _MainColor("Color" ,color) = (1,1,1,1) }
これによってマテリアル側にColorが表示されます。
このColorパラメータはマテリアル側でクリックすることでカラーパレットが表示されます。
この変数をHLSL内で使用するためにHLSL文の中に変数を定義します。
この際にPropertiesブロックで定義した変数と同じ変数を定義する必要があります。
struct appdata { ・・・ }; struct v2f { ・・・ }; float4 _MainColor;//追加 v2f vert (appdata v) { ・・・ } fixed4 frag (v2f i) : SV_Target { ・・・ return col; }
定義した変数をフラグメントシェーダー内で出力であるcolへ代入します。
fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = _MainColor; //tex2D(_MainTex, i.uv); // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return col; }
これによってマテリアルの変数Colorの色を出力色として使用できるようになりました。
本日は以上です