GLES2学习VBO和VAO的使用

Posted For The Glory

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GLES2学习VBO和VAO的使用相关的知识,希望对你有一定的参考价值。

在GLES2中使用VBO和VAO对象,已经简单vs,ps绘制一个三角形。

1. 初始化操作代码,创建VBO、VAO,编译和链接shader program。

void DebugApplication::TestCreateVBO()
    {
        //顶点shader
        const GLchar* vertexShaderSrc = "#version 100\n"
            "attribute vec4 a_position;  \n"   // 输入顶点属性,从外部传入
            "void main()\n"
            "{\n"
            "gl_Position = vec4(a_position.x, a_position.y, a_position.z, 1.0);\n"
            "}\n\0";

        //片段shader
        const GLchar* fragmentShaderSrc = "#version 100\n"
            "void main()\n"
            "{\n"
            "gl_FragColor = vec4(1.0,0.5,0.5,1.0);\n"                //随意指定一个输出颜色
            "}\n\0";


        //创建一个vertex shader
        GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vertexShader, 1, &vertexShaderSrc, NULL); //指定shader代码
        glCompileShader(vertexShader);            //编译shader

        //检查是否编译成功
        GLint status;
        GLchar szInfo[512];
        glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status);
        if (status != 1)
        {
            GLint realSize;
            glGetShaderInfoLog(vertexShader, 512, &realSize, szInfo);
            std::cout << " Vertex Shader Error : " << szInfo << std::endl;
            glDeleteShader(vertexShader);
            return;
        }

        //创建片段shader
        GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fragShader, 1, &fragmentShaderSrc, NULL);
        glCompileShader(fragShader);

        //检查是否编译成功
        glGetShaderiv(fragShader, GL_COMPILE_STATUS, &status);
        if (status != 1)
        {
            GLint realSize;
            glGetShaderInfoLog(fragShader, 512, &realSize, &szInfo[0]);
            std::cout << " Fragment Shader Error : " << szInfo << std::endl;
            glDeleteShader(vertexShader);
            glDeleteShader(fragShader);
            return;
        }

        //链接Shader到Program
        GLuint shaderProgram = glCreateProgram();
        glAttachShader(shaderProgram, vertexShader);
        glAttachShader(shaderProgram, fragShader);
        glLinkProgram(shaderProgram);
        //检查是否有链接错误
        glGetProgramiv(shaderProgram, GL_LINK_STATUS, &status);
        if (!status)
        {
            GLint realSize;
            glGetShaderInfoLog(shaderProgram, 512, &realSize, &szInfo[0]);
            std::cout << "Programe Link  Error : " << szInfo << std::endl;
            glDeleteShader(vertexShader);
            glDeleteShader(fragShader);
            glDeleteProgram(shaderProgram);
            return;
        }
        m_shader = shaderProgram;

        //设置顶点缓存
        GLfloat vertices[] = {
            -0.5f,-0.5f, 0.f,
            0.5f, -0.5f, 0.f,
            0,    0.5f,  0.f
        };
        //创建vbo vao
        GLuint VBO, VAO;
        glGenBuffers(1, &VBO);
        glGenVertexArrays(1, &VAO);

        //绑定VAO对象
        glBindVertexArray(VAO);
        //复制顶点数组到顶点缓冲区中
        glBindBuffer(GL_ARRAY_BUFFER,VBO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

        //获取vertex attribute "a_position"的入口点
        GLuint location = glGetAttribLocation(shaderProgram, "a_position");
        glEnableVertexAttribArray(location);

        //设置顶点属性指针,传递数据vertex shader的位置0,
        glVertexAttribPointer(location, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (GLvoid*)0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        //解绑
        glBindVertexArray(0);

        m_vao = VAO;

        glDeleteShader(vertexShader);
        glDeleteShader(fragShader);
    }

 

2. 使用之前创建好的VAO 和 shader program 在每帧绘制一个带颜色的三角形。

    void DebugApplication::TestDrawVBO()
    {
        //使用shader 绑定vao对象进行绘制
        glUseProgram(m_shader);
        glBindVertexArray(m_vao);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glBindVertexArray(0);
    }

 

以上是关于GLES2学习VBO和VAO的使用的主要内容,如果未能解决你的问题,请参考以下文章

openGL中vao/vbo的debug经历

如何使用不同的 VAO、VBO 绘制 2 个或更多对象?

绘图时 VAO 和 VBO 崩溃

GLES2.0 上的 VBO glDrawElements 和 glVertexAttribPointer 不显示任何内容

VAO 与 VBO 和 IBO 的手动绑定

我的OpenGL学习进阶之旅介绍 顶点数组对象VAO并实战一下