【发布时间】: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 坐标进行纹理读取。" 不,他们不这样做。他们只是说要“注意”它们以及潜在的性能影响。不要将简单的性能警告误解为“不惜一切代价避开”。