언제 정점 배열을 사용하고 언제 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.xml 및 opengl.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.