OpenGL : VBO 또는 glBegin () + glEnd ()?


16

최근에 원본 OGL Redbook을 제공 한 사람으로부터 튜토리얼 사이트 로이 링크 를 받았습니다 . 세 번째 헤더는 일반적인 렌더링 방법으로 glBegin () 및 glEnd ()를 잊어 버리는 것입니다. Redbook의 방법을 통해 배웠지 만 VBO의 이점이 있습니다. 이것이 실제로 진행되고 있는가? 그렇다면 렌더 코드와 후속 셰이더를 VBO와 후속 데이터 유형으로 쉽게 변환 할 수있는 방법이 있습니까?

답변:


27

현대 OpenGL의 VBO는 갈 길이 멀다. 고정 기능 기능 (glBegin / glEnd 및 그 사이의 기능 포함)은 3.0부터 사용되지 않으며 3.1 이후에는 제거되었습니다.

OpenGL Core Profile, OpenGL ES 2.0+ 및 WebGL을 사용하면 이전 항목에 액세스 할 수 없습니다.

어떤 사람들은 오래된 것들을 먼저 배우는 것이 더 쉽기 때문에 더 낫다고 생각하지만, 배우는 것들은 대부분 쓸모가 없으며 배우지 않아도되는 것들입니다.

VBO뿐만 아니라 모든 것에 쉐이더를 사용해야하고 매트릭스 변환을 직접 수행해야합니다 (또는 GLM 사용).

이전 버전을 사용하는 유일한 이유는 2.0 이전의 OpenGL을 대상으로하려는 경우입니다. 실제로는 1.5 개이지만 실제로는 1.5 개인 VBO도 셰이더가 아닌 VBO를 지원해야합니다. 또는 고정 기능 파이프 라인을 기반으로하는 OpenGL ES 1.x (예 : 구형 iPhone에서 사용). 또는 OpenGL SC (안전이 중요한 시스템 용).

일반적으로 사용되는 다음 기능은 더 이상 사용되지 않습니다.

  • glBegin
  • glEnd
  • glVertex *
  • glNormal *
  • glTextCoord *
  • gl 번역 *
  • glRotate *
  • glScale *
  • glLoadIdenity
  • glModelViewMatrix

opengl-tutorial.org 튜토리얼은 내가 생각하는 OpenGL을 학습에 대해 갈 수있는 가장 좋은 방법입니다 있습니다. 그들은 기존의 호환성 문제 중 일부에 의존하지만 실제로는 당신에게 그것을 가르치지 않습니다. 예를 들어, 셰이더 없이는 아무것도 렌더링하지 않아도되지만 작동합니다. 그리고 행렬 연산 (회전, 변환 등)을 직접 처리해야하지만 기본적으로 기본 평면 2D 뷰포트가 제공됩니다.

더 이상 사용되지 않는 것들을 피하는 것 외에도 OpenGL을 훨씬 더 멋지게 코딩하는 많은 기능이 있지만 그 중 많은 기능을 사용하면 최신 3.x + 버전의 OpenGL 및 호환 가능한 하드웨어가 필요한지 결정해야합니다.

내가 작성한 게시물에 더 많은 정보 가 있습니다 .

어떤 이유로 든 이전 OpenGL을 지원해야하는 경우 가능하면 VBO를 사용할 수 있고 그렇지 않은 경우 glBegin / glEnd를 사용하고 정점 데이터를 반복하는 폴백을 제공하십시오.

반면에, 오래된 렌더 코드를 상향 변환하는 실제 '쉬운'방법은 없습니다. 버텍스를 배열 / 벡터에 추가 한 다음 VBO에 덤프하여 가짜 glEnd가 호출 될 때 그 함수를 그리는 자체 버전의 함수를 구현할 수 있습니다. 그러나 매 프레임마다 수행하기 때문에 (한 번만 확인하지만 애니메이션 객체에서는 작동하지 않는 한) VBO로 전환하는 것이 더 많은 작업 일 것이므로 매우 비효율적입니다. 나는 당신이 접근 할 수있는 많은 코드를 가지고 있다고 가정합니다.


7

VBO를 사용하면 일반적으로 두 가지 주요 이점이 있습니다.

장점 1은 완전 정적 데이터와 관련이 있으며 정점 데이터를 GPU에 더 적합한 메모리에 유지할 수 있다는 점에서 비롯됩니다.

Advantage 2는 동적 데이터와 관련이 있으며 렌더링에 사용하기 전에 언제든지 정점 데이터를 지정할 수있어 파이프 라인이 더 좋습니다.

세 번째 장점은 드로우 콜 배치에서 비롯되지만 구식 정점 배열과도 공유되므로 VBO에 대해서는 특별히 언급하지 않습니다. GPU로 데이터를 전송하거나 GPU에 이미있는 데이터를 사용하는 것은 디스크 I / O 및 네트워크 트래픽과 여러면에서 유사합니다. 대규모 배치가 많을 경우 많은 소규모 배치보다 효율적입니다.

이것에 대한 좋은 (100 % 정확하지는 않지만 아이디어를 얻는 데 충분한) 유추는 한 도시에서 다른 도시로 50 명을 데려 오는 버스 운전사 인 경우입니다. 한 번에 하나씩로드하고 50 개의 개별 트립을 수행 할 수 있습니다 (glBegin / glEnd). 또는 버스에 50 개를 모두 배치하고 한 번의 트립을 수행 할 수 있습니다. 즉 정점 배열 또는 VBO로 일괄 처리하는 것입니다 (VBO의 경우 50 명이 이미 버스에 있음).

그러나 가격이 책정되며 가격은 정점 데이터를 필요할 때만 지정할 수있는 능력을 상실한다는 것입니다. 글쎄, 당신은 (일부 추가 작업으로) 그렇게 할 수 있지만 코드에서 완전한 성능을 얻지는 못할 것입니다. 대신 정점 데이터, 사용 방법, 업데이트 방법 (및 경우), 쉐이더에서 애니메이션을 수행 할 수 있는지 여부에 따라 데이터를 정적으로 유지할 수 있도록해야합니다. 잘 작동하려면 많은 애니메이션 사례) 또는 각 프레임의 정점 데이터를 다시 지정해야하는지, 후자의 경우 효율적인 업데이트 전략 등입니다.이 작업을 수행하지 않고 순진한 전환을 구현하는 경우 매우 위험합니다. 최종 결과에 대해서만 많은 작업에서 실제로 느리게 실행됩니다!

이것은 처음 만났을 때 끔찍한 일처럼 보일 수 있지만 실제로는 그렇지 않습니다. 이와 같은 사고 방식에 들어가면 실제로 매우 쉽고 자연스럽게 나옵니다. 그러나 처음 몇 번의 시도를 망가뜨릴 수 있으며 그렇게한다면 낙심하지 말아야합니다. 실수를 저지르는 것은 자신이 잘못한 것을 배울 수있는 기회입니다.

몇 가지 마지막 생각.

VBO에 쉽게로드 할 수있는 형식으로 모델 데이터를 사용하면이 전체 프로세스를 훨씬 쉽게 수행 할 수 있습니다. 즉, 최소한 처음에는 (그리고 프로세스에 익숙해 질 때까지) 더 복잡하거나 이국적인 형식을 피해야합니다. 학습 할 때 가능한 한 단순하고 기본적으로 유지하십시오. 잘못 될 일이 적고, 잘못 될 경우 오류를 찾아야 할 곳이 적습니다.

최적화 된 / 압축 된 glBegin / glEnd 구현보다 더 많은 메모리를 사용하는 VBO 구현을 볼 경우 사람들은 종종 연기됩니다 ( "폐기물"이라고도 함). 그렇게하지 마십시오. 극단적 인 경우를 제외하고 메모리 사용은 실제로 그렇게 중요 하지 않습니다 . 여기서 명백한 절충점-실질적으로 더 높은 성능을 대가로 잠재적으로 더 높은 메모리 사용을 허용합니다. 또한 메모리가 사용되는 싸고 풍부한 자원이라는 사고 방식을 개발하는 데 도움이됩니다. 성능이 아닙니다.

그리고 마지막으로 오래된 밤-이미 충분히 빠르면 작업이 완료됩니다. 목표 프레임 속도에 도달하는 경우 일시적인 상황에 대한 헤드 룸이 있으면 충분하며 다음 단계로 넘어갈 수 있습니다. 실제로 필요하지 않은 것 (추가로 함정에 빠짐)에서 10 %를 더 많이 소모하면 많은 시간과 에너지를 낭비 할 수 있으므로 항상 자신의 시간을 가장 최적으로 사용하는 것을 고려하십시오 -프로그래머 시간이 성능보다 훨씬 저렴하고 저렴하기 때문에!

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