Opengl 了解dFdX和dFdY的基础知识
我已经阅读了大量关于Opengl 了解dFdX和dFdY的基础知识,opengl,glsl,hlsl,fragment-shader,Opengl,Glsl,Hlsl,Fragment Shader,我已经阅读了大量关于dFdX(n)和dFdY(n)行为的描述,并且相信我仍然能够从学校学到偏导数。我不明白的是,在最简单的例子中,“n”来自哪里 阅读glsl内置函数dFdx(n)和dFdy(n)时,除了数学以外没有任何上下文,我会将它们解释为“我有一些x和y的函数:f(x,y),我取该函数的偏导数w.r.t.xd/dx(x,y),我计算了x和y的某个值的偏导数公式,我假设这是上面的输入参数n 我已经阅读了许多关于dFdx()和dFdy()如何让您为输出片段找到窗口空间渐变的描述。输出片段的情况
dFdX(n)
和dFdY(n)
行为的描述,并且相信我仍然能够从学校学到偏导数。我不明白的是,在最简单的例子中,“n”来自哪里
阅读glsl内置函数dFdx(n)
和dFdy(n)
时,除了数学以外没有任何上下文,我会将它们解释为“我有一些x和y的函数:f(x,y)
,我取该函数的偏导数w.r.t.xd/dx(x,y)
,我计算了x
和y
的某个值的偏导数公式,我假设这是上面的输入参数n
我已经阅读了许多关于dFdx()
和dFdy()
如何让您为输出片段找到窗口空间渐变的描述。输出片段的情况是我目前最感兴趣的,因为我不试图确定纹理坐标的变化率,而不是纹理如何被光栅化
我希望使用dFdx(n)
和dFdy(n)
来查找输出片段的窗口空间颜色梯度。我不完全理解如何在心里构造被区分的函数,以及它与帧缓冲区的关系,以及n
与此的关系(例如,n
是否与当前片段的2x2片段邻域、整个帧缓冲区的窗口坐标空间相关,以便我在该值处计算梯度,其他)
我希望在对这个问题的任何回答中,n
的输入类型是标量(浮点),我们只讨论一维,dFdx()
,以简化讨论。让我们检查一下:
仅在片段着色器中可用,这些函数返回
表达式p对窗口x的偏导数
坐标(对于dFdx*)和y坐标(对于dFdy*)
dFdxFine和dFdyFine使用局部差分计算导数
基于当前片段及其直接片段的p值
邻居
DFDxRough和DFDyRough使用局部变量计算导数
基于当前片段的p值的差分
邻居,并且可能(但不一定)包括该值
对于当前片段。即,在给定区域上
实现可以在更少的唯一位置计算导数
将允许对应的dFdxFine和dFdyFine
功能
dFdx返回DFDXCOASE或dFdxFine。dFdy返回DFDXCOASE或dFdxFine
DFDYRough或dFdyFine。实现可以选择
根据性能或性能等因素进行计算
API GL_片段_着色器_导数_提示的值
表示高阶导数的表达式,如dFdx(dFdx(n))
具有未定义的结果,混合阶导数如
dFdx(dFdy(n))。假设表达式p是连续的且
因此,通过非均匀控制流计算的表达式可能是
未定义
专注于精细变量。当每个片段进程到达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,y)处的“var”计算为0.1+0.35=0.45
genType dFdx( genType p);
genType dFdy( genType p);