メタリック
Metallic別名:金属度、メタルネス
概要
マテリアルが金属かどうかを表す値。金属(1)は拡散色を持たず、映り込みにベースカラーの色が付く。非金属(0)は、ベースカラーの拡散色の上に、色の付かない弱い映り込みが乗る。
デモ
使われる場面
物理ベースのマテリアル設定
ラフネスと並ぶ基本の値である。ベースカラー、メタリック、ラフネスの三つで、多くの素材を表せる。
金属と塗装の描き分け
金色の金属と、金色に塗ったプラスチックは、同じベースカラーでもメタリックの値だけで見分けが付く。
メタリックマップ
塗装が剥げて下の金属が見える箇所や、錆びた鉄と地金の境目のように、一つの物体の中で金属と非金属が混ざる箇所を、白黒のテクスチャで塗り分ける。
判断基準
| こういうとき | こうする |
|---|---|
| 鉄、金、銅、アルミのような金属 | 1 にする。金属の色は映り込みの色として、ベースカラーに設定する。 |
| プラスチック、木、石、布、肌、塗装面など、金属以外の素材 | 0 にする。つやの違いはラフネスで付ける。 |
| 0 と 1 の中間の値を使いたくなった | 現実の素材はほぼどちらかなので、中間は避ける。中間を使うのは、錆や塗装の剥げの境目のように、金属と非金属が 1 画素の中で混ざる箇所に限る。 |
| 金属が黒っぽい、つやのない暗い塊に見える | 映り込む環境がない。金属は周りを映すことで見えるので、環境光(環境マップや周りの明るい物)を用意する。 |
| 金属がくすんで、鈍い色に見える | 金属のベースカラーは映り込みの強さそのものなので、明るめにする。sRGB の値でおおよそ 0.7 以上が目安。 |
こう見えたら
指示の例
金色の部分がプラスチックのように見える。メタリックを 1 にして、ラフネスは 0.3 くらいにして
金属のパーツが黒くつぶれて見える。金属は周りを映して見えるので、環境光(環境マップ)を足して
メタリックが 0.5 のような中間の値になっている素材がある。金属なら 1、金属以外なら 0 にそろえて
塗装が剥げた部分だけ金属に見せたい。メタリックマップを使って、剥げた部分だけを 1 にして
詳細
金属と非金属で、光の返し方が違う
光が物体に当たると、一部は表面で反射し(鏡面反射)、残りは中へ入る。非金属では、中に入った光が内部で散乱しながら一部の色を吸収され、四方へ出てくる。これが拡散反射で、物体の色(ベースカラー)として見える。表面での反射は、正面から見ると 4% 程度と弱く、色も付かない。
金属では、中に入った光はすぐに吸収されてしまうので、拡散反射がない。そのかわり表面で強く反射し、反射の強さが光の色(波長)によって違うので、映り込みに色が付く。金や銅の色は、この映り込みの色である。メタリックは、この二つの振る舞いのどちらで描くかを決める値である。
ベースカラーの意味が入れ替わる
物理ベースのシェーダーでは、ベースカラー とメタリック から、拡散色 と正面の反射率 を次のように決める。
なら、ベースカラーは拡散色になり、反射率は色のない 0.04 になる。 なら、拡散色は 0 になり、ベースカラーはそのまま反射率(映り込みの色)になる。同じベースカラーでも、メタリックによって「物体の色」になるか「映り込みの色」になるかが入れ替わる。
vec3 diffuseColor = baseColor * (1.0 - metallic); // 金属では 0
vec3 f0 = mix(vec3(0.04), baseColor, metallic); // 金属ではベースカラーが反射率になる
vec3 color = diffuseColor * diffuseLight + specularLight * fresnel(f0, cosTheta);
デモを「点光源だけ」にすると、左の非金属は色の付いた拡散反射の上に白いハイライトが乗る。右の金属は拡散反射がないので暗く沈み、ハイライトにだけベースカラーの色が付く。
中間の値と、見分け方
現実の素材は、ほぼ金属か非金属のどちらかである。中間の値は、二つの性質を半分ずつ持つ素材を表すわけではなく、薄く濁った不自然な見た目になりやすい。中間を使うのは、錆や塗装の剥げの境目のように、1 画素の中に金属と非金属が混ざる箇所に限られる。
金属かどうかは、映り込みの色で見分けられる。映り込みやハイライトが物体と同じ色に染まっていれば金属、白っぽい映り込みの下に物体の色が見えれば非金属である。金属は周りを映すことで見えるので、映るものがない暗い環境では黒い塊になる。金属が暗く沈んで見えるときは、メタリックの値よりも先に、映り込む環境の明るさを確かめる。