【Unity】スペキュラーマップシェーダー

はじめに
下記のアセットの T_04 を利用して、解説しています。
https://assetstore.unity.com/packages/2d/textures-materials/metals/yughues-free-metal-materials-12949
スペキュラーマップとは
鏡面反射率が高い部分を白、鏡面反射しにくい部分を黒としたテクスチャのことです。
メタリックマップ や グロスマップ とも呼ばれます。
以下の画像は利用したアセットのスペキュラーマップの一部分です。

計算方法
uv座標を使ってスペキュラーマップをサンプリングします。サンプリングしたRGB値からR値だけ取り出し、スペキュラー値とかけます。
ただの鏡面反射と違い、R値が0だと鏡面反射をしないようにできます。(物質がもつ質感をより再現できる)
| パラメータ | 説明 |
| スペキュラーマップのR値 | |
| 反射ベクトル | |
| 視線ベクトル | |
| 法線ベクトル |
を求める計算式は【ShaderLab】鏡面反射を実装する の記事で紹介しています。
ShaderLabで実装する
環境
- Unity 2021.2.11f1
- Build-in Rendering Pipline
ここでは、スペキュラーマップを使った鏡面反射のみ実装します。
SpecularMap.shader
https://gist.github.com/went5/bf1117bd8fb451689ac80f82df17bdbb
スペキュラーマップからR値を取り出す
float specTex = tex2D(_SpecularTex, i.uv).r;
白黒でしか判断しないため、R値のみ取り出しています。
スペキュラーマップとスペキュラーをかけ合わせる
fixed3 specular = _LightColor0.rgb * specTex * pow(RdotV, _Shininess);
スペキュラーの計算に、 specTex (スペキュラーマップ)
をかける処理をいれることで、テクスチャによる反射を制御できます。例えば、黒だと
specTex は0になるため specular も0になります。
以上で、冒頭の画像を実装できます。
Table of contents