C++ 顶点缓冲区对象打开GL
我对OpenGL非常陌生,我正在尝试构建非弃用代码。现在我不能理解的是VBO。到目前为止我只知道这些,你能解释一下我应该做什么吗。另外,我有OpenGL编程指南,所以如果你能指出一些要阅读的页面,那也会非常有帮助C++ 顶点缓冲区对象打开GL,c++,opengl,vertex-buffer,C++,Opengl,Vertex Buffer,我对OpenGL非常陌生,我正在尝试构建非弃用代码。现在我不能理解的是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
#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;
}
#包括
#包括
GLuint-ID[2];
GLfloat PositionData[][2]={{50,50}、{100,50}、{50100}、{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);
}
无效显示(){
glClear(GLU颜色缓冲位);
glShadeModel(GLU平面);
glGenBuffers(2,ID);
glBindBuffer(GL_数组_BUFFER,ID[0]);
glBufferData(GLU数组缓冲区、sizeof(位置数据)、位置数据、GLU静态图);
glEnableClientState(GL_顶点_数组);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,0);
GlenableVertexAttributeArray(0);
glBindBuffer(GL_数组_BUFFER,ID[1]);
glBufferData(GLU数组缓冲区、大小(颜色)、颜色、GLU静态图);
glEnableClientState(GL_颜色_阵列);
glvertexattributepointer(1,3,GL_FLOAT,GL_FALSE,0,0);
GlenableVertexAttributeArray(1);
gldrawArray(GL_三角形,0,12);
glDisableVertexAttributeArray(0);
glDisableVertexAttributeArray(1);
gldeletembuffers(2,ID);
glFlush();
}
空洞重塑(整数w,整数h){
gl(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_投影);
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(500500);
位置(100100);
glutCreateWindow(“我没有VBO”);
init();
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
glutMainLoop();
返回0;
}
我快速浏览了一下您的代码,有一点很突出:您完全没有理解VBOs的要点。在创建VBO对象的每个绘制调用中,上载数据,尝试绘制它们(这不起作用,因为赋予顶点属性意义的着色器出错),然后删除它们
VBO的整个要点是将几何体数据上载到GL对象中一次,然后仅通过其抽象对象ID句柄和索引数组引用它,也可以将其放置在缓冲区对象中
但代码中还有很多其他的东西,比如在重塑回调中设置投影矩阵。首先,在OpenGL-3内核中,你不再有那些内置的矩阵了。都是我的制服。然后在渲染处理程序中根据需要设置这些矩阵
我想我真的应该写一篇权威性的OpenGL-3核心教程,演示正确的习惯用法。我快速浏览了一下您的代码,有一点很突出:您完全没有理解VBOs的要点。在创建VBO对象的每个绘制调用中,上载数据,尝试绘制它们(这不起作用,因为赋予顶点属性意义的着色器出错),然后删除它们 VBO的整个要点是将几何体数据上载到GL对象中一次,然后仅通过其抽象对象ID句柄和索引数组引用它,也可以将其放置在缓冲区对象中 但代码中还有很多其他的东西,比如在重塑回调中设置投影矩阵。首先,在OpenGL-3内核中,你不再有那些内置的矩阵了。都是我的制服。然后在渲染处理程序中根据需要设置这些矩阵
我想我真的应该写一篇权威的OpenGL-3核心教程,演示正确的习惯用法。您正在使用索引0和1设置自定义顶点属性,但我没有看到使用它们的着色器。如果您还没有着色器,那么它将无法工作,因为固定函数管道接受特定属性(根据您的情况由
glVertexPointer
和glColorPointer
设置)
如果您决定制作着色器(您的目标是为GL-3 core制作着色器,对吗?),请在链接之前,不要忘记使用GLSL代码中使用的实际名称指定顶点属性:
glBindAttribLocation( program_id, attribute_id, attribute_variable_name )
您正在使用索引0和1设置自定义顶点属性,但我没有看到使用它们的着色器。如果您还没有着色器,那么它将无法工作,因为固定函数管道接受特定属性(根据您的情况由
glVertexPointer
和glColorPointer
设置)
如果您决定制作着色器(您的目标是为GL-3 core制作着色器,对吗?),请在链接之前,不要忘记使用GLSL代码中使用的实际名称指定顶点属性:
glBindAttribLocation( program_id, attribute_id, attribute_variable_name )
请在你的问题中更具体一些…如果你想要一个完整的VBO教程,这不是IMHO的地方。这会很好,但我想找出我的代码有什么问题。此外,如果你可以发布一个完整教程的链接,那么这个问题可能会得到它的回答。如果你的代码没有按预期工作,那么请在你的问题中说明。现在还不清楚你想要什么。请在你的问题中更具体一些……如果你想要一个完整的VBO教程,这不是IMHO的地方。这会很好,但我想找出我的代码有什么问题。此外,如果你可以发布一个完整教程的链接,那么这个问题可能会得到它的回答。如果你的代码没有按预期工作,那么请在你的问题中说明。不清楚您要的是什么。
glVertexPointer
和glColorPointer
即使使用自定义着色器也应继续工作。据我所知,glvertexpinter
甚至需要将其他属性输入到系统中,因为glDrawArrays
表示“如果未启用GL_VERTEX_数组,则不会生成几何图元。”@Ben Voigt。它们肯定会起作用的(我是说