最小PBR(GGX・直射)— 冒頭解説
このシェーダは、球1個をレイトレし、GGXベースの最小PBRで直射1灯の見え方を計算します。まずカメラからのレイと球の交差を求め、ヒット点の法線 N、視線 V、光線 L を作ります。鏡面はマイクロファセットBRDFで、法線分布は GGX、幾何項 G は Smith の Schlick‑GGX 近似($k=((r+1)^2)/8$)、フレネル F は Schlick 近似を用います。
$$
F(\theta)=F_0 + (1-F_0)(1-\cos\theta)^5
$$
粗さ $r$ から $\alpha=r^2$ とし、NDF は次式です。
$$
D=\frac{\alpha^2}{\pi\,\big((\mathbf{N}\!\cdot\!\mathbf{H})^2(\alpha^2-1)+1\big)^2}
$$
エネルギー保存のため拡散は
$$
k_d=(1-F)(1-\text{metallic}),\qquad
f_{\mathrm{diff}}=k_d\,\frac{\text{albedo}}{\pi}
$$
とし、金属(metallic=1)では拡散が消えます。最終輝度は
$$
L_o=(f_{\mathrm{diff}}+f_{\mathrm{spec}})\,(\mathbf{N}\!\cdot\!\mathbf{L})\,L_i
$$
を一灯ぶん評価し、わずかな環境色を加えてガンマ補正($1/2.2$)で表示します。パラメータは Blender の Principled と整合し、Base Color→albedo、Metallic、Roughness が同義です。短いコードと基本式だけで「金属らしさ」や「粗さによるハイライトの広がり」を再現でき、さらに IBL、影、ACES トーンマップを加えると実写感が一段と高まります。
https://www.shadertoy.com/view/3cScDD