OpenGL에는 모바일 장치 및 임베디드 시스템 (OpenGL | ES) 및 JavaScript (WebGL)를 통한 웹 버전을 포함하지 않는 4 가지 주요 버전이 있습니다. Direct3D 11이 Direct3D 8과 다른 방식으로 작업하는 것과 마찬가지로 OpenGL 3도 OpenGL 1과 다른 방식으로 작업을 수행합니다. OpenGL 버전은 대부분 이전 버전의 애드온이라는 점만 다릅니다. 전적으로).
OpenGL의 여러 버전과 버전 외에도 기본 OpenGL은 프로파일 개념을 추가했습니다. 즉 호환성 프로파일 (이전 버전의 API를 지원할 수 있음)과 코어 프로파일 (이전 API를 사용하지 않도록 설정 함)입니다. 같은 것들 glBegin
당신은 코어 프로필을 사용하면 간단하게 작업을하지 않습니다하지만 당신은 (기본값) 호환성 프로필을 사용하는 경우.
또 하나의 주요 합병증으로, Apple과 같은 OpenGL의 일부 구현은 코어 프로파일을 사용할 때 최신 OpenGL 기능 만 활성화합니다. 따라서 최신 API를 사용하려면 이전 API 사용을 중지 해야합니다 .
그런 다음 튜토리얼에 대한 몇 가지 매우 혼란스러운 시나리오가 생깁니다.
- 이 튜토리얼은 오래되었으며 더 이상 사용되지 않는 API 만 사용합니다.
- 이 튜토리얼은 새롭고 잘 작성되었으며 코어 호환 API 만 사용합니다.
- 이 튜토리얼은 새로운 것이지만 호환성 모드에서 모든 API를 활성화하고 새로운 API와 기존 API를 자유롭게 혼합하는 드라이버로 작업하고 있다고 가정하는 실수를합니다.
- 이 자습서는 이전 버전의 API를 전혀 지원하지 않는 OpenGL | ES와 같은 다른 버전의 OpenGL을 대상으로합니다.
이와 같은 glBegin
것은 때때로 직접 모드 API라고하는 것의 일부입니다. OpenGL에는 유지 모드와 같은 것이 없으며 "즉시 모드"는 이미 그래픽에서 다른 정의를 가지고 있기 때문에 이것은 매우 혼란 스럽습니다. OpenGL 2.1 이후로 사용되지 않았으므로 OpenGL 1.x API로 참조하는 것이 훨씬 좋습니다.
OpenGL의 1.x API는 예전에는 그래픽 파이프 라인에 정점을 즉시 제출했습니다. 이것은 정점을 렌더링 한 하드웨어의 속도가 정점 데이터를 생성하는 CPU의 속도와 거의 비슷했을 때 잘 작동했습니다. 그런 다음 OpenGL은 삼각형 래스터 화를 오프로드했으며 그다지 많지 않았습니다.
요즘 GPU는 고급 버텍스 및 픽셀 변환을 수행하면서 대량의 버텍스를 매우 빠른 속도로 씹을 수 있으며 CPU는 단순히 원격 유지조차 할 수 없습니다. 또한 CPU와 GPU 간의 인터페이스는이 속도 차이를 중심으로 설계되어 더 이상 한 번에 하나씩 정점을 GPU에 제출할 수 없습니다.
모든 GL 드라이버는 glBegin
내부적으로 정점 버퍼를 할당하고 제출 된 정점 glVertex
을이 버퍼에 넣은 다음 호출 될 때 단일 버퍼에서 전체 버퍼를 제출하여 에뮬레이션해야합니다 glEnd
. 이러한 함수의 오버 헤드는 버텍스 버퍼를 직접 업데이트 한 경우보다 훨씬 큽니다. 따라서 일부 문서에서 (매우 실수로!) 버텍스 버퍼를 "최적화"(최적화가 아님 : 실제로는 유일한 방법 임) GPU와 대화하십시오).
수년 동안 OpenGL에서 더 이상 사용되지 않거나 폐기 된 다양한 다른 API가 있습니다. 소위 고정 기능 파이프 라인은 또 다른 그런 부분입니다. 일부 문서는 여전히이 파이프 라인을 사용하거나 프로그래밍 가능한 파이프 라인과 혼합 될 수 있습니다. 고정 기능 파이프 라인은 그래픽 카드가 3D 장면을 렌더링하는 데 사용 된 모든 수학을 하드 코딩하고 OpenGL API가 해당 수학에 대한 일부 구성 값을 설정하는 것으로 제한되었던 옛날부터 시작되었습니다. 요즘 하드웨어에는 하드 코딩 된 수학이 거의 없으며 (CPU와 마찬가지로) 대신 사용자 제공 프로그램 (종종 셰이더라고 함)을 실행합니다.
고정 기능 기능이 더 이상 하드웨어에 존재하지 않기 때문에 드라이버는 이전 API를 다시 한 번 모방해야합니다. 즉, 드라이버에는 자체 셰이더를 제공하지 않을 때 사용되는 고정 함수 시절의 오래된 수학을 실행하는 호환성 셰이더가 포함되어 있습니다. 이전 OpenGL 조명 API와 같이 이전 고정 함수 상태를 수정하는 이전 OpenGL 함수는 실제로 이러한 값을 드라이버의 호환성 셰이더에 제공하기 위해 균일 버퍼와 같은 최신 OpenGL 기능을 사용하고 있습니다.
호환성을 지원하는 드라이버는 이러한 구식 기능을 사용할 때를 파악하고 최신 기능과 원활하게 결합하여 오버 헤드를 추가하고 드라이버를 크게 복잡하게 만들 수 있도록 많은 비하인드 작업을 수행해야합니다. 이것이 일부 드라이버가 코어 프로파일이 새로운 기능을 갖도록하는 이유 중 하나입니다. 이전 및 새로운 API를 동시에 사용할 필요가 없으므로 드라이버 내부를 크게 단순화합니다.
시작하기가 쉽기 때문에 이전 API로 시작하는 것이 좋습니다. Direct3D 는 더 간단한 그리기 API와 사전 작성된 쉐이더를 제공하는 컴패니언 라이브러리 ( DirectX Tool Kit )를 제공 하여 초보자가이 문제를 해결했습니다.이 라이브러리 는 전문 지식이 커짐에 따라 원시 Direct3D 11 사용법과 자유롭게 혼합 할 수 있습니다. 더 넓은 OpenGL 커뮤니티는 불행히도 초보자를위한 호환성 프로파일을 사용하고 있습니다. 불행히도 이전 OpenGL API와 새로운 OpenGL API를 혼합 할 수없는 시스템이 있기 때문에 문제가됩니다. 다양한 레벨의 기능과 대상 사용 사례 및 언어 ( MonoGame)를 사용하여 새로운 OpenGL에서 간단한 렌더링을위한 비공식 라이브러리 및 도구가 있습니다. 예를 들어 .NET 사용자의 경우) 그러나 공식적으로 승인하거나 널리 동의 한 것은 없습니다.
찾은 문서는 OpenGL 용이 아니라 다른 유사한 API 중 하나 일 수 있습니다. OpenGL | ES 1.x에는 고정 함수 렌더링이 있었지만 정점 제출을위한 OpenGL 1.x API는 없었습니다. OpenGL | ES 2.x + 및 WebGL 1+에는 고정 기능 기능이 전혀 없으며 해당 API에 대한 하위 호환성 모드가 없습니다.
이 API는 기본 OpenGL과 매우 유사합니다. 그것들은 완벽하게 호환되지는 않지만, OpenGL에 대한 공식 확장이 있습니다 (일부는 아님) 일부 드라이버는 OpenGL | ES (WebGL 기반)와 호환되도록 지원합니다. 전에는 충분히 혼란스럽지 않았기 때문입니다.