为了实现蒙特卡罗路径跟踪,我在光采样过程中遇到了一个障碍。
通常情况下,程序如下:
我遗漏了一些关于事物是如何随机选择的细节,但暂时不要介意。“分布光线追踪中的灯具抽样”)。
问题是,在我看来,BRDF和光源中的光分布都不是实际的函数,而是测量值。
例如,完美反射镜的BRDF对于每一个入射角,在反射方向上是一个diracδ“函数”(即在一点上支持的一种度量,该点的质量为1)。类似地,点光(相对于区域光)是由diracδ建模的,而不是密度函数。
把区别弄清楚似乎很重要,因为它允许适当的重要性抽样。例如,在对BRDF进行抽样时,可以:
两者之间的任何东西也是可能的,也是重要的,因为对于复杂的BRDF来说,完美的重要性抽样是不可能的。
现在,在BRDF实际上是一个dirac三角洲的情况下,我们看到根据BRDF抽样变得非常重要:随机抽样,我们必须用概率1(因为BRDF在一个点上得到支持,当采样方向一致时概率为0),但是如果我们命中幸运,得到反射方向(在这个方向上有质量),那么我们就必须将贡献无限大!如果我们根据BRDF采样,我们总是生成反射方向,并且不需要缩放任何东西(特别是不要遇到任何无穷大)。
我的问题是:在光既是一般度量又不仅仅是函数的情况下,如何用光的贡献来“乘”?当考虑到BRDF的重要抽样和场景中灯光的分布时,如何在这一步骤中适当地进行“重要样本”?(光的取样过程应同时考虑光的分布和BRDF,以避免无穷大。)
理想情况下,一个人需要的采样过程永远不会产生无穷大,无穷大应该仅仅是糟糕的采样机制的产物(如上面所述)。因此,对于随后的四种情况,计算的贡献应该总是有限的:
当然,理想的情况下,这将适用于BRDF和灯的任何措施,但它似乎能够得到上述4种情况下,大部分的工作是正确的。
发布于 2012-08-03 21:58:46
如果你有一个狄拉克三角洲,从一个完全的镜面路径到一个点光源,你仍然可以评估三角洲的整体贡献。(如果您的BRDF不是纯镜面的Dirac增量,那么您可以而且很可能应该使用普通的射线跟踪.)
请注意,这个“增量路径”将与普通射线路径不同。具体来说,普通射线的颜色表示亮度 (单位: lumens/steradian/m^2),它相对于距离是不变的,并且-- BRDF抽样--只乘以反射系数和透射系数。
然而,“δ射线”的颜色表示照度 (单位: lumens/m^2),它与距离无关(以1/r^2的形式脱落)。另外,与亮度不同的是,三角路径将受到沿路径反射镜和折射体的曲率的影响。
为了考虑曲面的傍轴行为,你需要评估射线源相对于另一端的观察角的导数。这应该可以用2x2Jacobian矩阵来表示,在每个反射时,这个矩阵乘以一个Jacobian矩阵,它表示曲面的局部曲率。你的距离计算也将修改这个矩阵-例如,考虑一个完美的透镜可能产生一个照度,随着距离的增加,当你接近焦点。这也意味着你需要处理可能的奇点,其中焦散聚焦点光源.
因为您的帧缓冲区具有有限的分辨率,所以呈现一个增量通常应该(在焦散奇点之外)产生有限的(尽管可能很高)的亮度。为了简单起见,假设每个样本都贡献了一个像素:上面的单位建议您必须将“增量路径”的照度除以像素的实心角,以使其与普通光线的亮度相当。(请注意,每个像素的立体角度都会有所不同--对于标准相机,必须包括一个cos(theta)因子)
你应该能够做一些类似的事情来终止非镜面上的纯镜面路径。我猜想,“δ射线”的统计数据也可能与常规射线的统计数据不同;你需要弄清楚它们是如何适合你的蒙特卡罗框架的。
https://stackoverflow.com/questions/10612262
复制相似问题