C++ 如何使用顶点数组对象?

C++ 如何使用顶点数组对象?,c++,opengl,C++,Opengl,我正试图通过《OpenGL超级圣经第七版》一书来学习使用OpenGL 4.5。它解释VAOs的方式如下: GLuint compile_shaders(){ GLuint vertex_shader; GLuint fragment_shader; GLuint program; //shader code //create and compile vertex shader vertex_shader=glCreateShader

我正试图通过《OpenGL超级圣经第七版》一书来学习使用OpenGL 4.5。它解释VAOs的方式如下:

   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。如果GLCreateVertexArray不是opengl函数,那么如何使用VAOs?

像这样-

GLuint VAO;
glGenVertexArrays(1, &VAO); // Generate a vertex array.
glBindVertexArray(VAO); // bind it
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
我不知道确切的细节,但你在绑定后所做的一切都将是 存储在VAO内部

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

类似这样的事情-

GLuint VAO;
glGenVertexArrays(1, &VAO); // Generate a vertex array.
glBindVertexArray(VAO); // bind it
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-

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


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

他正在尝试使用ARB_direct_state_access函数,这是OpenGL的核心,从4.5开始使用。名为
glCreateVertexArrays
的函数不是吗?@BDL:他发布的实际代码使用了正确的函数名。;)