格莱斯和无视角

GLES and noperspective

本文关键字:      更新时间:2023-10-16

我正在用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"相同。

相关文章:
  • 没有找到相关文章