本文主要是介绍《学一辈子光线追踪》 三 光散射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
蒙特卡洛光线追踪技术系列 见 蒙特卡洛光线追踪技术
这一小节全都是文字,但是比较重要。虽然之前在
三维渲染 光能辐射基础
三维渲染 BRDF双向反射分布函数
三维渲染 相位函数
三维渲染 体照明模型
这几个章节也都很详细的描述过光学了,这里从概率的方面再进行描述。
在这一章中,我们实际上不会实现任何东西。我们将在第四章中为我们的节目设置一个大的灯光变化。
我们上一本书中的程序已经散射了表面或体积的光线。这是光与表面相互作用的常用模型。一种自然的建模方法是概率。首先,光线被吸收了吗?
光散射概率:A
光被吸收的概率:1-A
这里A代表albedo(拉丁文代表白色)。反照率在某些学科中是一个精确的技术术语,但在所有用途中,它都意味着某种形式的分数反射率。当我们在玻璃上实现时,反照率可能会随着入射方向的变化而变化,并且会随着颜色的变化而变化。在大多数基于物理的渲染器中,我们将使用一组波长作为灯光颜色,而不是RGB。我们几乎总是可以利用我们的直觉,把R、G和B看作特定的长、中、短波长。
如果光确实散射,它将具有方向性分布,我们可以将其描述为立体角上的pdf。我将其称为散射pdf:s(direction)。散射pdf也可以随着入射方向的变化而变化,这一点你会注意到,当你观察道路上的反射时,它们会变得像镜子一样。
根据这些数量,表面的颜色为:
color = INTEGRAL A * s(direction) * color(direction)
即:
请注意,A和s() 可能取决于视图方向,因此颜色当然可以随视图方向而变化。A和s() 也可能随表面或体内的位置而变化。
如果我们应用MC基本公式,我们得到以下统计估计:
Color = (A * s(direction) * color(direction)) / p(direction)
其中p(direction) 是我们随机生成的任意方向的pdf。对于Lambertian曲面,我们已经隐式地实现了这个公式,用于p() 是余弦密度的特殊情况。
注意该球产生的光线中很明显theta角越小,产生光线的可能性更大:注意下图,同样大小的立体角中很明显接近法线的立体角里产生的光线比重更大。
Lambertian曲面的 s() 与 cos(theta) 成正比,其中 theta 是相对于曲面法线的角度。记住,所有pdf都需要积分为1。对于cos(θ)<1,我们有s(direction)=0,cos在半球上的积分是π(可以自己算算):
因此对于朗伯曲面,散射pdf为:
s(direction) = cos(theta) / Pi
如果我们使用相同的pdf进行采样,那么p(direction) =cos(theta)/Pi,分子和分母会抵消,我们得到:
Color = A * color(direction) (我强烈认为书中是写错了,所以我在这里写的是我认为的版本,当然也可能我的书版本比较老,所以错误比较多)
这正是我们在原始 color() 函数中得到的结果!但是我们现在需要概括一下,这样我们就可以在一些重要的方向上,比如朝着灯光发射额外的光线。
上面的处理方法有点不标准,因为我希望对曲面和体使用相同的数学方法。否则会生成一些难看的代码。如果您阅读文献,您将看到双向反射分布函数(BRDF)描述的反射。它与我们的条款非常简单:
BRDF = A * s(direction) / cos(theta)
例如,对于Lambertian曲面,BRDF=A/Pi。我们的术语和BRDF之间的转换很容易。
对于参与介质(体积),我们的反照率通常称为散射反照率,我们的散射pdf通常称为相位函数。
这篇关于《学一辈子光线追踪》 三 光散射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!