OpenGL> = 3이 VBO 만 허용하는 이유는 무엇입니까?


21

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를 가진 다른 사람들?

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


1
투표가 종료되는 이유는 무엇입니까? Dup입니까? 그렇다면 혜택을받을 수 있도록 링크를 볼 수 있습니까?
중력

답변:


23

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 코어를 사용할 수 있지만 호환성 프로파일 은 사용할 수 없습니다 . 그렇다고 반드시 성능 기술에 대한 의미 는 아닙니다 . 그러나 차이점이 있다면 그것이 바로 그 플랫폼이라는 것을 의미합니다.


1
방금 때문에 이 질문을 교차 게시 난 그냥 내 대답을 교차 게시합니다.
Nicol Bolas

API를 간결하게 유지하는 또 다른 이점은 OpenGL API를보다 쉽게 ​​구현할 수 있다는 것입니다. 이것은 원래 OpenGL ES 사양에서 큰 고려 사항이었습니다.
notlesh

@ stephelton : 이해가됩니다. 내 "VBO 이외의 모든 것을 폐기하는 이유"라는 질문은 API를 간결하게 유지하는 것이 합리적이지만 많은 사용 사례에서 VBO보다 나은 기능을 폐기하는 것은 합리적이지 않다는 생각에 근거했습니다. 내가 듣고있는 것에서 VBO를 사용하는 데 단점이없는 것처럼 보이므로 다른 모든 것을 더 이상 사용하지 않는 것이 좋습니다.
중력

@gravity 당신은하지 않습니다 VBO의를 사용할 수 있습니다. 꼭짓점 배열을 사용할 수도 있습니다.
notlesh

18

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

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

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


6
이 답변이 더 좋습니다. 요점까지 짧아지고 있습니다.
TravisG

@JariKomppa : 그것은 매우 합리적인 설명처럼 들립니다. 여전히 한 가지 우려가 있습니다. VBO는 상당히 큰 객체로 간주되며, 지난번에 확인했을 때 종종 1MB-4MB 버퍼로 할당됩니다. 지오메트리 객체가 그렇게 크지 않지만 객체가 많기 때문에 여전히 성능이 걱정된다면 어떻게해야합니까? VBO가 내가 가진 것과 다른 유스 케이스 일 수 있다고 걱정합니다. 단일 VBO에 여러 개체를 모은 다음 glDrawRangeElements각 개별 개체를 그리는 데 사용해야 합니까, 아니면 정점 배열처럼 비효율적인가요?
중력

나는 그것이 어떤 변화를 가져올 지 의심하지만, 우려되는 점이 있다면 벤치마킹하십시오.
Jari Komppa

@JariKomppa : 무엇이 차이를 만들지 의심하십니까? glDrawRangeElements각 개체에 고유 한 VBO를 제공하는 대신 몇 개의 VBO를 사용하여 각 VBO에서 여러 번 사용 합니까?
중력

1
정확하게. 나는 당신이 거기에 많은 차이를 보게 될지 의심하지만, 일부 테스트 케이스를 프로파일 링하면 더 많은 정보를 얻을 수 있습니다. 또한 필요에 따라 나중에 변경 사항을 적용 할 수 있으므로 지금은 걱정하지 않아도됩니다.
Jari Komppa

9

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

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

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

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

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

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

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

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

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


따라서 정점 배열보다 VBO의 성능이 일반적으로 나쁘지 않아야하지만 모드를 GL_STREAM_DRAW로 올바르게 설정해야합니까?
중력

@ 중력 : 참으로. 그러나 버퍼 모드는 예상되는 사용법에 대한 힌트 일뿐입니다. 물론이 힌트는 수행하려는 작업에 적용됩니다. 또한 업데이트를 위해 프로세스 주소 공간에 버퍼를 매핑 할 수 있다는 것을 잊지 마십시오 (glMapBuffer, glUnmapBuffer).
datenwolf

그러나 버퍼는 VRAM에있을 수 없었습니다. 아니면 여전히 VRAM에 있지만 프로세스 공간 주소를 통해 주소를 지정할 수 있습니까? 이 기술을 사용하면 임의 액세스가 저렴합니까, 아니면 소수의 연속 범위 만 업데이트하려고합니까?
중력

@Gravity : 버퍼는 읽기 전용, 쓰기 전용 또는 읽기 쓰기로 매핑 될 수 있습니다. 업데이트의 경우 쓰기 전용을 선택하십시오. 이제 최신 OS가 가상 주소 공간을 관리하는 방법, 즉 페이지 메모리를 관리하는 방법을 알아야합니다. 쓰기 전용 맵의 경우 DMA 전송 메모리 조각이 매핑되고 해당 매핑 된 범위에 대한 쓰기가 GPU 메모리로 직접 전송되거나 내용이 CPU RAM에 먼저 기록 된 다음 DMA에 의해 GPU로 전송됩니다. 이전). 데이터가 클라이언트 측 정점 배열을 통과하는 경우보다 더 직접적인 경로 인 것이 중요합니다. 일반 프로세스 메모리가 DMA에 적합하지 않습니다
datenwolf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.