【问题标题】:OpenGL ES 2.0 rendering with glDrawElements only displays a single VBO使用 glDrawElements 渲染的 OpenGL ES 2.0 仅显示单个 VBO
【发布时间】:2012-08-31 04:22:15
【问题描述】:

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

原文:

我在使用 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 方面的新手,并且在学习过程中不断学习。

感谢任何指示或澄清。

【问题讨论】:

    标签: ios opengl-es opengl-es-2.0


    【解决方案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% 正确,那就是不正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      相关资源
      最近更新 更多