【发布时间】:2014-12-08 21:41:09
【问题描述】:
我即将实现一个非常基本的渲染模块。现在是时候改变使用 VBO 将原语渲染为现代方法的旧方法了,到目前为止,我了解它是如何工作的,但我无法让我的 PoC 正常工作。
加载基本模型(三角形)没有产生opengl错误(glBindVertexArray是glBindVertexArrayAPPLE的宏):
float pos[] = {
-1.0f, -1.0f,-5.0f,
-1.0f, 1.0f, -5.0f,
1.0f,1.0f,-5.0f,
};
printf("%d %d", map_VAO, map_VBO);
checkGLError();
glGenVertexArrays(1, &map_VAO);
checkGLError();
glGenBuffers(1, &map_VBO);
printf("%d %d", map_VAO, map_VBO); // here with 4.1 map_VAO is 0
checkGLError();
glEnableClientState(GL_VERTEX_ARRAY);
glBindVertexArrays(map_VAO);
glBindBuffer(GL_ARRAY_BUFFER, map_VBO);
glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), &pos[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArrays(0);
glDisableClientState(GL_VERTEX_ARRAY);
return 0;
并且在主循环中(绘图部分):
// .. clear buffers load identity etc...
glColor3f(0.33f,0.0f,0.0f);
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, map_VBO);
glBindVertexArrayAPPLE(map_VAO);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindBuffer(GL_ARRAY_BUFFER, 0 );
glBindVertexArrayAPPLE(0);
glDisableClientState(GL_VERTEX_ARRAY);
新的绘图部分:(删除不必要的客户端状态和绑定)
glColor3f(0.33f,0.0f,0.0f);
glBindVertexArrayAPPLE(map_VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
但是什么都没有显示。我曾尝试更改配置文件和 OpenGL 版本,但出现了其他问题。 我可以用旧方法画一个简单的三角形:
glBegin(GL_TRIANGLES);
glVertex3f( -1.0f, -1.0f, -5.0f);
glVertex3f( -1.0f, 1.0f, -5.0f);
glVertex3f( 1.0f, 1.0f,-5.0f);
glEnd();
问题:我做错了什么?,有某种与 VBO 和 VAO 相关的激活?
其他问题:为什么当我使用 open gl 4.1 Core 配置文件时,我无法使用 genVertexArray 获得 VAO 名称? (它说无效操作)
【问题讨论】: