美文网首页
OpenGLES-06 使用VBO做渲染

OpenGLES-06 使用VBO做渲染

作者: _清墨 | 来源:发表于2017-11-08 16:04 被阅读99次

    这篇文章其实不必写,这位博主讲得已经很好了http://www.cnblogs.com/kesalin/archive/2012/12/20/vbo.html

    还是提出来的原因是,这是一步步的路:
    为什么我们要使用VBO?

    使用顶点缓存(VBO)能够大大减少CPU-GPU 之间的数据拷贝开销,因此显著地提升了程序运行的效率。
    

    既然如此,那就一定要用VBO。这篇文章我就将《OpenGLES-05 立方体3D变换》里的代码改为VBO,阅读VBO使用请点上面链接就好。

    若绘制图形众多,你还需考虑使用VAO,VAO用法也是比较简单的,对性能提升也很大。这里就提一下,大家有兴趣可以研究下:

    每当我们绘制一个几何体时,我们需要重复同样的工作(首先绑定缓冲区、然后设置顶点属性)。当需要绘制的物体很多时,这个过程就显得有些耗时。那么我们有没有一种方式来简化这一过程呢?这就是VAO做的事情,它将所有顶点绘制过程中的这些设置和绑定过程集中存储在一起,当我们需要时,只需要使用相应的VAO即可。
    VAO的这种方式有点像一个中介,把所有繁琐的绑定和顶点设置工作都集中起来处理,我们需要绘制时,直接找这个中介就好了。

    所有教程代码在此 : https://github.com/qingmomo/iOS-OpenGLES-

    -(void)render
    {
        //设置清屏颜色,默认是黑色,如果你的运行结果是黑色,问题就可能在这儿
        glClearColor(0.3, 0.5, 0.8, 1.0);
        /*
        glClear指定清除的buffer
        共可设置三个选项GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT
        也可组合如:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        这里我们只用了color buffer,所以只需清除GL_COLOR_BUFFER_BIT
         */
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glEnable(GL_DEPTH_TEST);  //添加
        
        // Setup viewport
        glViewport(0, 0, self.frame.size.width, self.frame.size.height);
        
        GLfloat vertices[] = {
            -0.5f, -0.5f, 0.5f, 1.0, 0.0, 0.0, 1.0,     // red
            -0.5f, 0.5f, 0.5f, 1.0, 1.0, 0.0, 1.0,      // yellow
            0.5f, 0.5f, 0.5f, 0.0, 0.0, 1.0, 1.0,       // blue
            0.5f, -0.5f, 0.5f, 1.0, 1.0, 1.0, 1.0,      // white
            
            0.5f, -0.5f, -0.5f, 1.0, 1.0, 0.0, 1.0,     // yellow
            0.5f, 0.5f, -0.5f, 1.0, 0.0, 0.0, 1.0,      // red
            -0.5f, 0.5f, -0.5f, 1.0, 1.0, 1.0, 1.0,     // white
            -0.5f, -0.5f, -0.5f, 0.0, 0.0, 1.0, 1.0,    // blue
        };
    
    //    GLfloat vertices[] = {
    //        -0.5f, -0.5f, 0.5f,
    //        -0.5f, 0.5f, 0.5f,
    //        0.5f, 0.5f, 0.5f,
    //        0.5f, -0.5f, 0.5f,
    //        
    //        0.5f, -0.5f, -0.5f,
    //        0.5f, 0.5f, -0.5f,
    //        -0.5f, 0.5f, -0.5f,
    //        -0.5f, -0.5f, -0.5f,
    //    };
        
        GLubyte indices[] = {
            // Front face
            0, 3, 2, 0, 2, 1,
            
            // Back face
            7, 5, 4, 7, 6, 5,
            
            // Left face
            0, 1, 6, 0, 6, 7,
            
            // Right face
            3, 4, 5, 3, 5, 2,
            
            // Up face
            1, 2, 5, 1, 5, 6,
            
            // Down face
            0, 7, 4, 0, 4, 3
        };
        
        GLuint vertexBuffer;
        glGenBuffers(1, &vertexBuffer);
        glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
        
        GLuint indexBuffer;
        glGenBuffers(1, &indexBuffer);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
        
        glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), 0);
        glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (const GLvoid*)(3 * sizeof(GLfloat)));
        glEnableVertexAttribArray(_positionSlot);
        glEnableVertexAttribArray(_colorSlot);
        glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(GLubyte), GL_UNSIGNED_BYTE, 0);
        
        [_context presentRenderbuffer:_renderBuffer];
        
        glDeleteBuffers(1, &vertexBuffer);
        glDeleteBuffers(1, &indexBuffer);
    }
    

    相关文章

      网友评论

          本文标题:OpenGLES-06 使用VBO做渲染

          本文链接:https://www.haomeiwen.com/subject/fwglmxtx.html