dFdx的说明

bwr*_*oga 46 glsl derivative

我试图理解GLSL中的dFdx和dFdy函数.

我理解以下内容:

  1. 衍生物是变化率
  2. 具有两个参数的函数的偏导数是在区分函数的同时保持其中一个参数不变的情况.
  3. dFdx和dFdy查找当前片段与邻近片段之间值的变化率.

我不明白变化率是指什么.它是片段坐标的变化率吗?

可能是你可以在片段着色器的两个调用之间找到任意变量的变化率吗?着色器调用是否从相邻调用中"读取"变量?对于(简单)示例:

// invokation for fragment 1
float x = 1.0;
float d = dFdx(x);

// invokation for fragment next to fragment 1 along the x axis.
float x = 2.0;
float d = dFdx(x);
Run Code Online (Sandbox Code Playgroud)

d分别为-1.0和1.0?

Chr*_*odd 105

要了解这些指令的工作原理,有助于理解GPU的基本执行体系结构以及片段程序如何映射到该体系结构.

GPU在同一程序的"锁步"中运行一堆线程,每个线程都有自己的寄存器集.因此它获取一条指令,然后执行该指令N次,每次运行一次.为了处理条件分支等,它们还为当前运行的线程组提供了"活动掩码".掩码中未激活的线程实际上不会运行(因此它们的寄存器不会更改).只要存在条件分支或连接(分支目标),就会适当地更改线程掩码.

现在,当运行片段程序时,要运行的片段被排列成"四边形" - 4个像素的2x2个正方形,它们总是在一个线程组中一起运行.组中的每个线程都知道它自己的像素坐标,并且可以通过翻转x(或y)坐标的最低位来轻松找到四边形中相邻像素的坐标.

当GPU执行DDX或DDY指令时,会发生的情况是,它会查看相邻像素的线程的寄存器,并使用当前像素的值减去 - 减去较高坐标的值(最低位1) )从较低的位置(最低位0).

如果您使用dFdxdFdy在条件分支中,这会产生影响- 如果四边形中的一个线程处于活动状态而另一个未处于活动状态,则GPU仍将查看非活动线程的寄存器,该线程可能具有任何旧值,结果可能是任何事情.

  • 您的解释非常好 - 我在哪里可以找到描述此行为的文档? (2认同)
  • 谢谢你。quad 机制是否意味着每对水平像素将具有 dFdx 的单个值?我想我可以测试一下。回答:是的。https://www.shadertoy.com/view/llGyzy (2认同)