本日は昨日に引き続き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の色を出力色として使用できるようになりました。

本日は以上です