2012-12-17 2 views
2

은 현재 내가 물을 시뮬레이션하는 프로그램을 쓰고 있어요. 여기에 나와있는 단계가 있습니다 :OpenGL을 버퍼 업데이트

  1. 물 표면을 만듭니다.
  2. 는 VAO는
  3. 내가 법선과 정점을 저장하는 정점 버퍼 객체를 만듭니다. 이 VBO에
  4. 바인드 포인터.
  5. 색인 버퍼 객체를 만듭니다.

그런 다음 glDrawElements를 사용하여이 평면을 렌더링 한 다음 물 표면의 정점 위치를 변경하는 update() 함수를 호출합니다. 그런 다음 glBufferSubData 함수를 호출하여 정점 위치를 업데이트합니다. 아무것도 버퍼가 변경되지 않은 경우로 발생하지 않습니다 -

내가 그렇게

.

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

발진기 - 그것은있는 구조입니다 :

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); 

및 업데이트 기능 여기

는 코드의 8 각각 플로트 - x , Y, Z (정점의 위치), NX, NY, NZ (법선) upSpeed, newY를

발진기 - 이것은 발진기 구조의 배열이다.

내가 뭘 잘못 했니?

+0

물이 제대로 렌더링합니까? –

+0

다시 그리기 전에 색상 버퍼/깊이 버퍼 /를 지우시겠습니까? – Felics

+0

예, 물이 올바르게 렌더링되고 색상 및 깊이 버퍼가 지워집니다. – Shot

답변

0

데이터를 업데이트하기 전에 올바른 버퍼를 결합해야합니다. 예 :

당신은 내가

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

를 업데이트 glMapBuffer를 사용하여 데이터를 수정하기 전에 glFlush()을 기다려야 기억 (또는 힘)을 제안 한 번에 전체 버퍼를 업데이트되기 때문에

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 

gl 버퍼로 복사하려고합니다. 당신이 업데이 트를 호출하기 전에

+0

버퍼 내용을 수정하기 전에'glFlush'를 수행 할 필요가 없습니다. –