2013-01-04 4 views
15

일종의 일괄 처리 된 드로잉을 구현하기 위해 OpenGL을 사용하고 있습니다. 이를 위해 데이터를 저장할 vertex buffer을 만듭니다.OpenGL. glBufferData로 버텍스 버퍼 업데이트

참고 :이 버퍼는 일반적으로 각 프레임에서 업데이트되지만 크기는 줄이지 ​​않지만 계속 증가 할 수 있습니다.

제 질문은 glBufferData (s treaming write-only mode)을 업데이트하는 것이 기술적으로 정확합니까 (예 : glMapBuffer 대신)? 전체 데이터가 업데이트되었으므로 매핑 할 필요가 없다고 생각하기 때문에 한 번에 전체 팩을 보내면됩니다. 현재 버퍼 크기가 작 으면 보내는 것보다 자동으로 증가합니다. 그렇지 않습니까? 이제는 실제로 작동하는 방식에 대해 확신합니다 (각 호출에서 버퍼를 다시 만들 수 있습니까?).

답변

12

고정 된 크기의 버퍼를 사용하는 것이 좋으며 모든 프레임마다 버퍼를 다시 만들지 마십시오.

  • 갱신 새로운 데이터 버퍼의 시작에 불과 1000 개 버텍스에 대한 인스턴스 공간에 대한 최대 크기의 버퍼를 작성

    • :

      다음과 같은 방법으로이 작업을 수행 할 수 있습니다. 따라서 500 자릿수의 데이터를 변경 한 경우 glMapBuffer를 사용하여 버퍼의 첫 번째 절반을 채우십시오.

    • 그리기 할 때 그려지는 정점의 수를 변경하십시오. 예를 들어, 1000 verts 버퍼 전체에서 일부 범위의 vert (예 : 200에서 500) 만 사용할 수 있습니다. 댓글에서 glDrawArrays (모드, 첫째, 카운트)

    아이디어를 사용

    • glMapBufferRange 및 glBufferSubData는
    • 는 버퍼의 이중 버퍼링

    링크를 고려 도움이 될 수 : http://hacksoflife.blogspot.com/2010/02/double-buffering-vbos.html

    희망 하시겠습니까? s

  • +0

    답장을 보내 주셔서 감사합니다. 하지만 이것은 약간 다른 점이었습니다. 최대 크기의 버퍼를 만드는 것은 불가능합니다. 그러나 크기를 변경할 확률은 매우 낮으므로 이제는 문제가됩니다. 드로잉 범위에 관해서 - 그게 내가 지금하는 일입니다. 하지만 귀하의 두 번째 옵션에 대한 질문을 할 수 있습니다 (verts의 범위 만 업데이트) :이 경우에는 항상 데이터를 연속 블록 (CPU)에 저장하므로 버퍼를 동일한 glBufferData로 업데이트 할 수 있습니다 , 더 작은 크기를 지정하면 - 동일한 결과가 나타 납니까? 버퍼를 망치거나 재현하지 않습니까? 고맙습니다. – Celestis

    +1

    확실히 각 프레임 버퍼를 삭제하고 새 프레임을 생성하여 GPU/CPU 간의 성능을 향상시킬 수 있습니까? 사용중인 버퍼를 업데이트하지 않으면 GPU가 현재 사용하고있는 블로킹을 방지 할 수 있습니까? – Robinson

    +1

    여기 흥미로운 링크가 있습니다 : http://hacksoflife.blogspot.com/2010/02/double-buffering-vbos.html, 도움이 될 수있는 glMapBufferRange 함수도 있습니다. – fen

    관련 문제