请参阅下面的编辑,它显着改变了问题。
原来的:
我在使用Xcode 4.1在iOS 4上使用OpenGL ES 2.0渲染元素时遇到问题。
使用glDrawElements可以正常显示,没有任何问题:
glDrawElements(GL_TRIANGLES, indicesSizeAll/sizeof(IndicesAll[0]), GL_UNSIGNED_SHORT, 0);
但是如果我使用等效的glDrawRangeElements我会遇到各种问题:
glDrawRangeElements(GL_TRIANGLES, 0, (indicesSizeAll/sizeof(IndicesAll[0]))-1, indicesSizeAll/sizeof(IndicesAll[0]), GL_UNSIGNED_SHORT, 0);
我收到以下构建警告:
Semantic Issue: Implicit declaration of function 'glDrawRangeElements' is invalid in C99
并在执行过程中出现以下错误:
Program received signal: "EXC_BAD_ACCESS"
我包含了这个函数原型:
extern void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
它摆脱了构建警告,但我仍然有执行错误。
不太确定如何解决这个问题。我一步一步地做一些事情来展示,但向前看,我相信我将需要使用glDrawRangeElements,所以我正在努力让它发挥作用。有人对我有一些指导吗?
编辑:
引起我注意的是:
DrawRangeElements 在 OpenGL ES 1.1 或 2.0 中不存在,这就是它不在系统头文件中的原因。您应该改为调用 glDrawElements。
这让我回到了我之前认为glDrawRangeElements可以解决我的问题的情况。
这意味着我需要使用多个缓冲区来渲染所有内容,因为我想对每个缓冲区应用不同的旋转。
[modelView rotateBy:CC3VectorMake(x, y, z)];
glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix);
我设置了两个不同的缓冲区:
glGenBuffers(1, &vertexBufferA);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferA);
glBufferData(GL_ARRAY_BUFFER, verticesSizeA, VerticesA, GL_STATIC_DRAW);
glGenBuffers(1, &indexBufferA);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferA);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesSizeA, IndicesA, GL_STATIC_DRAW);
--------------------
glGenBuffers(1, &vertexBufferZ);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferZ);
glBufferData(GL_ARRAY_BUFFER, verticesSizeZ, VerticesZ, GL_STATIC_DRAW);
glGenBuffers(1, &indexBufferZ);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferZ);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesSizeZ, IndicesZ, GL_STATIC_DRAW);
然后当我想渲染这些元素时:
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferA);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferA);
glDrawElements(GL_TRIANGLES, indicesSizeA/sizeof(IndicesA[0]), GL_UNSIGNED_SHORT, 0);
--------------------
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferZ);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferZ);
glDrawElements(GL_TRIANGLES, indicesSizeZ/sizeof(IndicesZ[0]), GL_UNSIGNED_SHORT, 0);
对glDrawElements的一次调用就可以很好地渲染,但是如果我为每个缓冲区调用它,则只有第二次调用会进行任何渲染。
不完全确定我在这里缺少什么。我是整个 OpenGL 的新手,边走边学。
感谢任何指示或澄清。