c_cpp 使用VAO(顶点数组对象)和顶点缓冲区定义和绘制矩形。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 使用VAO(顶点数组对象)和顶点缓冲区定义和绘制矩形。相关的知识,希望对你有一定的参考价值。

/* Example class for rendering a rectangle using OpenGL 4, using a vertex buffer and a
 * vertex array object and the triangle strip primitive.
 * 
 * Note: GL calls are wrapped into a variadic macro of the form GL(func, arg1, arg2,...).
 */
class opengl_rectangle {
  
public:

    void  get_resources()
    {
        // Generate a vertex buffer
        GL(GenBuffers, 1, &vertex_buffer);
    
        // Define a VAO (Vertex Array Object)
        GL(GenVertexArrays, 1, &vao);
        GL(BindVertexArray, vao);
        // Vertex buffer
        GL(BindBuffer, GL_ARRAY_BUFFER, vertex_buffer);
        // Example vertex layout: vec4 vertex coordinates, vec2 texture coordinates
        // Vertex attrib 0: vertex coordinates
        GL(VertexAttribPointer, 0, 4, GL_FLOAT, GL_FALSE, sizeof(vertex_data), (const GLvoid *)0);
        GL(EnableVertexAttribArray, 0);
        // Vertex attrib 1: texture coordinates
        GL(VertexAttribPointer, 1, 2, GL_FLOAT, GL_FALSE, sizeof(vertex_data), (const GLvoid *)(4 * sizeof(GLfloat)));
        GL(EnableVertexAttribArray, 1);
        // Done
        GL(BindVertexArray, 0);
    }
    
    void free_resources()
    {
        GL(DeleteVertexArrays, 1, &vao); vao = 0;
        GL(DeleteBuffers, 1, &vertex_buffer); vertex_buffer = 0;
    }

    void set_bounds(GLfloat w, GLfloat h, GLfloat x = -1, GLfloat y = -1)
    {
        vertex_data vertices[4] = {
            // Example vertex layout: vec4 (x,y,z,w) vertex coordinates, 
            //   vec2(u,v) texture coordinates
            { { x    , y    , 0, 1 }, { 0, 0 } },
            { { x + w, y    , 0, 1 }, { 1, 0 } },
            { { x    , y + h, 0, 1 }, { 0, 1 } },
            { { x + w, y + h, 0, 1 }, { 1, 1 } }
        };
        
        GL(BindBuffer, GL_ARRAY_BUFFER, vertex_buffer);
        GL(BufferData, GL_ARRAY_BUFFER, 4 * sizeof(vertex_data), vertices, GL_STATIC_DRAW);
        GL(BindBuffer, GL_ARRAY_BUFFER, 0);
    }
    
    /** glUseProgram() and glBindTexture() must be called before calling draw().
     */
    void draw()
    {
        GL(BindVertexArray, vao);
        GL(DrawArrays, GL_TRIANGLE_STRIP, 0, 4);
        GL(BindVertexArray, 0);
    }
    
private:
    GLuint vao;
    GLuint vertex_buffer;
};

以上是关于c_cpp 使用VAO(顶点数组对象)和顶点缓冲区定义和绘制矩形。的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 顶点数组/缓冲区对象

绑定到“顶点数组对象”后,我应该删除“顶点缓冲区对象”吗?

OpenGL 顶点数组对象是存储顶点缓冲区名称和索引,还是只存储索引?

在两个不同的顶点数组对象中使用顶点缓冲区

初识OpenGL (-)VAO顶点数组对象

初识OpenGL (-)VAO顶点数组对象