这是一篇很长的文章,非常感谢任何阅读本文的人!光子映射的渲染方程
因此,对于我自己的个人项目,我正在实施一个光子贴图来与我制作的光线追踪器一起使用,但我无法理解渲染方程。我已经编写了代码来分散一般光子和焦散光子,将它们存储在KD树中,并有效地在树中查找它们以用于渲染。
所以渲染方程给定为: LR(X,W)=积分(FR(X,W 'W)*李(X,W')COS(西塔ⅰ)* 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的强度,那么即使每个位置有数百个光子,它也几乎不会对我的场景产生显着影响,因为我总共有50万个光子。如果我不缩放我的光子或者改变色彩,那么颜色看起来依然如此。
此外,当我在Cornell_box上进行测试时,即使使用漫反射,当基于我所看到的其他康奈尔盒子的图片时,天花板仍然明显非常黑暗,应该会更亮。
我不认为这是我如何存储我的光子的问题,因为我试图直接看到我的光子(所以整个场景只是由光子所在的彩色点组成),他们似乎大致均匀分布在正确的位置,当我测试看到我正在收集最接近给定点的光子时,这似乎也起作用。
非常感谢任何一个懒得仔细阅读这些漫长混乱的人,并感谢任何花时间回复的人! =)