정점 버퍼 객체가 성능을 향상시키는 이유는 무엇입니까?


10

기본 이해에서 정점 버퍼 객체는 다음과 같이 작동합니다 (의사 코드).

일반적으로 말하고 싶을 때 정사각형을 그리면 선 그리기 명령을 실행할 수 있습니다.

line (0, 0) -> (1, 0)
line (1, 0) -> (1, 1)
line (1, 1) -> (0, 1)
line (0, 1) -> (0, 0)

VBO를 사용하면 올바르게 이해하면 정점이 VBO에로드됩니다.

define VBO
load (0,0) -> VBO
load (1,0) -> VBO
load (1,1) -> VBO
load (0,1) -> VBO
load (0,0) -> VBO

그런 다음 하나의 도면 명령을 발행 할 수 있습니다.

draw VBO vertices

VBO의 작동 방식을 이해하지만 VBO가 성능을 향상시키는 이유를 모르겠습니다.

성능을 어떻게 개선합니까?

답변:


11

일반적으로 개체를 즉각적인 모드로 렌더링 할 때 (예 : 선 그리기 명령 실행) 그래픽 카드에 제출하기 위해 일련의 명령을 작성합니다. 많은 양의 데이터를 그리거나 자주 그리는 경우이 데이터를 여러 번 반복해서 보내는 데 많은 시간이 소요될 수 있습니다.

정점 버퍼를 사용하면 그래픽 카드에 한 번 제출하는 단일 객체를 생성 할 수 있습니다. 지오메트리를 변경할 필요가없는 경우 그래픽 카드에 지오메트리를두고 그래픽 카드에 해당 객체를 그리라는 요청을 보내면됩니다. 그릴 때마다 복사를 피하기 때문에 각 그리기에 대한 오버 헤드가 훨씬 적습니다.

꼭짓점 버퍼 객체를 사용한다고해서 항상 속도가 크게 향상되는 것은 아닙니다. 프레임 당 한 번만 객체를 그리고 각 프레임 사이에서 지오메트리를 바꾸는 경우 각 프레임의 복사를 피할 수있는 이점이 없습니다.

내 경험의 대부분은 OpenGL과 같은 그래픽 API를 사용하여 프로그램을 작성했기 때문에 그래픽 드라이버의 백엔드를 망친 사람이 더 자세한 답변을 제공 할 수는 있지만 이것이 좀 더 명확 해지기를 바랍니다.


10

VBO를 즉시 모드보다 효율적으로 만드는 두 가지 단계가 있습니다.

  1. 즉시 모드 ( glBegin / glEnd , glVertex * 등)는 각 프레임에서 정점, 속성 당 속성 (위치, 법선, 색상 등)을 드라이버에 공급하여 다시 포맷하고 최종적으로 전송 함을 의미합니다. GPU에 대한 명령으로 전체 패키지. 각 프레임의 정점마다 많은 함수 호출이 있습니다.
    ( 즉시 모드는 OpenGL 3.0부터 더 이상 사용되지 않으며 3.2에서 완전히 제거되었습니다 .)

  2. 사용하여 버텍스 배열 (참조 glDrawArrays , glDrawElements , glVertexPointer 등), 당신은 정점 포맷의 부담 번과 저장 운전자에게 전체를 제공 할 수 있습니다. 전체 메쉬에 대한 소수의 호출로 정점 당 여러 함수 호출을 효과적으로 대체하고 있습니다. 그러나 여전히 한 번 프레임을 수행해야합니다.

  3. Vertex Buffer Object 또는 VBO ( glGenBuffers , glBindBuffer 등 참조)는 한 단계 더 나아가 데이터를 GPU 측에 저장합니다. 한 번만 보낸 다음 핸들로 참조하십시오. 각 프레임에서 동일한 데이터를 반복해서 보내지 않으면 서 대역폭을 절약 할 수 있습니다.


6

즉각적인 모드 인터페이스 (예 : 구식 OpenGL glBegin () / glEnd () / glVertex ())를 사용하면 한 번에 하나씩 데이터를 드라이버에 효과적으로 공급할 수 있습니다. 그런 다음 해당 단일 데이터를 가져 와서 다시 포맷하고 하드웨어에 전달해야합니다 (요즘에는 데이터를 명령 버퍼에 넣는 것을 의미 함).

꼭짓점 버퍼 객체를 사용하면 필요할 때 앞서 드라이버에 (희망적으로) 큰 데이터 블록을 제공하게됩니다. GPU 조각을 공급하지 않아도 여러 가지 최적화 (재 포맷, 비디오 메모리에 배치)를 수행 할 수 있습니다.

실제로 소수의 프리미티브 만 그리는 경우에는 큰 차이가 없을 것입니다. 그러나 수백만 개의 삼각형 메쉬를 그리는 경우 비디오 메모리의 VBO가 사용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.