Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 顶点缓冲区对象打开GL_C++_Opengl_Vertex Buffer - Fatal编程技术网

C++ 顶点缓冲区对象打开GL

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

我对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, 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。它们肯定会起作用的(我是说