【问题标题】:How to prevent dependent texture read when sampling from a fullscreen texture从全屏纹理采样时如何防止读取依赖纹理
【发布时间】:2016-07-18 11:23:17
【问题描述】:

Apple 建议避免使用在片段着色器中计算的 UV 坐标进行纹理读取。 (https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/BestPracticesforShaders/BestPracticesforShaders.html)

现在假设我正在渲染一些 3D 模型,并且在相关的片段着色器中我需要从全屏纹理中进行采样。样本位置需要与当前片段在屏幕上的位置相对应。

我所知道的计算用于采样此全屏纹理的 UV 的最简单方法是使用 gl_FragCoord.xy/u_viewportWidth,但根据 Apple 的指南,这将引入依赖纹理读取,因为现在按顺序使用了计算在像素着色器中生成 UV。

我们可以通过计算每个顶点的屏幕位置,进行视口划分以获得 UV,然后将该坐标作为变量传递给片段着色器,将 UV 计算拉到顶点着色器。但是,我质疑 UV 值是否真的会被硬件正确插值。 (这甚至是一种有效的方法吗?)

否则,有什么方法可以避免在像素着色器中计算 UV 或者这是不可能的?

【问题讨论】:

  • "Apple 建议避免使用在片段着色器中计算的 UV 坐标进行纹理读取。" 不,他们不这样做。他们只是说要“注意”它们以及潜在的性能影响。不要将简单的性能警告误解为“不惜一切代价避开”。

标签: opengl-es glsl


【解决方案1】:

但是,我怀疑 UV 值是否真的会被硬件正确插值。 (这甚至是一种有效的方法吗?)

你有很好的直觉;它们不会被正确插值。透视正确插值会混淆这种方法,因为这是需要真正线性插值的罕见情况之一。甚至 OpenGL ES 3.2 也没有 noperspective 限定符(然而,Vulkan 需要支持它。所以我猜 ES 工作组只是放弃了)。

似乎没有一种方法可以在不计算的情况下将标准化的屏幕坐标导入片段着色器。

【讨论】:

  • 感谢您的确认
  • 你能不能在顶点着色器中计算归一化坐标没有透视分割,然后使用textureProj()在片段着色器中采样?我还没想好,只是在脑海中闪过……
  • @RetoKoradi:我不相信textureProj 可以将非透视正确的插值调整为透视正确的插值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多