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


はじめに

下記のアセットの T_04 を利用して、解説しています。
https://assetstore.unity.com/packages/2d/textures-materials/metals/yughues-free-metal-materials-12949

スペキュラーマップとは

鏡面反射率が高い部分を白、鏡面反射しにくい部分を黒としたテクスチャのことです。
メタリックマップグロスマップ とも呼ばれます。
以下の画像は利用したアセットのスペキュラーマップの一部分です。

specular map example

計算方法

uv座標を使ってスペキュラーマップをサンプリングします。サンプリングしたRGB値からR値だけ取り出し、スペキュラー値とかけます。
ただの鏡面反射と違い、R値が0だと鏡面反射をしないようにできます。(物質がもつ質感をより再現できる)

C=r1(RV)nC = r_{1} (R \cdot V)^n

パラメータ 説明
r1r_1 スペキュラーマップのR値
RR 反射ベクトル
VV 視線ベクトル
NN 法線ベクトル

RR を求める計算式は【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


©️ 2026 went5. blog icon by

icons8