这是一篇很长的帖子,所以感谢所有读到这篇文章的人!
因此,对于我自己的个人项目,我正在实现一个光子贴图,用于我创建的光线跟踪器,但我很难理解渲染方程。我已经编写了分散普通光子和焦散光子的代码,将它们存储在KD树中,并在树中高效地查找它们以用于渲染。
因此,渲染方程式如下所示:Lr(x,w)=积分(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,那么即使每个位置有几百个光子,它也不会对我的场景产生明显的影响,因为我总共有500000个光子。如果我不缩放我的光子或篡改缩放,颜色看起来仍然不正常
此外,当我在Cornell_box上进行测试时,即使有漫反射,天花板仍然明显非常暗,而根据我看到的其他Cornell盒子的照片,它应该会亮得多。
我也不认为这是我如何存储光子的问题,因为我已经尝试过直接可视化我的光子(所以整个场景只是由光子所在的彩色点组成),它们似乎大致均匀地分布在正确的位置,当我测试以查看我正在收集离给定点最近的光子时,这似乎也很有效。
感谢那些花时间阅读这篇杂乱无章的长篇文章的人,也感谢那些抽出时间做出回应的人!=)
对于您的第一个问题,答案是肯定的。BRDF只是描述具有入射方向i
的光子被反射到方向o
(或被吸收)的概率的概率分布。这也是你的Phong模型所描述的。
关于你的第二个问题,我想你的问题在于比例因子。当你在半径为R
的邻域中收集光子时(无论R
是常数,还是随k个最近邻居而变化),你必须将累积能量除以半径为R
的圆盘的面积(因此,如果这个面积远小于1,这将提高你的强度)。除此之外,你的计算似乎是正确的:你根据所有光子的方向获取它们,在BRDF中使用它们来查看它们被反射到相机的概率(或者换句话说,当光子被反射到摄影机时,它还有多少能量),并求和所有的能量。我猜您的Phong_Diffuse
包含一个漫反射组件(因此得名),如果是这样,那也是正确的
另一种可能是漫反射太弱,无法产生可见的漫反射。