답변:
다음 은 VBO에 대한 훌륭한 글입니다.
공연
다음 은 호출 의미론에 대한 좋은 개요입니다.
다음 은 성능 문제에 대한 또 다른 좋은 개요입니다. 여기에서 VBO가 어레이보다 성능이 우수하다는 것을 알 수 있습니다.
VBO를 선호하는 이유는 데이터가 카드에로드되므로 매 프레임마다 데이터를 전송할 필요가 없기 때문입니다. 생성 된 VBO의 유형에 따라 사용법에 대한 그래픽 드라이버 힌트를 제공 할 수 있습니다 (쓰기 대, 읽기 대 대 쓰기 대, 읽지 않음 등).
용법
VBO는 변경하지 않을 지형과 같은 정적 지오메트리 또는 지오메트리에 적합합니다.
정점 배열은 자주 변경되는 데이터에는 적합하지만 호스트 시스템에서도 읽히는 데이터에 적합하므로 조작되는 데이터 (예 : 레이저 거리계 데이터 버퍼, 내가 사용한 위치)를 직접 렌더링하기 위해 자주 사용됩니다. 호스트 장치에서 데이터를 읽지 않고 도망 갈 수있는 경우 (따라서 카드로 밀어 넣으면) 쓰기 전용 모드의 VBO가 좋은 옵션입니다.
이식성
클라이언트 측 정점 배열 이것들은 3.0 이전의 OpenGL에서 사용할 수 있었으며, 3.0에서 사용되지 않으며 3.1 이상으로 제공됩니다. OpenGL ES는이를 지원합니다 (OpenGL ES 2는 지원하지 않습니다).
VBO OpenGL 1.5 이후에 사용 가능합니다. OpenGL ES 2 (및 WebGL)에 지오메트리 데이터를 저장하는 유일한 방법입니다.
(ChrisE의 답변이 매우 모호하다는 사실로 인해 여기에 추가하고 있습니다. 불행히도 원래 질문의 모호성 때문입니다. 그러나 OP의 질문 제목이 " VAO 를 사용할 때"라고 가정합니다 VBO 사용 시기 ")
V의 ertex B uffer O의 (정말로 다른 유형의 이종하지 bjects B uffer O의 예 bjects U niform B uffer O의 bjects)는 그래픽 하드웨어에 업로드 정점 데이터를위한 수단을 제공한다.
V의 ertex 의 rray의 O의 bjects가 추가로 사용됩니다 VBO 개별 버텍스 버퍼와 재 세트 정점을 바인딩하는 데 필요한 호출의 수를 줄여 클라이언트 측 (CPU 쪽) 성능을 향상시키기 위해의 당신이 할 때마다 속성 특정 방식으로 렌더링하도록 변경하십시오. 모든 프레임에서 모든 작업을 수행하는 대신 한 번만 수행하면 (초기화) 연결된 정점 속성을 사용하는 각 그리기 호출에 대해 적절한 VAO 를 리 바인드하면됩니다 .
그럼에도 불구하고 VAO를 사용 한다고 해서 게임 엔터티 위치 / 회전 / 변환 행렬과 같이 각 프레임 을 변경 하는 데이터에 대해 glBindBuffer
+ 해야 할 추가 책임을 면제받을 수 는 없습니다 . 완전히 정적 데이터가있는 경우에만 렌더링 해야합니다 .glBufferData
glBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)