我第一次遇到以游戏引擎中的屏幕空间反射形式呈现间接反射的问题,但我一直在努力获得正确的外观结果。



(图案是由于蒙特卡洛积分产生噪声的不良方式而产生的)

(以低射线计数拍摄的图像,否则颜色值最终将变为NaN)

从根据我收集的数据,渲染方程的常见公式如下:

$$ L_o(p,\ omega_o)= L_e(p,\ omega_o)+ \ int _ {\ Omega} L_i (p,\ omega_i)fr(\ omega_i,\ omega_o)(n \ cdot \ omega_i)d \ omega_i $$

其中的$ L_e(p,\ omega_o)$项可以可以使用以下蒙特卡洛估计量进行近似:

$$ L_o(p,\ omega_o)\ approx \ frac {1} {N} \ sum_ {i = 1} ^ {N} \ frac { L_i(p,\ omega_i)fr(\ omega_i,\ omega_o)(n \ cdot \ omega_i)} {p(\ omega_i)} $$

其中$ n $是垂直于

对于实际值的计算,所有这些术语都必须是已指定。

$ L_i(p,\ omega_i)$是通过在屏幕空间中的光线行进找到的。

$ fr(\ omega_i,\ omega_o)$是Cook-Torrance BRDF :$ \ frac {FGD} {4(n \ cdot \ omega_i)(n \ cdot \ omega_o)} $

如果我们命名$ n $和$ m $ $ \ theta $之间的夹角,我们得到GGX NDF为:$ D = \ frac {\ alpha ^ 2} {\ pi(\ cos ^ 2(\ theta)(\ alpha ^ 2-1)+1)^ 2} $

其中$ m $是微面常规$ m = \ frac {\ omega_i + \ omega_o} {| \ omega_i + \ omega_o |} $

$ p(\ omega_i)$是可以从GGX NDF导出的PDF $ \ frac {\ alpha ^ 2 \ cos(\ theta)\ sin(\ theta)} {\ pi(\ cos ^ 2(\ theta)(\ alpha ^ 2-1) +1)^ 2} $

放在一起,我们得到:

$$ L_o(p,\ omega_o)\ approx \ frac {1} {N} \ sum_ {i = 1} ^ {N} \ frac {L_i(p,\ omega_i)\ frac {FG} {4(n \ cdot \ omega_i)(n \ cdot \ omega_o)} \ frac {\ alpha ^ 2} {\ pi(\ cos ^ 2(\ theta)(\ alpha ^ 2-1)+1)^ 2}(n \ cdot \ omega_i)} {\ frac {\ alpha ^ 2 \ cos(\ theta)\ sin (\ theta)} {\ pi(\ cos ^ 2(\ theta)(\ alpha ^ 2-1)+1)^ 2}} $$

简化后,我们得到:

$$ L_o(p,\ omega_o)\ approx \ frac {1} {N} \ sum_ {i = 1} ^ {N} \ frac {L_i(p,\ omega_i)FG} {4(n \ cdot \ omega_o )\ cos(\ theta)\ sin(\ theta)} $$

此过程对我来说似乎是正确的,但是我的实现所产生的图像在锐角入射角或低粗糙度值下具有过度的反射。但是,当我从分母中除去$ \ sin(\ theta)$因子时,它似乎是合理的(尽管不确定正确性)。



预先感谢。

#1 楼

经过一些测试和研究,我发现$ \ sin(\ theta)$和$ \ cos(\ theta)$均应从分母中删除。

原因是,由于我们想要球面弧度而不是角度的概率函数,因此应该删除$ \ sin(\ theta)$因子(该因子本质上用于将单位球面上的球面弧度转换为两个极轴上的弧度)。 >
此外,$ \ cos(\ theta)$(正如Nathan Reed在此博客文章中所解释的)在那里可以将微面区域转换为宏观表面区域。由于我们正在生成微表面样本,因此应将其删除。

校正后,我们得到公式

$$ L_o(p,\ omega_o)\ approx \ frac {1 } {N} \ sum_ {i = 1} ^ {N} \ frac {L_i(p,\ omega_i)FG} {4(n \ cdot \ omega_o)} $$

这是免费的关于问题的公式工件。