Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 没有远见_C++_Opengl Es - Fatal编程技术网

C++ 没有远见

C++ 没有远见,c++,opengl-es,C++,Opengl Es,我正在使用OpenGL ES 3.0渲染剪辑坐标中提供的许多三角形。使用一个不同的方法,我为每个片段生成插值纹理坐标。但是,由于插值使用顶点的z坐标,因此插值在屏幕空间中不是线性的。据我所知,GLES不支持noperspective限定符,该限定符应该满足我的要求 您是否有解决方法的建议?我可以提供没有z的剪辑坐标,但我需要z进行深度测试。我相信在您的情况下,您可以在片段着色器(ES3支持)中修复深度。在从位置移除Z坐标时,您可以使用它来设置深度。但是,Z组件需要另一个不同的值 因此,在片段着色

我正在使用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_fragdepth,但它将消除我希望避免的早期深度测试。事情变得复杂了。但可能没有更好的解决方案。。。我猜你可以用深度缓冲区将形状“ID”写入模具缓冲区,然后在没有Z坐标的情况下重新绘制它们,但这听起来更糟。。也许如果你添加一些关于你到底在做什么的更多信息。基本上,我正在绘制一些广告牌/2D四边形,但是几何体仍然应该与场景的其余部分进行正确的z测试。