• [原]OpenGL基础教程(五)缓冲区数据更新方式


    1、glBufferSubData 适用于相同数据类型

    void SetPositionY(float y)
    {
        vector<Vector3<float>>::iterator ver3;
        for(ver3 = vertices.begin();ver3!=vertices.end();ver3++)
        {
            ver3->y +=y;
        }
        glBindBuffer(GL_ARRAY_BUFFER,posHandler);
        glBufferSubData(GL_ARRAY_BUFFER,0,vertices.size() * sizeof(vertices[0]),&vertices[0]);
        glBindBuffer(GL_ARRAY_BUFFER,0);
        display( );
    }

    2、glMapBuffer 适用于对缓冲区大部分数据更新

    void SetPositionY(float y)
    {
      ....................
        glBindBuffer(GL_ARRAY_BUFFER,posHandler);
        void *buf = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
        memcpy(buf, &vertices[0], sizeof(vertices[0])*vertices.size());
        glUnmapBuffer(GL_ARRAY_BUFFER);
        glBindBuffer(GL_ARRAY_BUFFER,0);
        ..............
    }

    以上两种方式效果图:

    3、glMapBufferRange 适用于大缓冲区里面小部分数据更新

    void SetPositionY(float y)
    {
      .............
        glBindBuffer(GL_ARRAY_BUFFER,posHandler);
        void *buf = glMapBufferRange(GL_ARRAY_BUFFER, 0,  sizeof(vertices[0])*50, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
        memcpy(buf, &vertices[0], sizeof(vertices[0])*50);
        glUnmapBuffer(GL_ARRAY_BUFFER);
        glBindBuffer(GL_ARRAY_BUFFER,0);
        ..............................
    }

    因为所有字是一个数组 更新前50个顶点 所以有点乱

    特别说明:更新完数据 一定要调从绘函数 也就是glutDisplayFunc绑定的回调函数 ,本文为display( );

    参考:http://iqnix.blog.163.com/blog/static/21721982014228115223718/

         http://www.zwqxin.com/archives/opengl/learn-vbo.html

  • 相关阅读:
    少写代码帮你模块化方法 & 运动框架 & 简化轮播图
    JQ
    弹框&可用于判断
    移动端内容区域滚动做法总结
    数组这回事
    Bootstrap & 响应式
    谈谈this对象
    模态框中水平垂直居的问题
    图片的懒加载问题
    js中运动框架的封装
  • 原文地址:https://www.cnblogs.com/U-tansuo/p/opengl_updateData.html
Copyright © 2020-2023  润新知