【问题标题】:understanding the basics of dFdX and dFdY了解 dFdX 和 dFdY 的基础知识
【发布时间】:2015-03-30 13:11:54
【问题描述】:

我已经阅读了很多关于dFdX(n)dFdY(n) 行为的描述,并且相信我仍然掌握了学校的偏导数。我不明白的是,在最简单的例子中,“n”是从哪里来的?

阅读 glsl 内置函数 dFdx(n)dFdy(n) 没有数学以外的任何上下文,我会将它们解释为“我有一些 x 和 y 的函数:f(x,y),我取该函数的偏导数wrt x d/dx(x,y),然后我对xy 的某个值求偏导公式,我假设这是上面的输入参数n

我已经阅读了很多关于dFdx()dFdy() 如何让您找到输出片段的窗口空间梯度的描述。输出片段的情况是我目前最感兴趣的,因为我试图确定纹理坐标的变化率 w.r.t 纹理是如何被光栅化的。

我希望使用dFdx(n)dFdy(n) 来查找输出片段的窗口空间颜色渐变。我不完全理解如何在心理上构造被区分的函数以及它与帧缓冲区的关系以及n 与它的关系(例如n 是否与当前片段的 2x2 片段邻域、窗口坐标空间相关整个帧缓冲区,以便我评估该值的梯度,其他)?

我希望在对此问题的任何回复中n 的输入类型是标量(浮点数),并且我们只讨论一个维度dFdx(),以简化讨论。

【问题讨论】:

标签: opengl glsl hlsl fragment-shader


【解决方案1】:

让我们检查一下man page

genType dFdx(     genType p);

genType dFdy(     genType p);

仅在片段着色器中可用,这些函数返回 表达式 p 关于窗口 x 的偏导数 坐标(对于 dFdx*)和 y 坐标(对于 dFdy*)。

dFdxFine 和 dFdyFine 使用局部差分计算导数 基于当前片段的 p 值及其立即数 邻居。

dFdxCoarse 和 dFdyCoarse 使用局部计算导数 基于当前片段的 p 值的差异 邻居,并且可能但不一定包含该值 对于当前片段。也就是说,在给定区域内, 实现可以在更少的独特位置计算导数 将允许对应的 dFdxFine 和 dFdyFine 功能。

dFdx 返回 dFdxCoarse 或 dFdxFine。 dFdy 返回 dFdyCoarse 或 dFdyFine。实现可以选择哪个 计算要执行基于因素,如性能或 API GL_FRAGMENT_SHADER_DERIVATIVE_HINT 提示的值。

表示高阶导数的表达式,例如 dFdx(dFdx(n)) 有未定义的结果,混合阶导数如 dFdx(dFdy(n))。假设表达式 p 是连续的并且 因此,通过非统一控制流评估的表达式可能是 未定义。

专注于 Fine 变体。当每个片段进程到达 dFd* 调用时,GPU 将收集传入的值并基于这些值,通常通过获取相邻值之间的差异并除以片段大小。

换句话说,片段着色器已经为片段计算了F(x,y),并将其传递给 GPU 以收集它们并根据它旁边的片段传回 dFdX,这将通过F(x+e, y)

GenType 表示您可以在其中放入浮点数,也可以传入一个 vec4 并获取组件级的 dFd* 值。

【讨论】:

  • dx和dy的单位是什么?那些 dx=1/以像素为单位的窗口宽度,1/以像素为单位的窗口高度??
  • 我相信单位是一个像素。例如: - 我们在 (x, y) 像素中 - 在 (x, y) 处某个变化的“var”的值是 0.1 - dFdx(var) 是 0.35 这意味着我们可以在 (x+1) 处计算“var” , y) 为 0.1+0.35 = 0.45
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 2021-04-07
  • 1970-01-01
  • 2011-06-14
相关资源
最近更新 更多