了解dFdX和dFdY的基础知识

时间:2015-01-30 23:39:22

标签: opengl glsl hlsl fragment-shader

我已经阅读了很多关于dFdX(n)dFdY(n)行为的描述,并且相信我仍然可以处理来自学校的偏导数。我不能遵循的是' n'来自最简单的例子?

阅读glsl内置函数dFdx(n)dFdy(n),除了数学之外没有任何上下文我会将它们解释为"我有一些x和y函数:f(x,y) ,我采取该函数的偏导数x d/dx(x,y),我评估了xy的某些值的偏导数公式,我假设它是上面的输入参数n

我已经阅读了许多关于dFdx()dFdy()如何允许您为输出片段找到窗口空间渐变的描述。输出片段的情况是我目前最感兴趣的,因为我 试图确定纹理坐标的变化率以及纹理被栅格化的方式。

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

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

1 个答案:

答案 0 :(得分:3)

让我们检查man page

genType dFdx(     genType p);

genType dFdy(     genType p);
     

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

     

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

     

dFdxCoarse和dFdyCoarse使用local计算导数   基于当前片段的p值进行差分   邻居,并且可能(但不一定)包括价值   对于当前片段。也就是说,在给定的区域内,   实现可以在比其更少的唯一位置计算导数   将允许相应的dFdxFine和dFdyFine   功能

     

dFdx返回dFdxCoarse或dFdxFine。 dFdy也会返回   dFdyCoarse或dFdyFine。实施可以选择哪个   根据绩效或等因素进行计算   API GL_FRAGMENT_SHADER_DERIVATIVE_HINT提示的值。

     

表示更高阶导数的表达式,例如dFdx(dFdx(n))   有不确定的结果,混合顺序衍生物如   dFdx(dFdy(N))。假设表达式p是连续的   因此,通过非均匀控制流程评估的表达式可以是   未定义。

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

换句话说,片段着色器已经计算了片段的F(x,y)并将其传递给GPU以收集它们并根据它旁边的片段将dFdX传回原来{{1} }}

F(x+e, y)意味着您可以在其中放置浮点数,您也可以传入vec4并获取分量方面的dFd *值。