我正在实现各向异性GGX BRDF,并且遇到了我的实现的奇怪行为。我以为,如果我将微刻面分布函数与各向同性GGX中的一个进行比较,那么当各向异性参数为0时,它们应该相等。不过,我无法做到这一点。
这是我使用的GGX公式:
我使用的是各向异性GGX公式:
如果各向异性为0,则等于,因此我可以从第二个公式中得出以下内容:
问题1 >
现在的问题是,第三个公式由于第一个公式中的负数1而不能与第一个公式匹配。
问题2
具体问题在使用各向异性GGX进行渲染时,我发现结果中的法线似乎被忽略了。
以下是在具有法线贴图的平面材料贴片上各向同性GGX的分布函数的可视化视图:
这是anisot ropic一:
符号
为了完成我的解决方案的解释,我将用作半向量,将用作普通向量。 ,表示粗糙度,表示切线,表示双切线(在我的情况下,它们分别分别简单地与x和y轴对齐)。 和代表相应方向上的粗糙度。
问题
我的推理是否有错误?我的各向异性GGX正确吗?
两者之间是什么关系?从GGX扩展到各向异性GGX,有一个简单的解释吗?
您是否有任何通用技巧来验证一个人的BRDF实现的正确性?
参考文献
这是我的主要参考资料:
各向异性GGX实现
BRDF公式
#1 楼
在重新审视了问题之后,我设法找到了自己的错误。广告问题1
是的,公式是正确的。该问题隐藏在切线和双切线中。在执行法线贴图时,切线框必须垂直于映射的法线,否则术语
将不包含有关法线贴图的任何信息。
这里的另一个问题可能是映射法线时,切线帧不是唯一确定的。关于此的更多信息,请参见:http://www.thetenthplanet.de/archives/1180。我已经决定解决此问题的方式与Blender相同(请在其仓库中查找
make_orthonormals_tangent()
),因为我需要与之兼容。这是我的算法:bitangent_ortho = norm(cross(normal, tangent))
tangent_ortho = cross(bitangent_ortho, normal)
(假设
normal
被映射并且具有单位长度,并且tangent
是在映射法线之前的有效切线。)广告问题2
用户@lightxbulb在评论我的问题时确实很好地回答了这个问题。我对“迪斯尼乐园的自然阴影”课程笔记的唯一问题是,对变量符号的解释不是很清楚。从那以后,我了解到惯例如下:
是法线与之间的夹角
是切线和之间的方位角
广告问题3
这里唯一对我有用的建议如下:
总是想出最简单的玩具示例
验证您的假设
可视化所有内容
结论
我希望这除了我以外,对其他人也有帮助。祝您实施BRDF顺利!
评论
尝试用$ \ cos ^ 2 \ phi / \ alpha ^ 2_x + \ sin ^ 2 \ phi / \ alpha ^ 2_y $代替$ 1 / \ alpha ^ 2 $。感谢您的评论,@ lightxbulb。各向异性为0时,这的确似乎使两个公式相等。在进一步研究之前,请您先说明一下公式中formula的含义吗?
它是方位角(占各向异性的一个)。转到“迪斯尼基于物理的阴影”的课程注释。特别是在pdf的末尾,您可以在附录中找到派生工具:blog.selfshadow.com/publications/s2012-shading-course