2

这是一篇很长的文章,所以感谢所有阅读本文的人!

因此,对于我自己的个人项目,我正在实现一个光子贴图以与我构建的光线追踪器一起使用,但我无法理解渲染方程。我已经编写了代码来分散一般光子和焦散光子,将它们存储在 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 上进行测试时,即使使用漫反射,天花板仍然明显非常暗,根据我看到的其他康奈尔盒子的图片,它应该更亮。

我也不认为我存储光子的方式有问题,因为我尝试直接可视化我的光子(所以整个场景只是由光子所在的彩色点组成)而且它们似乎大致均匀分布并在正确的位置,当我测试看到我正在收集最接近给定点的光子时,这似乎也能正常工作。

感谢所有费心阅读这冗长杂乱无章的混乱的人,感谢任何花时间回复的人!=)

4

1 回答 1

2

对于你的第一个问题,答案是肯定的。BRDF 只是一个概率分布,它描述了具有入射方向的光子i被反射到一个方向o(或被吸收)的概率。这也是您的 Phong 模型所描述的。

对于您的第二个问题,我想您的问题在于比例因子。当您在半径附近收集光子时R(无论R是恒定的,还是随 k 个最近的邻居而变化),您必须将累积的能量除以半径圆盘的面积R(因此,如果这个面积小得多比一个,这将提高你的强度)。Appart 由此看来,您的计算似乎是正确的:您拍摄所有光子及其方向,在 BRDF 中使用它们来查看它们被反射到相机的概率(或者说,当反射到相机时光子的剩余能量有多少) ),然后总结一切。我猜你Phong_Diffuse包含一个漫反射组件(因此它的名字),如果是这样,那也是正确的。
另一种可能性是您的漫反射太弱而无法产生可见的漫反射。

于 2012-12-06T07:47:25.453 回答