Explanation of dFdx

72

我在尝试理解GLSL中的和函数。

我了解以下内容:

  1. 导数是变化率
  2. 有两个参数的函数的偏导数是在保持其中一个参数恒定的情况下对函数进行微分。
  3. 和找到一个值在当前片段和相邻片段之间变化的速率。

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

它可能是在片段着色器的两次调用之间找到一个任意变量的变化率吗?片段着色器调用是否会从相邻的着色器调用“读取”变量?以(简单的)示例为例:

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

// invocation for fragment next to fragment 1 along the x axis.
float x = 2.0;
float d = dFdx(x);

d分别是-1.0和1.0吗?


10
这里有一篇很好的讨论文章,可以了解到dFdx和dFdy函数是如何实现的。链接 - user1118321
1个回答

150
为了理解这些指令如何工作,有助于了解GPU的基本执行架构以及片段程序如何映射到该架构。
GPU在同一个程序上“锁步”运行一堆线程,每个线程都有自己的寄存器集。因此,它会获取一条指令,然后为每个运行时的线程执行该指令N次。为了处理条件分支等情况,它们还具有用于当前运行线程组的“活动掩码”。不活动的线程实际上不参与运行(因此它们的寄存器不会变化)。每当存在条件分支或聚合(分支目标)时,线程掩码会相应更改。
现在,当运行片段程序时,要运行的片段会被排列成“四元组”- 4个像素的2x2正方形,总是以一个线程组一起运行。组中的每个线程都知道自己的像素坐标,并且可以通过翻转x(或y)坐标的最低位轻松找到四元组中相邻像素的坐标。
当GPU执行DDX或DDY指令时,发生的情况是它查看相邻像素的线程的寄存器,并将其与当前像素的值进行减法运算-减去较高坐标(最低位为1)的值,从低坐标(最低位为0)中减去。
如果在条件分支中使用dFdx或dFdy,则会产生影响-如果四元组中的一个线程处于活动状态,而另一个线程未处于活动状态,则GPU仍将查看非活动线程的寄存器,其中可能有任何旧值,因此结果可能是任何值。

我正在努力阅读很多相关内容,同时也要感谢@ChrisDodd的加入和帮助。这真是非常有帮助和深刻的启示。 - Mathias
3
你的解释非常好 - 我在哪里可以找到描述这种行为的文档? - Cross_
5
谢谢。四元组机制是否意味着每个水平像素对都会有一个dFdx的单一值?我猜我可以测试一下。回答:是的。https://www.shadertoy.com/view/llGyzy - orion elenzil
我发现在一些设备上,比如我的 iPhone 6 上,“四边形”似乎是“对角线” - 即它们是2x1而不是2x2。有没有人知道如何在着色器内明确定义这些值?我已经寻找了一个常量,但没有找到。 - orion elenzil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接