2012-12-04 71 views
1

这是一篇很长的文章,非常感谢任何阅读本文的人!光子映射的渲染方程

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

我不认为这是我如何存储我的光子的问题,因为我试图直接看到我的光子(所以整个场景只是由光子所在的彩色点组成),他们似乎大致均匀分布在正确的位置,当我测试看到我正在收集最接近给定点的光子时,这似乎也起作用。

非常感谢任何一个懒得仔细阅读这些漫长混乱的人,并感谢任何花时间回复的人! =)

回答

1

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

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