所以,我之前使用了顶点数组缓冲区(Core Profile 3.3),设置如下:
int offset = 0;
glGenVertexArrays(1, &m_vba);
glBindVertexArray(m_vba);
glGenBuffers(1, &m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, TOTAL_DATA_SIZE, nullptr, GL_STATIC_DRAW);
// Vertex data
glBufferSubData(GL_ARRAY_BUFFER, offset, VERTEX_DATA_SIZE, vertices);
offset += VERTEX_DATA_SIZE;
// Normal data
glBufferSubData(GL_ARRAY_BUFFER, offset, NORMAL_DATA_SIZE, normals);
offset += NORMAL_DATA_SIZE;
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, reinterpret_cast<GLvoid *>(VERTEX_DATA_SIZE));
我没有使用索引缓冲区。像这样渲染:
glBindVertexArray(m_vba);
glDrawArrays(GL_TRIANGLES, 0, NUM_VERTICES);
这完全没问题。但是,我发现glGenVertexArrays()可能不可用,例如在Android上。因此我开始删除它。还有一个让我疯狂的问题。
如果我从数据init中删除vba内容,如下所示:
int offset = 0;
glGenBuffers(1, &m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, TOTAL_DATA_SIZE, nullptr, GL_STATIC_DRAW);
// Vertex data
glBufferSubData(GL_ARRAY_BUFFER, offset, VERTEX_DATA_SIZE, vertices);
offset += VERTEX_DATA_SIZE;
// Normal data
glBufferSubData(GL_ARRAY_BUFFER, offset, NORMAL_DATA_SIZE, normals);
offset += NORMAL_DATA_SIZE;
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, reinterpret_cast<GLvoid *>(VERTEX_DATA_SIZE));
..并像这样呈现:
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, reinterpret_cast<GLvoid *>(VERTEX_DATA_SIZE));
glDrawArrays(GL_TRIANGLES, 0, NUM_VERTICES);
..我只是一个黑屏。而我不明白的是,如果我在代码中的某处添加,例如数据设置后:
GLuint foo;
glGenVertexArrays(1, &foo);
glBindVertexArray(foo);
然后一切都正确再现。是否有一些副作用导致这种情况?我没有在安装后再次绑定这个“foo”缓冲区,尽管多个对象使用它们自己的类似缓冲区后续渲染,它仍然有效!
显然事情并没有像我预测的那样去:)问题是,在删除glGenVertexArrays()之后我应该在代码中更改什么?我做错了什么?
答案 0 :(得分:4)
使用用户生成的VAO在GL 3.x核心配置文件中是疯狂的。从3.3核心规范,E2.2删除了功能:
客户端顶点和索引数组 - 所有顶点数组属性和 元素数组索引指针必须引用缓冲区对象。的的 默认顶点数组对象(名称为零)也已弃用。 没有缓冲区对象或没有顶点数组时调用VertexAttribPointer 绑定对象会生成INVALID_OPERATION错误,因为它会 没有顶点数组对象时调用任何数组绘图命令 界。