如何使用“顶点阵列”对象

How to use Vertex Array objects?

本文关键字:顶点阵列 对象 阵列 顶点 何使用      更新时间:2023-10-16

我正在尝试使用"OpenGL Superbible第7版"一书学习使用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?

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

glCreateVertexArrays是一个OpenGL函数,已经使用了一年多了。如果你的程序不能用它编译,那么OpenGL加载库很可能已经过时了。下载一个更新的,或者切换到一个未损坏的。

像这样-

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/