2025年9月6日土曜日

最小PBR(GGX・直射)— 冒頭解説(約600字

最小PBR(GGX・直射)— 冒頭解説(約600字)

最小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