删除对glGenVertexArrays()的调用会导致黑屏

时间:2013-04-27 17:55:14

标签: vba opengl glsl vbo

所以,我之前使用了顶点数组缓冲区(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()之后我应该在代码中更改什么?我做错了什么?

1 个答案:

答案 0 :(得分:4)

使用用户生成的VAO在GL 3.x核心配置文件中是疯狂的。从3.3核心规范,E2.2删除了功能:

  

客户端顶点和索引数组 - 所有顶点数组属性和   元素数组索引指针必须引用缓冲区对象。的的   默认顶点数组对象(名称为零)也已弃用。   没有缓冲区对象或没有顶点数组时调用VertexAttribPointer   绑定对象会生成INVALID_OPERATION错误,因为它会   没有顶点数组对象时调用任何数组绘图命令   界。