如何使用Vertex Array对象?

时间:2016-01-04 21:01:32

标签: c++ opengl

我正在尝试使用“OpenGL Superbible 7th edition”一书来学习使用OpenGL 4.5。它解释VAO的方式是:

   GLuint compile_shaders(){
    GLuint vertex_shader;
    GLuint fragment_shader;
    GLuint program;


    //shader code



    //create and compile vertex shader
    vertex_shader=glCreateShader(GL_VERTEX_SHADER);             //create shader object
    glShaderSource(vertex_shader,1,vertex_shader_source,NULL);  //puts shader code in object
    glCompileShader(vertex_shader);             //compiles shader source code

    //create and compile fragment shader
    fragment_shader=glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment_shader,1,fragment_shader_source,NULL);
    glCompileShader(fragment_shader);

    //create program, attach shaders, and link it
    program=glCreateProgram();                //creates program to attach shader objects
    glAttachShader(program,vertex_shader);      //attaches shader to program
    glAttachShader(program,fragment_shader);
    glLinkProgram(program);                     //links all shader objects in program

    //delete shaders because program already has them now
    glDeleteShader(vertex_shader);          //deletes shader (code is already in program)
    glDeleteShader(fragment_shader);



return program;
}


//startup
GLuint program=compile_shaders();
    GLuint vertex_array_object;
    glCreateVertexArrays(1,&vertex_array_object);
    glBindVertexArray(vertex_array_object);


//drawing 
glUseProgram(program);
    glDrawArrays(GL_TRIANGLES,0,3);

每当我尝试编译它时,它会给我一个编译错误,说明没有声明glCreateArrays。如果glCreateVertexArrays不是opengl函数,那么你如何使用VAO?

2 个答案:

答案 0 :(得分:2)

  

每当我尝试编译它时,它会给我一个编译错误,说明没有声明glCreateArrays。

glCreateVertexArrays是一个OpenGL功能,现在已经有一年多了。如果您的程序无法使用它进行编译,那么OpenGL loading library已过期的可能性很大。下载更新的或更换为未损坏的。

答案 1 :(得分:-2)

喜欢这个 -

GLuint VAO;
glGenVertexArrays(1, &VAO); // Generate a vertex array.
glBindVertexArray(VAO); // bind it

我不知道确切的细节,但是你绑定之后所做的一切都将是 存储在VAO内部。

您可以为顶点位置创建一个缓冲区,为颜色创建一个缓冲区。

这样的事情 -

GLuint posVerBuffer;

//Position
glBindBuffer(GL_ARRAY_BUFFER, posVerBuffer);
glBufferData(GL_ARRAY_BUFFER, position.size() * sizeof(glm::vec3), &position[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); // Position

// Similar for the color

完成后你解开它。

glBindVertexArray(0);

现在,每当你想要绘制这个特定的VAO时,你只需绑定它。

glBindVertexArray(VAO);

本教程包含所有内容的页面,并教授现代 OpenGL - http://learnopengl.com/