如何正确钳制贝克曼分布

use*_*952 4 graphics shader raytracing probability clamp

我正在尝试实现 Microfacet BRDF 着色模型(类似于 Cook-Torrance 模型),但我在本文中定义的贝克曼分布方面遇到了一些问题:https : //www.cs.cornell.edu/~srm/publications /EGSR07-btdf.pdf

在此处输入图片说明

其中 M 是微面法线,N 是宏观面法线,ab 是 [0, 1] 之间的“硬度”参数。

我的问题是这种分布通常会返回非常大的值,尤其是当 ab 非常小时。

例如,贝克曼分布用于计算根据以下方程生成微平面法线 M 的概率:

在此处输入图片说明

概率必须在范围 [0,1] 之间,那么如果贝克曼分布给我的值大小为 1000000000+,那么如何使用上面的函数获得该范围内的值?

那么有没有合适的方法来限制分布?还是我误解了它或概率函数?如果值超过 1,我曾尝试简单地将其钳位为 1,但这并没有真正给我想要的结果。

小智 5

我和你一样的问题。

如果你读

http://blog.selfshadow.com/publications/s2012-shading-course/hoffman/s2012_pbs_physics_math_notes.pdf

http://blog.selfshadow.com/publications/s2012-shading-course/hoffman/s2012_pbs_physics_math_notebook.pdf

你会注意到这是完全正常的。从链接引用:

“Beckmann ?b 参数等于 RMS(均方根)微面斜率。因此,其有效范围是从 0(不包含 –0 对应于完美镜像或 Dirac delta 并导致贝克曼公式中的除以 0 错误) ) 和任意高的值。值 1 没有特殊意义——这只是意味着 RMS 斜率为 1/1 或 45°。(...)"

还有另一个引用:

“微面方向的统计分布是通过微面正态分布函数 D(m) 定义的。与 F() 不同,D() 的值不限于介于 0 和 1 之间——尽管值必须是非负的,它们可以任意大(表示法线指向特定方向的微平面非常集中。(...)”

你应该在谷歌上搜索 Self Shadow 的 Physically Based Shading 课程,里面有很多有用的材料(每年有一篇博文:2010、2011、2012 和 2013)