언제 정점 배열을 사용하고 언제 VBO를 사용합니까?


14

정점 배열정점 버퍼 객체 에 대해 배우려고 하지만 다음과 같은 차이점을 이해하지 못합니다.

  • 사용 사례 (지형과 같은 정적 지오메트리, 파티클 시스템과 같이 모든 프레임을 변경하는 지오메트리 등)
  • 공연
  • 휴대 성 (구형 그래픽 카드, 콘솔, Android 또는 iPhone과 같은 장치 등)

몇 가지 설명이 필요하십니까?


3
여기에 도착하는 다른 사람은 여기에서 가장 많이 투표 된 답변을 확인하십시오 .... stackoverflow.com/questions/430555/…
afuzzyllama

답변:


14

다음 은 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)에 지오메트리 데이터를 저장하는 유일한 방법입니다.


2
이 PerformanceTuning.pdf에서 VBO는 "최적의 경우 성능을 저하시킬 수 있습니다"라고 말하지만 정교하지는 않습니다. 그 사건이 무엇인지 아십니까? 매 프레임마다 지오메트리를 업데이트 해야하는 경우가 있으므로 정점 배열이 VBO보다 좋거나 나쁠 지 궁금합니다. 고마워.
sidewinderguy

1
읽어 opengl.org/sdk/docs/man/xhtml/glDrawElements.xmlopengl.org/wiki/GlDrawElements을 - 정점 배열이 사용되지 않으며 제거되지 않습니다, 그들은 여전히 OpenGL을 4.x의의로 지원됩니다; 당신이 퍼 뜨리고있는 것은 잘못된 정보

1
@vaxquis 클라이언트 측 정점 배열은 더 이상 사용되지 않습니다. 서버 측 정점 배열은 아닙니다. VAO는 다른 것이며 상태를 저장하기위한 것입니다. 클라이언트 측을 언급하면 ​​더 정확할 수는 있지만 게시물에는 잘못된 것이 없습니다. 그러나 그것은 암시 적이라고 생각합니다.
concept3d

1
"클라이언트 측 정점 배열은 더 이상 사용되지 않습니다. 서버 측 정점 배열은 사용되지 않습니다." "Vertex Arrays 3.0 이전의 OpenGL에서 사용할 수 있으며 3.0에서 더 이상 사용되지 않으며 3.1 이상으로 제공됩니다." "분리 된 정점 배열 (...)을 미리 지정하고이를 사용하여 glDrawElements에 대한 단일 호출로 프리미티브 시퀀스를 구성 할 수 있습니다. 4.4 버전의 코어"-이 문장에 모순이 있습니다.

2
또한 "더 이상 사용되지 않는다"고 말하기 전에 해당 문서의 출처를 공식 문서로 지정하십시오. StackExchange에서 StackOverflow를 증거로 지적하는 것은 과학이 작동하는 방식이 아니며 "암시 적이라고 생각합니다"로 방어하는 것은 논쟁이 아닙니다. 클라이언트 / 서버 배열에 대해서는 아무도 묻지 않았습니다 .VBO와 비교할 때 가장 넓은 의미에서 정점 배열에 관한 질문이었습니다. Btw, 나는 VAO에 대해 아무 말도하지 않았습니다. 그 아이디어는 어디에서 왔습니까?

11

(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+ 해야 할 추가 책임을 면제받을 수 는 없습니다 . 완전히 정적 데이터가있는 경우에만 렌더링 해야합니다 .glBufferDataglBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)


+1 VAO는 끔찍하고 혼란스러운 이름이며, openGL이 엉망이 된 것을 항상 상기시킵니다.
concept3d

1
또한이 질문에 관한 토론을하는 것을 기억합니다 (대부분 삭제되었습니다). 다시 문제는 OpenGL의 끔찍한 용어에 있습니다. 또한 Chris 답변을보다 정확하게 편집했습니다.
concept3d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.