来自 OpenGL 文档:
dFdxFine 和 dFdyFine 使用基于当前片段及其直接邻居的 p 值的局部差分来计算导数。
dFdxCoarse 和 dFdyCoarse 使用基于当前片段邻居的 p 值的局部差分来计算导数,并且可能但不一定包括当前片段的值。也就是说,在给定区域上,该实现可以在比相应 dFdxFine 和 dFdyFine 函数所允许的更少的唯一位置中计算导数。
它们之间有什么区别呢?我什么时候应该关心?
我知道两者都计算关于窗口坐标的值的导数,但我不明白用于计算它们的方法。
我猜它们都是在硬件中实现的,但是你能发布 dFdx 伪代码实现吗?
来自 GLSL 规范:
通常考虑 2x2 正方形的片段或样本,并计算独立的dFdxFine每行且独立dFdyFine每列,同时只计算一个dFdx粗略和一个单一的dFdy 粗调整个 2x2 正方形。
基本上,导数的计算方式是通过数值微分。为了简单起见,假设我们正在渲染到单采样帧缓冲区,并假设我们想要计算dFdx(a)
。然后,通常会同时对 2x2 正方形的相邻片段进行着色(即在同一工作组内):
a00 a10
a01 a11
从概念上讲,所有着色器调用都会计算它们的值a
,将其写入共享内存,并发出屏障。然后,在障碍之后,导数可以近似为:
dFdxFine(a) = (a10 - a00)/dx at xy = 00, 10
dFdxFine(a) = (a11 - a01)/dx at xy = 01, 11
对于粗略导数,规范明确允许仅计算整个 2x2 像素块的一个导数。因此,符合要求的实现也可以计算:
dFdxCoarse(a) = (a10 - a00)/dx at xy = 00, 10, 01, 11
两者之间的性能是否存在差异取决于硬件。如果它们确实在您的硬件上返回不同的结果,那么“粗略”版本应该更快。然而,通常您不应该关心这些功能。只需使用dFdx
and dFdy
变体,使用实现默认变体(精细或粗略)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)