dFdxFine和dFdxCoarse之间的区别

dv1*_*729 4 opengl shader glsl opengl-4

从OpenGL文档:

dFdxFine和dFdyFine基于当前片段及其直接邻居的p值,使用本地差分计算导数.

dFdxCoarse和dFdyCoarse使用基于当前片段的邻居的p值的局部差分来计算导数,并且可能但不一定包括当前片段的值.也就是说,在给定区域内,实现可以计算比相应的dFdxFine和dFdyFine函数所允许的更少的唯一位置的导数.

他们之间有什么区别?我应该什么时候关心?

我知道两者都计算值的导数与窗口坐标有关,但我不理解用于计算它们的方法.

我猜它们都是用硬件实现的,但你能发布一个dFdx伪代码实现吗?

ybu*_*ill 6

从GLSL规范:

典型的是考虑片段或样本的2×2平方,并计算独立dFdxFine每行和独立dFdyFine每列中,而计算仅单个dFdxCoarse和单个 dFdyCoarse整个2×2的正方形.

基本上计算导数的方式是通过数值微分.为简单起见,假设我们渲染为单采样帧缓冲区,并假设我们想要计算dFdx(a).然后通常将2x2平方的相邻片段同时着色(即在同一工作组内):

    a00  a10
    a01  a11
Run Code Online (Sandbox Code Playgroud)

从概念上讲,所有着色器调用都将计算其值a,将其写入共享内存并发出障碍.然后在障碍之后,衍生物可以近似为:

dFdxFine(a) = (a10 - a00)/dx       at xy = 00, 10
dFdxFine(a) = (a11 - a01)/dx       at xy = 01, 11
Run Code Online (Sandbox Code Playgroud)

对于粗略导数,规范明确允许仅计算整个2×2像素块的一个导数.因此,符合标准的实现也可以计算:

dFdxCoarse(a) = (a10 - a00)/dx     at xy = 00, 10, 01, 11
Run Code Online (Sandbox Code Playgroud)

两者之间的性能是否存在差异取决于硬件.如果它们确实在您的硬件上返回了不同的结果,那么"粗略"版本应该更快.通常你不应该关心这些功能.只需使用dFdxdFdy变体,它们使用实现默认变体(精细或粗略).

  • @ dv1729:"*dFdxFine(dFdxFine(x))*"你误读了规范.内部函数是dFd***y***罚款. (2认同)
  • 哦,你是对的,扩展规范中有一个错字(https://www.opengl.org/registry/specs/ARB/derivative_control.txt)。它在 GLSL lang 4.5 规范 (https://www.opengl.org/registry/doc/GLSLangSpec.4.50.diff.pdf) 上得到修复。谢谢! (2认同)