我是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;
}
答案 0 :(得分:3)
我快速查看了您的代码,有一点突出:您完全忽略了VBO的观点。在每个绘图调用中,您正在创建VBO对象,上传数据,尝试绘制它们(它不起作用,因为提供顶点属性的着色器是错误的)然后删除它们。
VBO的重点是将几何数据上传到GL对象中一次,然后只通过它的抽象对象ID句柄和索引数组来引用它,也可以将它放在缓冲区对象中。
但是在代码中还有很多其他内容,比如在重构回调中设置投影矩阵。首先,在OpenGL-3核心中,您不再拥有这些内置矩阵。这是所有着色的制服。然后在渲染处理程序中按需设置这些矩阵。
我认为我应该写出明确的OpenGL-3核心教程,展示正确的习语。
答案 1 :(得分:2)
您正在设置索引为0和1的自定义顶点属性,但我没有看到使用它们的着色器。如果您还没有着色器,那么它将无效,因为固定功能管道接受特定属性(由glVertexPointer
和glColorPointer
设置)。
如果您决定制作着色器(您的目标是为GL-3核心创建它,对吗?),请不要忘记在链接之前将您的顶点属性与您在GLSL代码中使用的实际名称分配:
glBindAttribLocation( program_id, attribute_id, attribute_variable_name )