9

所以我阅读了OpenGL信息页面,textureGrad但它并没有真正解释任何事情。因此,您可以明确指定 P 相对于 X 和 Y 的偏导数

  • 这实际上是做什么的?
  • 当您在没有特定偏导数的情况下进行采样时,OpenGL 如何计算导数?
  • 为什么纹理采样使用甚至需要导数?

我的心已经被震撼了。

4

1 回答 1

1

当您在 GPU 上调用纹理采样操作时,GPU 会执行以下操作:

  1. 纹理请求被广播到 2x2 四边形片段中的相邻像素
  2. 计算纹理坐标相对于 x 和 y 的偏导数
  3. 这些部分用于计算 MIP 级别(考虑细节级别和各向异性过滤)
  4. 最后,获取相关的纹素(可能从纹理缓存中)并进行插值以产生最终的采样结果

现在,假设您有不同的相邻片段分支(例如由于某些材质或其他原因),因此在调用该着色器时,同时发出对不同纹理的采样请求。如果这些纹理的平铺率不同,您会遇到问题,这会破坏 MIP 选择(此未定义操作的不连贯性将导致渲染噪声)。解决方案是在分支外部使用 dFdx 和 dFdy 自己查询渐变,并在分支内使用textureGrad函数,将正确的平铺乘数应用于渐变。

于 2018-07-23T19:26:01.890 回答