我正在使用 OpenGL ES 3.0 渲染剪辑坐标中提供的许多三角形。我使用 varying 为每个片段生成内插纹理坐标。但是,由于插值使用顶点的 z 坐标,因此插值在屏幕空间中不是线性的。据我所知,GLES 不支持 noperspective 限定符,它应该可以满足我的要求。
您有解决方法的建议吗?我可以提供不带 z 的剪辑坐标,但我需要 z 进行深度测试。
最佳答案
我相信在你的情况下你可以修复片段着色器中的深度(在 ES3 中支持)。您可以使用它来设置深度,同时从该位置移除 Z
坐标。不过,您需要为 Z
组件提供另一个不同的值。
所以在片段着色器中你会得到类似这样的东西:
...
varying zPositionComponent;
...
vac4 actualVertexPosition = ...; // whatever you had in gl_Position
zPositionComponent = actualVertexPosition.z;
gl_Position = vec4(actualVertexPosition.x, actualVertexPosition.y, 0.0, actualVertexPosition.w);
然后在片段着色器中简单地添加片段深度校正作为 gl_FragDepth = zPositionComponent;
注意:我不确定这是否有效,或者您是否真的支持它。您实际上可能需要检查片段的当前深度并丢弃片段(手动执行深度缓冲区),这会使事情复杂化......让我知道它是如何进行的并留下未回答的问题以查看更好的解决方案。
关于c++ - GLES 和无透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41851699/