1

我找不到太多关于opengl es 2.0是否支持从多个顶点缓冲区绘制的信息(即,使用一个顶点缓冲区用于位置数据,另一个用于法线、颜色等)。此页面 http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html特别是清单 9.4 意味着您应该能够,但我无法做到在我的程序上工作。违规draw call的代码:

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 调用会返回错误,我已经广泛检查了顶点缓冲区,并且确信它们具有正确的大小和数据。

有没有人使用多个顶点缓冲区成功渲染,并且可以分享他们为什么这可能不起作用的经验?任何有关从何处开始调试不返回任何错误代码的停滞/失败的绘图调用的信息将不胜感激。

4

2 回答 2

2

访问冲突通常意味着您尝试绘制的三角形数量超过了在缓冲区中分配的数量。您设置缓冲区的方式非常好并且应该可以工作,我会检查您的参数是否设置正确:

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

我认为您的问题要么是您在glVertexAttribPointer通话中切换了偏移量和步幅,要么您计算错了要绘制的索引数量

于 2012-01-07T20:25:07.790 回答
1

是的,您可以使用多个顶点缓冲区对象 (VBO) 进行一次绘制。OpenGL ES 2.0 规范在 2.9.1 节中这样说。

你的代码中真的有所有这些硬编码的常量吗?那个 76 是从哪里来的?

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

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

于 2012-01-07T20:22:57.380 回答