在OpenGL ES 2.0中渲染对象深度

时间:2014-09-07 09:15:35

标签: c++ qt opengl-es-2.0

我想在OpenGL ES 2.0中组织对象的深度,以便我可以将一个对象指定在其他对象的前面(只发送统一变量)。如果我想单独绘制两条线,我只需指定哪条线更接近。

我使用Qt及其OpenGL支持。当我倾向于使用gl_FragDepth时,它会给我链接错误,说明gl_FragDepth是未声明的标识符。

另外,我在顶点着色器中试过像gl_Position.z = depthAttr;这样的东西,其中depthAttr是渲染对象的统一变量。

有人可以告诉我我还能做什么,或者我做错了什么?有首选方式吗?

2 个答案:

答案 0 :(得分:0)

ES 2.0不支持预定义的片段着色器输出变量gl_FragDepth。它仅在完整的OpenGL和ES 3.0或更高版本中可用。

如果您确实要使用统一变量指定深度,则需要在顶点着色器中使用统一变量,并使用它来计算gl_Position。你问题的这种方法看起来很好:

uniform float depthAttr;
...
gl_Position = ...;
gl_Position.z = depthAttr;

更标准的方法是制作位置坐标的所需深度部分。如果您当前使用2D坐标绘制线条,只需将所需深度添加为第三个坐标,并将顶点着色器中的位置属性从vec2更改为vec3。然后深度将作为属性的一部分到达着色器,并且不需要额外的统一变量。

答案 1 :(得分:0)

OpenGL ES 2.0支持可选扩展名EXT_frag_depth,允许片段着色器指定gl_FragDepthEXT

请参阅specification,但当然,请准备好在无法使用时退回。