我想在OpenGL ES 2.0中组织对象的深度,以便我可以将一个对象指定在其他对象的前面(只发送统一变量)。如果我想单独绘制两条线,我只需指定哪条线更接近。
我使用Qt及其OpenGL支持。当我倾向于使用gl_FragDepth时,它会给我链接错误,说明gl_FragDepth是未声明的标识符。
另外,我在顶点着色器中试过像gl_Position.z = depthAttr;
这样的东西,其中depthAttr是渲染对象的统一变量。
有人可以告诉我我还能做什么,或者我做错了什么?有首选方式吗?
答案 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,但当然,请准备好在无法使用时退回。