顶点缓冲区对象打开GL

时间:2011-02-23 23:24:40

标签: c++ opengl vertex-buffer

我是Open GL的新手,我正在尝试构建非弃用的代码。现在我无法掌握的是VBO。这就是我到目前为止所做的全部,请你解释一下我应该做些什么。另外,我有OpenGL编程指南,所以如果你能指出一些阅读的页面也会非常有用。

#include <GL/glew.h>
#include <GL/freeglut.h> 

GLuint ID[2];
GLfloat PositionData[][2] ={{50,50},{100,50},{50,100}, {100,50}, {100, 100}, {50, 100}};
GLfloat Colors[][3] = {{0.1, 0.2, 0.3},{0.1, 0.2, 0.3},{0.1, 0.2, 0.3},{0.1, 0.2, 0.3},{0.1, 0.2, 0.3}};

void init(){
    glewInit();
    glClearColor(1.0, 1.0, 1.0, 0.0);
}

void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glShadeModel(GL_FLAT);
    glGenBuffers(2, ID);
    glBindBuffer(GL_ARRAY_BUFFER, ID[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(PositionData), PositionData, GL_STATIC_DRAW);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, ID[1]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Colors), Colors, GL_STATIC_DRAW);
    glEnableClientState(GL_COLOR_ARRAY);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);

    glDrawArrays(GL_TRIANGLES, 0, 12);

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glDeleteBuffers(2, ID);
    glFlush();
}

void reshape(int w, int h){
    glViewport(0,0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0f, (GLdouble) w, 0.0f, (GLdouble) h);
}

int main(int argc, char *argv[]){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("I don't get VBOs");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}

2 个答案:

答案 0 :(得分:3)

我快速查看了您的代码,有一点突出:您完全忽略了VBO的观点。在每个绘图调用中,您正在创建VBO对象,上传数据,尝试绘制它们(它不起作用,因为提供顶点属性的着色器是错误的)然后删除它们。

VBO的重点是将几何数据上传到GL对象中一次,然后只通过它的抽象对象ID句柄和索引数组来引用它,也可以将它放在缓冲区对象中。

但是在代码中还有很多其他内容,比如在重构回调中设置投影矩阵。首先,在OpenGL-3核心中,您不再拥有这些内置矩阵。这是所有着色的制服。然后在渲染处理程序中按需设置这些矩阵。

我认为我应该写出明确的OpenGL-3核心教程,展示正确的习语。

答案 1 :(得分:2)

您正在设置索引为0和1的自定义顶点属性,但我没有看到使用它们的着色器。如果您还没有着色器,那么它将无效,因为固定功能管道接受特定属性(由glVertexPointerglColorPointer设置)。

如果您决定制作着色器(您的目标是为GL-3核心创建它,对吗?),请不要忘记在链接之前将您的顶点属性与您在GLSL代码中使用的实际名称分配:

glBindAttribLocation( program_id, attribute_id, attribute_variable_name )