使用未声明的标识符“gl_InstanceID”

大家好,我一直在iOS平台上尝试OpenGLES2.0中的Instanced绘图。 我的渲染代码

glEnableVertexAttribArray(...); glVertexAttribPointer(...) glDrawElementsInstancedEXT(GL_TRIANGLES,IndicesCount, GL_UNSIGNED_SHORT, 0, 5); 

和我的顶点着色器

 attribute vec4 VertPosition; uniform mat4 mvpMatrix[600]; void main() { gl_Position = (mvpMatrix[gl_InstanceID]) * VertPosition; } 

我收到错误:使用未声明的标识符'gl_InstanceID'

我的glsl版本是1.0,如果版本是问题,那我该如何升级? 任何其他方式在GLSL中使用“gl_InstanceID”?

gl_InstanceID只能从GLSL ES 3.0开始使用,如此处所述。

所以,正如你所猜测的那样,这是一个版本问题。 据我所知,OpenGL ES 2.0中唯一可用的GLSL ES版本是GLSL ES 1.0,如果你想使用更高的GLSL ES版本,你必须升级到OpenGL ES 3.0。 (更多细节在这里 )

编辑:我正在考虑你想用gl_InstanceID的用法实现。 这个variables只有在使用其中一个实例化绘图命令(glDrawArraysInstanced等)时才有意义,这些命令在ES 2.0中也是不可用的。

显然,可以使用GL_EXT_draw_instanced扩展在OpenGL ES 2.0中使用实例化渲染。 这个扩展提供了一个额外的绘图命令(glDrawElementsInstancedEXT和glDrawArraysInstancedEXT)。 使用扩展名时,必须在着色器中启用它

 #extension GL_EXT_draw_instanced : enable 

并使用gl_InstanceIDEXT而不是gl_InstanceID。