dFdx的说明

时间:2013-05-03 18:28:18

标签: glsl derivative

我试图了解GLSL中的dFdx和dFdy函数。

我理解以下内容:

  1. 衍生工具是变化率
  2. 具有两个参数的函数的偏导数是在区分函数的同时保持其中一个参数不变。
  3. dFdx和dFdy查找当前片段与邻近片段之间值的变化率。
  4. 我不明白变化率是指什么。它是片段坐标的变化率吗?

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

    // 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);
    

    d分别为-1.0和1.0吗?

1 个答案:

答案 0 :(得分:103)

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

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

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

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

如果在条件分支中使用dFdxdFdy,则会产生影响 - 如果四边形中的一个线程处于活动状态而另一个线程未处于活动状态,则GPU仍会查看寄存器非活动线程中可能包含任何旧值,因此结果可能是任何内容。