2012-01-07 133 views
1

我不能找到从多个顶点缓冲器绘制是否被支撑在OpenGL ES 2.0的多的信息(即用于正常,颜色位置数据的一个顶点缓冲器和另一等)。这页http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html和特别列表9.4意味着你应该能够,但我不能让它在我的程序上工作。代码有问题的绘图调用:的OpenGL ES 2.0,使用多个顶点绘图缓冲器

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

有没有人成功地使用多个顶点缓冲区渲染并可以分享他们为什么这可能无法正常工作经验吗?任何信息在哪里开始调试停滞/失败绘制调用不返回任何错误代码将不胜感激。

回答

1

是的,你可以为一个平局使用多个顶点缓冲对象(维也纳组织)。 OpenGL ES 2.0 spec在第2.9.1节中如此说明。

你真的在你的代码中的所有硬编码的常量? 76从哪里来?

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

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

2

访问冲突通常意味着你正在试图吸引更多的三角形比你在缓冲区已经分配。你设置了缓冲区的方式是完全正常的,应该工作,如果你的参数设置是否正确,我将检查:

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

我觉得您的问题或者是你已经切换偏移和迈向你的glVertexAttribPointer电话,或者你误算了你正在绘制的指数的数量