OpenGL> = 3이 VBO 만 허용하는 이유는 무엇입니까? 번째 질문은 VBO로 전환하면

OpenGL 버전 3 이상에서는 클라이언트 쪽 렌더링을 사용하지 않아도됩니다. 즉시 모드가 제거되었으며 정점 배열은 더 이상 사용되지 않는 것 같습니다. 대신 올바르게 이해하면 VBO가 정점을 렌더링하는 주요 방법입니다.

모든 것을 렌더링하는 통일 된 방법을 갖는 논리를 보았지만 VBO가 정점 배열에 비해 큰 단점이없는 경우입니까? VBO는 일반적으로 1MB 이상의 데이터를 포함하는 큰 버퍼라고 생각했습니다. 작은 형상이 많은 장면이 있으면 어떻게합니까? 노드가 많은 장면 그래프가 있으며 각 노드에는 자체 변환 등이 필요합니다. 각 노드는 별도로 삭제하거나 별도로 추가 할 수 있어야합니다. 이전에 정점 배열을 사용하고있었습니다. 따라서 첫 번째 질문은 VBO로 전환하면 각 객체에 VBO를 할당해야하기 때문에 장면 그래프 객체에 더 많은 오버 헤드가 있는지 여부입니다.

또 다른 관심사는 렌더링중인 지오메트리가 매우 동적 일 수 있다는 것입니다. 최악의 경우, 모든 지오메트리를 일정 시간 동안 매 프레임마다 다시 보내야 할 때가 있습니다. 이 사용 사례에서 VBO가 정점 배열보다 성능이 좋지 않습니까? 최악의 경우 VBO가 정점 배열만큼 많은 작업을 수행하지만 더 이상 작동하지 않습니까?

더 간결한 형식으로 내 질문은 다음과 같습니다.

1) VBO 할당 / 할당에 상당한 오버 헤드가 있습니까 (버퍼를 설정하는 단순한 행위를 의미)?

2) 매 프레임마다 CPU에서 데이터를 업데이트하는 경우 정점 배열을 사용하는 것보다 훨씬 더 나쁠 수 있습니까?

그리고 마지막으로 알고 싶습니다.

3) 위의 질문 중 하나에 대한 대답이 “예”인 경우 VBO보다 유리할 수있는 다른 렌더링 모드를 더 이상 사용하지 않는 이유는 무엇입니까? 이러한 잠재적 할당 비용 등을 완화하기 위해 사용해야하는 기술과 같이 여기에없는 것이 있습니까?

4) 이러한 질문에 대한 답변은 사용중인 OpenGL 버전에 따라 크게 달라 집니까? 성능이 우수한 방식으로 VBO를 사용하여 코드를 OpenGL 3 또는 4와 호환되도록 리팩터링하면 동일한 기술이 OpenGL 2에서도 잘 수행 될 가능성이 높거나 특정 기술이 OpenGL 3에서 훨씬 빠를 가능성이 높습니다 +와 OpenGL 2를 가진 다른 사람들?

이 질문은 스택 오버플로에 대해 질문했지만이 사이트가 내 질문에 더 적합 할 수 있다는 것을 깨달았으므로 여기에 다시 게시하고 있습니다.



답변

VBO 할당 / 할당에 상당한 오버 헤드가 있습니까 (버퍼를 설정하는 단순한 행위를 의미)?

“실질적”을 정의하십시오. 일반적으로 프레임 중간에 생성하지 않는 것이 좋습니다. 초기화 중 또는 어디에서나 설정해야합니다. 그러나 이것은 텍스처, 렌더 버퍼 또는 셰이더와 같은 대부분의 OpenGL 객체에 적용됩니다.

매 프레임마다 CPU에서 데이터를 업데이트하는 경우 정점 배열을 사용하는 것보다 훨씬 더 나쁠 수 있습니까?

할 수 있습니까? 예. OpenGL은 성능이 아닌 기능을 정의합니다 . 당신은 실제로 일을 훨씬 느리게 만들 수 있습니다. 또는 더 빨리 할 수 ​​있습니다. 사용 방법에 따라 다릅니다.

OpenGL Wiki에는 데이터를 올바르게 스트리밍하는 방법에 대한 좋은 기사가 있습니다 .

위의 질문 중 하나에 대한 대답이 “예”인 경우 VBO보다 이점이있을 수있는 다른 렌더링 모드를 더 이상 사용하지 않는 이유는 무엇입니까? 이러한 잠재적 할당 비용 등을 완화하기 위해 사용해야하는 기술과 같이 여기에없는 것이 있습니까?

첫째, 그들은 더 이상 사용되지 않습니다. 더 이상 사용되지 않음은 이후 버전에서 “제거”로 표시하는 것을 의미합니다. 3.0에서는 더 이상 사용되지 않으며 3.1 코어 이상에서는 제거 되었습니다.

둘째, ARB는 일반적으로 OpenGL에서 항목을 제거한 이유를 설명했습니다. 사양을 더 작고 간단하게 만듭니다. API를 더 작고 능률적으로 만듭니다. 어떤 API를 사용해야하는지 쉽게 알 수 있습니다. 2.1은 정점 데이터를 제공하는 4 가지 방법이있었습니다. 3.1+에는 1이 있습니다. 그것은 많은 균열을 제거합니다. 기타.

사용중인 OpenGL 버전에 따라 이러한 질문에 대한 답변이 크게 변경됩니까? 성능이 우수한 방식으로 VBO를 사용하여 코드를 OpenGL 3 또는 4와 호환되도록 리팩터링하면 동일한 기술이 OpenGL 2에서도 잘 수행 될 가능성이 높거나 특정 기술이 OpenGL 3에서 훨씬 빠를 가능성이 높습니다 +와 OpenGL 2를 가진 다른 사람들?

더 많거나 적습니다. MacOSX에서만 3.1 + 코어와 3.0 이전 버전 사이의 차이점은 분명히 분명합니다. 호환성 프로파일은 Linux 및 Windows 용 모든 드라이버에 의해 구현되므로 이러한 드라이버의 핵심 프로파일은 실제로 호환성 기능을 호출하지 못하도록 검사를 추가하는 것으로 가정 할 수 있습니다.

Mac OSX 10.7에서는 GL 3.2 코어를 사용할 수 있지만 호환성 프로파일 은 사용할 수 없습니다 . 그렇다고 반드시 성능 기술에 대한 의미 는 아닙니다 . 그러나 차이점이 있다면 그것이 바로 그 플랫폼이라는 것을 의미합니다.


답변

VBO가 아닌 데이터를 사용할 때마다 OpenGL이 작동하는 방식에 따라 드라이버는 실제로 임시 VBO를 생성하기 위해 사본을 만들어야합니다. OpenGL을 호출 할 때마다 사용자 공간 네이 키 배열을 수정하지 못하기 때문입니다.

임시 할당을 더 빠르게하기위한 드라이버 측 속임수가있을 수 있지만 복사를 피하기 위해 할 수있는 일은 없습니다.

따라서 여러분과 드라이버 개발자가 모든 것을 올바르게 수행하는 한 VBO는 항상 속도를 높여야합니다.


답변

정점 배열은 더 이상 사용되지 않는 것 같습니다. 대신, 내가 올바르게 이해하면

좀 빠지는. 정점 배열은 정점 버퍼 객체의 기초입니다. 스토리지 만 클라이언트에서 서버 측으로 이동했습니다.

작은 형상이 많은 장면이 있으면 어떻게합니까?

더 작은 형상 세트를 더 큰 VBO로 병합합니다. 지오메트리 배치 당 하나의 VBO가 필요하지 않습니다. 렌더링을 위해 VBO의 하위 세트를 완벽하게 처리 할 수 ​​있습니다. gl… Pointer 데이터 매개 변수에 비제 레오 오프셋을 사용하십시오.

2) 매 프레임마다 CPU에서 데이터를 업데이트하는 경우 정점 배열을 사용하는 것보다 훨씬 더 나쁠 수 있습니까?

이를 위해 GL_DYNAMIC_DRAW 및 GL_STREAM_DRAW 버퍼 사용 플래그가 있습니다.

위의 질문 중 하나에 대한 대답이 “예”인 경우 VBO보다 이점이있을 수있는 다른 렌더링 모드를 더 이상 사용하지 않는 이유는 무엇입니까?

장점이 없기 때문입니다. 어떤 경우 든 지오메트리 데이터는 GPU로 전송되어야합니다. 일반 클라이언트 측 정점 배열을 사용하면 여전히 DMA가 GPU로 전송되며, 즉시 모드는 먼저 전송하는 배치를 작성합니다.

VBO를 사용하지 않으면 아무런 이점이 없습니다.


답변