基本顶点缓冲区示例不起作用

时间:2014-12-08 21:41:10

标签: c opengl

我即将实现一个非常基本的渲染模块。现在是时候改变使用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);

新绘图部分:(删除不必要的clientstate和绑定)

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 profile时,我无法获得带有genVertexArray的VAO名称? (它表示无效操作)

2 个答案:

答案 0 :(得分:5)

一些事情:

  1. glEnableClientState已弃用。 glEnableClientState用于告诉OpenGL您使用顶点数组来实现您不再使用的固定功能,因此调用此函数是没有用的(并且可能会导致奇怪结果)。
  2. glEnableVertexAttribArray(0);无需在绘图功能中再次启用它。启用第0个顶点属性存储在VAO中。
  3. glBindBuffer(GL_ARRAY_BUFFER, map_VBO);此外,无需在绘图功能中调用此函数。配置VAO时glVertexAttribPointer存储VBO绑定。
  4. 因此,删除glEnable/Disable-ClientState函数并记住您只需在您的情况下绑定VAO。我相信你的错误的原因是第1点。第2点和第3点只是为了改进你的代码;)

答案 1 :(得分:3)

你没有在glGenVertexArrays周围glGenVertexArraysAPPLE包裹吗? (就像你提到的那样glBindVertexArray

OS X上的核心配置文件中不存在该功能,您会注意到扩展字符串中明显缺少GL_APPLE_vertex_array_object。它存在于Legacy(2.1)个人资料as seen here中,但不存在于Core(3.2 +)as seen here中。

在OS X上使用核心配置文件并调用#include <OpenGL/gl3.h>而不是glGenVertexArrays (...)时,您应该glGenVertexArraysAPPLE (...)

仅在OS X上的OpenGL 2.1上下文中调用VertexArray*APPLE函数,否则会出现GL_INVALID_OPERATION错误。