我想在OpenGL ES 2.0顶点数组对象来保存从不同的缓冲区两个属性,第二缓冲正从客户端存储器(glBindBuffer(GL_ARRAY_BUFFER, 0)
)读但是我得到一个运行时错误:OES_vertex_array_object和客户端状态
GLuint my_vao;
GLuint my_buffer_attrib0;
GLfloat attrib0_data[] = { 0, 0, 0, 0 };
GLfloat attrib1_data[] = { 1, 1, 1, 1 };
void init()
{
// setup vao
glGenVertexArraysOES(1, &my_vao);
glBindVertexArrayOES(my_vao);
// setup attrib0 as a vbo
glGenBuffers(1, &my_buffer_attrib0);
glBindBuffer(GL_ARRAY_BUFFER, my_buffer_attrib0);
glBufferData(GL_ARRAY_BUFFER, sizeof(attrib0_data), attrib0_data, GL_STATIC_DRAW);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
// "end" vao
glBindVertexArrayOES(0);
}
void draw()
{
glBindVertexArrayOES(my_vao);
// (now I assume attrib0 is bound to my_buffer_attrib0,
// and attrib1 is not bound. but is this assumption true?)
// setup attrib1
glBindBuffer(GL_ARRAY_BUFFER, 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, attrib1_data);
// draw using attrib0 and attrib1
glDrawArrays(GL_POINTS, 0, 1); // runtime error: Thread1: EXC_BAD_ACCESS (code=2, address=0x0)
}
我想实现的是包裹两个属性的结合为顶点数组缓存:
void draw_ok()
{
glBindVertexArrayOES(0);
// setup attrib0
glBindBuffer(GL_ARRAY_BUFFER, my_buffer_attrib0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
// setup attrib1
glBindBuffer(GL_ARRAY_BUFFER, 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, attrib1_data);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
// draw using attrib0 and attrib1
glDrawArrays(GL_POINTS, 0, 1); // ok
}
是否可以结合两个不同缓冲区的顶点数组对象? OES_vertex_array_object与(普通)OpenGL顶点数组对象不同吗?另请注意,我在运行iOS模拟器的XCode中出现此错误。这些都是相关链接:
- Use of VAO around VBO in Open ES iPhone app Causes EXC_BAD_ACCESS When Call to glDrawElements
- OES_vertex_array_object
因为你不是我,所以你得到了接受的答案,如果OES-VAO与桌面-VAO相同,也会得到答案:)谢谢。 – telephone 2012-03-04 16:54:35