1

请参阅下面的编辑,它显着改变了问题。

原来的:

我在使用Xcode 4.1iOS 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 的新手,边走边学。

感谢任何指示或澄清。

4

1 回答 1

1

我已经找到了我自己问题的答案。事实证明,我可以将所有数据保存在一个缓冲区中,并为每个渲染指定所需的范围。


设置顶点和索引缓冲区:一组缓冲区包含两个图形(A 和 Z)的数据

glGenBuffers(1, &vertexBufferAll);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferAll);
glBufferData(GL_ARRAY_BUFFER, verticesSizeAll, VerticesAll, GL_STATIC_DRAW);

glGenBuffers(1, &indexBufferAll);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferAll);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesSizeAll, IndicesAll, GL_STATIC_DRAW);

为顶点数组中的数据定义偏移量

glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 0));
glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));

绘制位于索引数组中指定偏移量的元素

glDrawElements(GL_TRIANGLES, indicesCountA, GL_UNSIGNED_SHORT, (GLvoid*) (sizeof(GLushort) * 0));
glDrawElements(GL_TRIANGLES, indicesCountZ, GL_UNSIGNED_SHORT, (GLvoid*) (sizeof(GLushort) * indicesCountA));

在每个 glDrawElements 之前应用适当的矩阵以实现所需的旋转

glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix);

现在我已经开始工作了,它确实看起来很简单而且很明显,但是我必须经历很多变化,直到我偶然发现了正确的设置。感觉就像使用 OpenGL,如果事情不是 100% 正确,那么它们就是不正确的。

于 2012-09-03T19:56:07.023 回答