我读过许多关于dFdX(n)
和dFdY(n)
行为的描述,并且相信我仍然对学校的偏导数有一套处理方法。我不明白的是,在最简单的例子中,“n”从何而来?
阅读glsl内置函数dFdx(n)
和dFdy(n)
时,除了数学之外,没有任何上下文,我会将它们解释为"I具有x和y:f(x,y)
的一些函数,我取该函数w.r.t. x d/dx(x,y)
的偏导数,并计算出x
和y
的一些值的偏导数公式,我假设这是上面的输入参数n
。
我读过许多关于dFdx()
和dFdy()
如何允许您为输出片段找到窗口空间梯度的描述。目前我最感兴趣的是输出片段案例,因为我没有试图确定纹理坐标w.r.t的变化速度,纹理是如何被光栅化的。
我希望使用dFdx(n)
和dFdy(n)
来查找输出片段的窗口空间颜色梯度。我不完全理解如何在精神上构造被区分的函数,以及它与帧缓冲区是如何相关的(例如,n
是否与当前片段的2x2片段邻域、整个框架缓冲区的窗口坐标空间相关,以便在此值下计算梯度)?
我希望在对这个问题的任何回答中输入的n
类型是一个标量(浮点),我们只讨论一个维度,dFdx()
,以简化讨论。
发布于 2015-01-30 23:57:23
让我们检查一下手册页
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是连续的,因此,通过非均匀控制流求出的表达式可能是不确定的。
专注于精细变体。当每个片段进程到达dFd*调用时,GPU将收集传入并基于这些值传递的值,通常是通过获取相邻值之间的差值并除以碎片大小。
换句话说,片段着色器已经计算了片段的F(x,y)
,并将其传递给GPU收集它们,并根据旁边的片段将dFdX传回给F(x+e, y)
。
GenType
意味着您可以将浮点数放入其中,也可以传入一个vec4并获得组件级dFd*值。
https://stackoverflow.com/questions/28246413
复制相似问题