zoukankan      html  css  js  c++  java
  • [原]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

  • 相关阅读:
    桃花扇
    望故乡
    Unity资源加载方式总结
    [Spark]-RDD详解之变量&操作
    [Spark]-RDD之创建
    [Spark]-RDD初识
    [Spark]-编译(2.3.1)&部署(YARN-Cluster)
    [Spark]-背景
    [Hive]-常规优化以及执行计划解析
    [转载]线上应用故障排查之一:高memory占用
  • 原文地址:https://www.cnblogs.com/U-tansuo/p/opengl_updateData.html
Copyright © 2011-2022 走看看