2011-09-04 6 views
1

나는 버텍스 속성 배열 GLfloat *vxData을 가지고 있습니다. GL_ARRAY_BUFFERGL_ELEMENT_ARRAY_BUFFER을 모두 vxData과 올바른 인덱스 데이터로 바인딩 했으므로 초기 정점이 성공적으로 렌더링됩니다. 각에서 OpenGL ES 2.0 : 새로운 버텍스 데이터 크기로 glBufferData 사용

내가 할 단계 렌더링 : 어떤 단계에서

glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 
glBufferData(GL_ARRAY_BUFFER, vxDataSize, vxData, GL_STATIC_DRAW); 
glDrawElements(...) 

, vxData 변경 크기 이하/더 정점을 수용하기를, 인덱스 데이터는이를 반영하여 재 작성하고, vxDataSize가 업데이트됩니다. 이 데이터 변경 직후 렌더링의 경우 위의 동일한 행을 호출하는 것이 맞습니까?

다른 가능성을 알고 있습니다. 예 : glMapBufferOES을 사용하여 위의 내용이이 시나리오에서 기술적으로 올바른지 알고 싶습니다.

답변

5

맞습니까? 예, 그렇게 할 수 있으며 예상 한대로 렌더링하는 기능 코드를 가져와야합니다. 이 좋은가요?

No.

먼저 OpenGL 구현에 대해 거짓말을합니다. 당신은 당신이 고정 데이터를 만들고 있다고 말했습니다. 정적이라는 것은 번에 번 업로드한다는 것을 의미합니다. 모든 프레임을 처리하고 있다면 STATIC이 아니라 STREAM을 사용해야합니다.

둘째, 버퍼를 더 작게 만들지 않아야합니다. 이전 데이터를 플러시하는 것이 중요하지만 OpenGL에게 버퍼가 더 커야한다고 말하면 실제로 메모리를 할당해야합니다. 그 좋지 않다. 크기를 골라서 붙이십시오. 사용하고 예상 할 수있는 가장 큰 크기를 선택하십시오.

+0

Nicol.이 통찰력에 대해 감사드립니다. 두 번째 제안을 성취하기 위해 아마도 vxDataSize를 상한선으로 수정하고 존재하는 정점에 대한 인덱스 데이터를 제공하면됩니까? vxData가 RAM에 저장되어 있고 가능한 한 작아야한다는 점을 감안하면 어떻게 접근해야합니까? – KomodoDave

+0

명확히하기 위해 : GPU 외부에'vxData'를 저장하고 계산하기에 값이 비싼 값이 있기 때문에 각 렌더링시 다시 제출하십시오. RAM에 저장하면 처음부터 다시 계산하지 않고 델타로 특정 값을 조정할 수 있습니다. – KomodoDave

+2

'vxDataSize'를 동적으로 만들면, 한 프레임을 더 크게 만들고 다음 프레임을 작게 만드는 것이 RAM에서도 메모리를 절약 할 수 있다고 생각합니까? 주소 공간을 조각 내고 있습니다. 고정 크기로 만들었다면 절대로 움직이거나 크기가 조정되지 않는 메모리 덩어리를 얻을 수 있습니다. 크기가 가변적 인 경우 크기를 늘리거나 줄이면 다시 할당해야합니다. 그러면 주소 공간을 옮겨서 조각화 할 수 있습니다. 이것은 좋지 않다. –

관련 문제