这是一篇很长的文章,所以感谢所有阅读本文的人!
因此,对于我自己的个人项目,我正在实现一个光子贴图以与我构建的光线追踪器一起使用,但我无法理解渲染方程。我已经编写了代码来分散一般光子和焦散光子,将它们存储在 KD 树中,并在树中有效地查找它们以用于渲染。
所以渲染方程为: Lr(x,w) = Integral( fr(x, w', w) * Li(x, w') cos(Theta i) * dw'i )
其中 x 是场景中的给定点,w' 是入射光的方向,w 是反射光,Theta_i 是入射角(我认为)。
第一个问题:
这涉及术语 fr(x, w', w),它是 BRDF(双向反射率分布函数)。现在我不确定我是否理解正确,但基本上 BRDF 基本上是一个着色功能?也就是说,对于我的程序的基本光线追踪功能,我使用了 phong 反射模型来进行直接照明和反射。重新调整我的 phong 反射代码并用它来表示积分中的 BRDF 是否有效?
第二个问题:我的另一个问题与我们何时将渲染方程分解为其组件有关。例如,要计算漫反射相互反射,我们这样做:
漫反射 = 积分(fr,d(x, w', w), * Li,d(x,w') cos(theta_i) dw'i)
因此,在任何给定点上,我已经在其周围存储了一堆漫反射光子。根据我从这个方程的理解,我是否只需将每个光子的强度乘以 phong 模型的漫反射分量乘以角度的余弦并将它们全部加起来?
我为该特定部分提供的代码如下所示:
Color result = Color(0,0,0) // r = g = b = 0;
for(int i = 0; i < # photons surrounding point x; i ++)
{
result += Phong_Diffuse(photon_i, x, camera_ray) * photon_i.color * photon_i.angle
}
然后我将它添加到我从直接照明 ( Phong_DIFF_&_SPEC(light_source, x, camera_ray) ) 中获得的颜色和我从镜面反射中获得的颜色中。我在这里做的正确吗?
我只是似乎没有得到想要的效果。一个原因是,如果我缩放我的光子以使每个光子具有 Light_source / num_Photons 的强度,那么即使每个位置有数百个光子,它也几乎不会对我的场景产生明显的影响,因为我总共有 500,000 个光子。如果我不缩放我的光子或捏造缩放,颜色仍然看起来不正确。
此外,当我在 Cornell_box 上进行测试时,即使使用漫反射,天花板仍然明显非常暗,根据我看到的其他康奈尔盒子的图片,它应该更亮。
我也不认为我存储光子的方式有问题,因为我尝试直接可视化我的光子(所以整个场景只是由光子所在的彩色点组成)而且它们似乎大致均匀分布并在正确的位置,当我测试看到我正在收集最接近给定点的光子时,这似乎也能正常工作。
感谢所有费心阅读这冗长杂乱无章的混乱的人,感谢任何花时间回复的人!=)