簡體   English   中英

OpenGL緩沖區更新

[英]OpenGL buffer update

目前,我正在編寫一個模擬水的程序。 這是我要做的步驟:

  1. 創建水面-平面。
  2. 建立VAO
  3. 創建在其中存儲法線和頂點的頂點緩沖區對象。
  4. 綁定到該VBO的指針。
  5. 創建索引緩沖區對象。

然后,我使用glDrawElements渲染該平面,然后調用一個update()函數,該函數更改水面頂點的位置。 之后,我調用glBufferSubData函數更新頂點位置。

當我這樣做時-緩沖區沒有更改就什么也沒有發生。

這是代碼片段:

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Oscillator) * nOscillators, oscillators, GL_DYNAMIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Oscillator), 0);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Oscillator), (const GLvoid*)12);
glEnableVertexAttribArray(0);  // Vertex position
glEnableVertexAttribArray(2);  // normals position

glGenBuffers(1, &indicesBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * nIndices, indices, GL_DYNAMIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer);
glBindVertexArray(0);

然后渲染:

glBindVertexArray(vaoHandle);
glDrawElements(GL_TRIANGLES, nIndices, GL_UNSIGNED_INT, 0); 
update(time);

並更新功能:

//some calculations
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Oscillator) * nOscillators, oscillators);

- it's a structure that has: 8 floats respectively - x, y, z (vertex position), nx, ny, nz (normals), upSpeed, newY -它具有以下結構:8個浮點數-x,y,z(頂點位置),nx,ny,nz(法線),upSpeed,newY

- this is an array of Oscillator structures. -這是一組振盪器結構。

我做錯了什么?

在更新數據之前,您必須綁定正確的緩沖區。 例如:

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);

由於您一次要更新完整的緩沖區,因此我建議使用glMapBuffer進行更新

void* data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
//[...] update the buffer with new values
bool done = glUnmapBuffer(GL_ARRAY_BUFFER);

請記住,在修改要復制到gl緩沖區的數據之前,請等待(或強制執行)glFlush()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM