GLES并没有

时间:2017-01-25 12:29:18

标签: c++ opengl-es

我使用OpenGL ES 3.0渲染剪辑坐标中提供的多个三角形。使用变化,我为每个片段生成插值纹理坐标。然而,由于插值使用顶点的z坐标,因此插值在屏幕空间中不是线性的。据我所知,GLES不支持那些据称可以做我想要的无差别资格赛。

您有推荐的解决方法吗?我可以提供没有z的剪辑坐标,但我需要z进行深度测试。

此致

2 个答案:

答案 0 :(得分:1)

我相信你可以在片段着色器中修复深度(在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;

注意:我不确定这是否有效,或者您是否真的得到了支持。您可能实际上需要检查片段的当前深度并丢弃片段(手动执行深度缓冲),这可能会使事情变得复杂......让我知道它是怎么回事并让问题无法解决,请看一些更好的解决方案。

答案 1 :(得分:0)

OpenGL使用w位置组件来纠正透视。有关详细信息,请参阅此specification的公式13.7。

vec2 uv = v_uv.xy / v_uv.z;

然后在片段着色器中:

switch