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/