C++ 没有远见
我正在使用OpenGL ES 3.0渲染剪辑坐标中提供的许多三角形。使用一个不同的方法,我为每个片段生成插值纹理坐标。但是,由于插值使用顶点的z坐标,因此插值在屏幕空间中不是线性的。据我所知,GLES不支持noperspective限定符,该限定符应该满足我的要求C++ 没有远见,c++,opengl-es,C++,Opengl Es,我正在使用OpenGL ES 3.0渲染剪辑坐标中提供的许多三角形。使用一个不同的方法,我为每个片段生成插值纹理坐标。但是,由于插值使用顶点的z坐标,因此插值在屏幕空间中不是线性的。据我所知,GLES不支持noperspective限定符,该限定符应该满足我的要求 您是否有解决方法的建议?我可以提供没有z的剪辑坐标,但我需要z进行深度测试。我相信在您的情况下,您可以在片段着色器(ES3支持)中修复深度。在从位置移除Z坐标时,您可以使用它来设置深度。但是,Z组件需要另一个不同的值 因此,在片段着色
您是否有解决方法的建议?我可以提供没有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_fragdepth,但它将消除我希望避免的早期深度测试。事情变得复杂了。但可能没有更好的解决方案。。。我猜你可以用深度缓冲区将形状“ID”写入模具缓冲区,然后在没有Z坐标的情况下重新绘制它们,但这听起来更糟。。也许如果你添加一些关于你到底在做什么的更多信息。基本上,我正在绘制一些广告牌/2D四边形,但是几何体仍然应该与场景的其余部分进行正确的z测试。