0

我对 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;
}
4

2 回答 2

3

我快速浏览了您的代码,有一点很突出:您完全忽略了 VBO 的意义。在每次绘制调用中,您都在创建 VBO 对象、上传数据、尝试绘制它们(它不起作用,因为缺少赋予顶点属性意义的着色器)然后删除它们。

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

但是该代码中还有很多其他问题,例如在重塑回调中设置投影矩阵。一方面,在 OpenGL-3 核心中,您不再拥有那些内置矩阵。都是着色器制服。然后在渲染处理程序中按需设置这些矩阵。

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

于 2011-02-24T00:25:09.117 回答
2

您正在使用索引 0 和 1 设置自定义顶点属性,但我没有看到使用它们的着色器。如果您还没有着色器,那么它将无法工作,因为 Fixed-Function 管道接受特定属性(由您的情况设置glVertexPointerglColorPointer

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

glBindAttribLocation( program_id, attribute_id, attribute_variable_name )
于 2011-02-24T00:34:50.330 回答