[原]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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM