gpt4 book ai didi

glsl - dFdx 的解释

转载 作者:行者123 更新时间:2023-12-03 06:16:51 28 4
gpt4 key购买 nike

我正在尝试理解 GLSL 中的 dFdx()dFdy() 函数。

我了解以下内容:

  1. 导数是变化率
  2. 具有两个参数的函数的偏导数是指在保持其中一个参数不变的情况下对函数进行微分。
  3. dFdx()dFdy() 计算当前片段与相邻片段之间值变化的速率。

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

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

// 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 吗?

最佳答案

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

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

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

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

如果您在条件分支中使用 dFdx 或 dFdy ,这会产生影响 - 如果四边形中的一个线程处于事件状态,而另一个线程处于事件状态,则 GPU仍然会查看非事件线程的寄存器,其中可能有任何旧值,因此结果可能是任何结果。

关于glsl - dFdx 的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16365385/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com