OpenGL ES 2.0,使用多个顶点缓冲区绘制

时间:2012-01-07 18:57:51

标签: ios arrays opengl-es vertex

我无法找到关于是否在opengl es 2.0上支持从多个顶点缓冲区进行绘制的更多信息(即,对于位置数据使用一个顶点缓冲区,对于普通,颜色等使用另一个顶点缓冲区)。此页面http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html和列表9.4特别暗示您应该能够,但我无法让它在我的程序上工作。违规抽奖电话代码:

glBindBuffer(GL_ARRAY_BUFFER, mPositionBuffer->openglID);
glVertexAttribPointer(0, 4, GL_FLOAT, 0, 16, NULL);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, mTexCoordBuffer->openglID);
glVertexAttribPointer(1, 2, GL_FLOAT, 0, 76, NULL);
glEnableVertexAttribArray(1);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer->openglID);
glDrawElements(GL_TRIANGLES, 10788, GL_UNSIGNED_SHORT, NULL);

此绘制调用将在模拟器上停止或崩溃EXC_BAD_ACCESS,并在设备上给出非常奇怪的行为(opengl绘制随机三角形或呈现先前渲染的帧)。没有opengl调用会返回错误,我已经广泛检查了顶点缓冲区,并确信它们具有正确的大小和数据。

是否有人使用多个顶点缓冲区成功渲染,并可以分享他们为什么可能无法正常工作的经验?任何关于从何处开始调试失败/失败的绘制调用的信息都不会返回任何错误代码。

2 个答案:

答案 0 :(得分:2)

访问冲突通常意味着您正在尝试绘制比在缓冲区中分配的三角形更多的三角形。你设置缓冲区的方式非常好,应该可行,我会检查你的参数设置是否正确:

http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml

我认为您的问题是,您已经在glVertexAttribPointer来电中切换了偏移和跨度,或者您错误地列出了您正在绘制的索引数

答案 1 :(得分:1)

是的,您可以使用多个顶点缓冲对象(VBO)进行单次绘制。 OpenGL ES 2.0 spec在第2.9.1节中说明了这一点。

你的代码中是否真的拥有所有那些硬编码的常量?那76个来自哪里?

如果您需要帮助调试,则需要发布初始化缓冲区的代码(调用glGenBuffersglBufferData的代码)。您还应该发布EXC_BAD_ACCESS的堆栈跟踪。

如果你画了一些更简单的东西,比如一个三角形,而不是3596个三角形,也可能更容易调试。