同じ形の球でも、金属に見えたりゴムに見えたりします。その差を決めているのがマテリアル(材質のレシピ)と、それをGPU上で実行して1ピクセルずつ色を計算するシェーダー(小さなプログラム)です。まず球を金属からマットまで動かして、「どのパラメータが何を変えるのか」を手で確かめましょう。
言葉が紛らわしいので先に整理します。マテリアルは「この面は赤くて・金属で・少しザラつく」といった入力値の束。シェーダーはその束を受け取り、光の向きやカメラの向きと合わせて「このピクセルは結局どんな色か」を計算する手続きです。UEではマテリアルをノードで組むと、その裏で対応するシェーダーコード(HLSL)が自動生成されコンパイルされます。
1つのメッシュを描くとき、GPUはまず頂点シェーダーで各頂点を画面上のどこに置くか計算し、次にその三角形を塗るためにピクセルシェーダー(フラグメントシェーダー)を画面に映る全ピクセルぶん走らせて色を決めます。ピクセルシェーダーは呼ばれる回数が桁違いに多いので、ここが重いとすぐ描画コストに響きます。
前回の Primer 01 で見たレンダースレッドは、この一連の命令をGPUに積む係でした。実際に絵を作る計算は、こうしてGPUの中のシェーダーが担います。
下の球は、あなたが動かした値でその場でライティングを計算して描いています(本物のピクセルシェーダーと同じ考え方)。メタリックを上げると拡散色が消えてハイライトに色が乗り金属に、ラフネスを上げるとハイライトがボケてマットになります。
この球は拡散反射(Lambert)+鏡面反射(粗さで鋭さが変わるハイライト)+弱い環境光を、ピクセルごとに合成しているだけの簡易モデルです。UEの本物はこれに反射プローブ・影・多光源などが加わりますが、metallic と roughness で質感が決まるという骨格は同じです。
UEではコードを書かず、ノードを線でつなぐことでマテリアルを作ります。左からテクスチャや数値が流れ、最終的に右端のメインノードの各入力(Base Color / Metallic / Roughness / Normal …)に接続する ── これがそのままシェーダーコードに変換されます。下は最小の例です。
同じマテリアルから色や数値だけ変えたマテリアルインスタンス(Material Instance)を大量に作れます。インスタンスはシェーダーを共有するので、再コンパイル不要で軽い ── 量産の基本テクニックです。
マテリアルを保存すると、UEは対応するシェーダーをコンパイルします。初回や大量変更のとき「Compiling Shaders 3000…」と出るのはこれ。厄介なのがシェーダー順列(permutation)で、機能の組み合わせ(影あり/なし、ライトの種類…)ごとに別バリアントが要るため、数が膨らみます。
確認のヒント:マテリアルエディタの Stats パネルで命令数、Platform Stats で対象機の負荷。重いと感じたらノード数と使っているテクスチャ枚数をまず疑います。次の Primer 04 では、この計算結果をどう画面に組み上げるか(描画パス)を見ます。