Primer 03 — Materials & Shaders
面の見え方はプログラムで決まる / How surfaces get their color

マテリアルと
シェーダー

同じ形の球でも、金属に見えたりゴムに見えたりします。その差を決めているのがマテリアル(材質のレシピ)と、それをGPU上で実行して1ピクセルずつ色を計算するシェーダー(小さなプログラム)です。まず球を金属からマットまで動かして、「どのパラメータが何を変えるのか」を手で確かめましょう。

Shader PBR Metallic / Roughness Material Graph
まず用語だけ — 読む前の30秒
マテリアル material
面の見え方を決めるレシピ。色・金属らしさ・粗さなどの入力の集まり。
シェーダー shader
GPUで走る小さなプログラム。レシピを使い1ピクセルの色を計算する。
PBR physically based
光の反射を物理っぽく扱う流儀。UEの標準的なマテリアルの土台。
メタリック metallic
金属か否か(0〜1)。金属は色を反射光に持ち、拡散光を失う。
ラフネス roughness
表面の粗さ(0〜1)。小さいほど鏡のように鋭いハイライト。
ベースカラー base color
素の色(アルベド)。金属ではこれが反射の色味になる。
※ 各語の詳しい定義は、ページ末尾の用語集にもあります。

§1 — Recipe vs Program

マテリアルは「レシピ」、シェーダーは「調理」

言葉が紛らわしいので先に整理します。マテリアルは「この面は赤くて・金属で・少しザラつく」といった入力値の束シェーダーはその束を受け取り、光の向きやカメラの向きと合わせて「このピクセルは結局どんな色か」を計算する手続きです。UEではマテリアルをノードで組むと、その裏で対応するシェーダーコード(HLSL)が自動生成されコンパイルされます。

MATERIAL / レシピ
何を、どんな質感で
Base Color・Metallic・Roughness・Normal・Emissive… という入力の集まり。アーティストがノードで組む部分。数値でもテクスチャでもよい。
SHADER / 調理
どう光らせるか
レシピと光・カメラから最終色を計算するGPUプログラム。頂点シェーダー(位置)とピクセルシェーダー(色)に分かれて走る。

§2 — The two stages

シェーダーは2段構え

1つのメッシュを描くとき、GPUはまず頂点シェーダーで各頂点を画面上のどこに置くか計算し、次にその三角形を塗るためにピクセルシェーダー(フラグメントシェーダー)を画面に映る全ピクセルぶん走らせて色を決めます。ピクセルシェーダーは呼ばれる回数が桁違いに多いので、ここが重いとすぐ描画コストに響きます。

stage 1
頂点シェーダー
頂点ごとに1回。3D座標→画面座標へ変換。数千〜数万回。
rasterize
ラスタライズ
三角形を、覆う画面ピクセルの集合へ分解する(GPU固定機能)。
stage 2
ピクセルシェーダー
映るピクセルごとに1回。ここでマテリアルと光から最終色を計算。数百万回。

前回の Primer 01 で見たレンダースレッドは、この一連の命令をGPUに積む係でした。実際に絵を作る計算は、こうしてGPUの中のシェーダーが担います。


§3 — Playground

触って分かる PBR ── 金属から粘土まで

下の球は、あなたが動かした値でその場でライティングを計算して描いています(本物のピクセルシェーダーと同じ考え方)。メタリックを上げると拡散色が消えてハイライトに色が乗り金属に、ラフネスを上げるとハイライトがボケてマットになります。

ベースカラー base color
プリセット:

この球は拡散反射(Lambert)+鏡面反射(粗さで鋭さが変わるハイライト)+弱い環境光を、ピクセルごとに合成しているだけの簡易モデルです。UEの本物はこれに反射プローブ・影・多光源などが加わりますが、metallic と roughness で質感が決まるという骨格は同じです。


§4 — Material Graph

UEのマテリアルはノードで組む

UEではコードを書かず、ノードを線でつなぐことでマテリアルを作ります。左からテクスチャや数値が流れ、最終的に右端のメインノードの各入力(Base Color / Metallic / Roughness / Normal …)に接続する ── これがそのままシェーダーコードに変換されます。下は最小の例です。

Texture Sample
アルベド画像
Scalar
Roughness = 0.4
Texture Sample
法線マップ
Material · メインノード
Base Color
Metallic
Roughness
Normal
Emissive

同じマテリアルから色や数値だけ変えたマテリアルインスタンス(Material Instance)を大量に作れます。インスタンスはシェーダーを共有するので、再コンパイル不要で軽い ── 量産の基本テクニックです。


§5 — In UE

UEでの実際 ── コンパイルと順列

マテリアルを保存すると、UEは対応するシェーダーをコンパイルします。初回や大量変更のとき「Compiling Shaders 3000…」と出るのはこれ。厄介なのがシェーダー順列(permutation)で、機能の組み合わせ(影あり/なし、ライトの種類…)ごとに別バリアントが要るため、数が膨らみます。

Material Instance
親を1回だけ焼く
色・数値はインスタンスで振る。シェーダーは親と共有され再コンパイル不要。量産の基本。
Shading Model
肌・布・髪…
Default Lit 以外に Subsurface / Cloth など専用モデル。選ぶと使うシェーダー式が変わる。
Instruction Count
命令数=重さ
エディタ上部に出る命令数の目安。ノードが増えるほど1ピクセルの計算が重くなる。

確認のヒント:マテリアルエディタの Stats パネルで命令数、Platform Stats で対象機の負荷。重いと感じたらノード数と使っているテクスチャ枚数をまず疑います。次の Primer 04 では、この計算結果をどう画面に組み上げるか(描画パス)を見ます。


Glossary — 用語

よく出る言葉