2013-04-27 24 views
1

所以,我以前使用的顶点数组的缓冲器(纤芯分布3.3),设置如下:卸下调用glGenVertexArrays()的结果在黑屏

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上。因此我开始删除它。还有那个让我发疯的问题。

如果我从数据初始化中删除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()后在代码中更改什么?我做错了什么?

回答

4

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

客户端顶点和索引数组 - 所有顶点数组属性和 元件阵列的索引指针必须引用缓冲对象。 默认的顶点数组对象(名称为零)也被弃用。 调用VertexAttribPointer当没有缓冲对象或无顶点数组 对象绑定将产生一个错误INVALID_OPERATION,如将 调用任何阵列绘图命令时没有顶点数组对象是 界。

+0

谢谢!你刚刚救了我的周末:) – juzzlin 2013-04-27 18:50:02