格莱斯和无视角
GLES and noperspective
我正在用OpenGL ES 3.0渲染剪辑坐标中提供的许多三角形。使用变化,我为每个片段生成插值纹理坐标。但是,由于插值使用顶点的 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;
注意:我不确定这是否有效,或者您是否真的对此提供支持。您可能实际上需要检查片段的当前深度并丢弃片段(手动执行深度缓冲区),这可能会使事情复杂化......让我知道它是怎么回事,并留下未回答的问题,以查看一些更好的解决方案。
OpenGL 使用位置的 w 分量来校正透视。有关详细信息,请参阅本规范的等式 13.7。
attribute vec2 a_uv;
varying vec3 v_uv;
vec4 pos = MVP * vertex;
gl_Position = pos;
v_uv = vec3(a_uv * pos.w, pos.w);
然后在片段着色器中:
vec2 uv = v_uv.xy / v_uv.z;
对我有用的解决方案是在顶点着色器中对自己进行持续划分:
gl_Position = MVP * vertex;
gl_Position /= gl_Position.w;
对我来说,这是最明显的解决方案,但之前没有人提到它的事实让我觉得我可能错过了一些东西。无论如何,我自己已经对此进行了测试,结果似乎与使用"noperspective"相同。
相关文章:
- 没有找到相关文章