glBufferData函數(shù)
填充整個緩沖對象,會分配一塊內(nèi)存隘冲,并將數(shù)據(jù)添加到這塊內(nèi)存中。如果data
為NULL
則只分配內(nèi)存不進行填充。當(dāng)需要預(yù)留(Reserve)特定大小的內(nèi)存舔糖,之后回到這個緩沖填充的時候會很有用。
glBufferSubData
填充緩沖的特定區(qū)域传轰。參數(shù)為緩沖目標(biāo)剩盒、偏移量、數(shù)據(jù)大小和數(shù)據(jù)本身慨蛙。
偏移量用于指定從何處開始填充這個緩沖辽聊,使得可以插入或更新部分緩沖內(nèi)存。
緩沖要有足夠的已分配內(nèi)存期贫,所以對一個緩沖調(diào)用 glBufferSubData
前必須要先調(diào)用glBufferData
跟匆。
glBufferSubData(GL_ARRAY_BUFFER, 24, sizeof(data), &data); // 范圍: [24, 24 + sizeof(data)]
glMapBuffer
請求緩沖內(nèi)存的指針,直接將數(shù)據(jù)復(fù)制到緩沖當(dāng)中通砍。
float data[] = {
0.5f, 1.0f, -0.35f
...
};
glBindBuffer(GL_ARRAY_BUFFER, buffer);
// 獲取指針
void *ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
// 復(fù)制數(shù)據(jù)到內(nèi)存
memcpy(ptr, data, sizeof(data));
// 記得告訴OpenGL我們不再需要這個指針了
glUnmapBuffer(GL_ARRAY_BUFFER);
glUnmapBuffer
用于指針操作完成后解除映射玛臂,指針將不再可用,并且如果數(shù)據(jù)成功映射到緩沖中則返回GL_TRUE
封孙。
分批頂點屬性
float positions[] = { ... };
float normals[] = { ... };
float tex[] = { ... };
// 填充緩沖
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(positions), &positions);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(positions), sizeof(normals), &normals);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(positions) + sizeof(normals), sizeof(tex), &tex);
//更新頂點屬性指針
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)(sizeof(positions)));
glVertexAttribPointer(
2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)(sizeof(positions) + sizeof(normals)));
復(fù)制緩沖
glCopyBufferSubData
能從一個緩沖中復(fù)制數(shù)據(jù)到另一個緩沖中迹冤。
void glCopyBufferSubData(GLenum readtarget, GLenum writetarget, GLintptr readoffset,
GLintptr writeoffset, GLsizeiptr size);
readtarget
: 填入復(fù)制源
writetarget
: 復(fù)制目標(biāo)的緩沖目標(biāo)。
如果讀寫數(shù)據(jù)的兩個不同緩沖都為頂點數(shù)組緩沖可以使用GL_COPY_READ_BUFFER
和GL_COPY_WRITE_BUFFER
作為readtarget
和writetarget
參數(shù)虎忌。
float vertexData[] = { ... };
glBindBuffer(GL_COPY_READ_BUFFER, vbo1);
glBindBuffer(GL_COPY_WRITE_BUFFER, vbo2);
glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, sizeof(vertexData));
也可以只將writetarget
緩沖綁定為新的緩沖目標(biāo)類型之一:
float vertexData[] = { ... };
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glBindBuffer(GL_COPY_WRITE_BUFFER, vbo2);
glCopyBufferSubData(GL_ARRAY_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, sizeof(vertexData));