从全屏纹理采样时如何防止依赖纹理读取

时间:2016-07-17 17:44:16

标签: opengl-es glsl

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

  

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

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

似乎没有办法在不计算片段着色器的情况下将标准化屏幕坐标放入片段着色器。