Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 了解dFdX和dFdY的基础知识_Opengl_Glsl_Hlsl_Fragment Shader - Fatal编程技术网

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