게임공장
[Learn OpenGL 번역] 2-1. 시작하기 - OpenGL 본문
OpenGL
시작하기/OpenGL
시작하기 전에 먼저 OpenGL이란 무엇인지 알아야 합니다. OpenGL은 그래픽 및 이미지를 조작하는 데 사용할 수 있는 많은 기능들을 제공하는 API(
OpenGL 설명서는 각 함수의 출력이 무엇이고 어떻게 수행되어야 하는지를 정의합니다. 이 설명서를 구현(implementing)하는 개발자는 해당 함수가 어떻게 작동해야하는지에 대한 솔루션을 제시해야 합니다. OpenGL 설명서는 구현 세부 사항을 제공하지 않으므로 OpenGL의 실제 개발 된 버전은 함수의 구현이 다를 수 있습니다.
실제 OpenGL 라이브러리를 개발하는 사람들은 일반적으로 그래픽 카드 제조업체입니다. 여러분들이 구입한 각 그래픽 카드는 해당 카드(시리즈) 용으로 특별히 개발 된 OpenGL의 특정 버전을 지원합니다. Apple 시스템을 사용할 때 OpenGL 라이브러리는 Apple이 자체적으로 관리하며 Linux에서는 그래픽 공급 업체의 버전과 애호가(?)의 조합이 이러한 라이브러리에 존재합니다. 이 것은 OpenGL이 이상한 행동을 보여주는 것은 그래픽 카드 제조업체(또는 라이브러리를 개발 / 유지보수한 사람)의 잘못이라고 생각합니다.
Khronos는 모든 OpenGL 버전에 대한 모든 설명 문서를 공개하고 있습니다. 관심있는 분은 여기에 OpenGL 3.3 버전(우리가 사용할 버전입니다.)을 찾을 수 있습니다. OpenGL의 세부사항을 공부하고 싶다면 많은 도움이 될 것입니다. 또한 설명서는 함수의 정확한 작동을 찾는 훌륭한 참고 자료로 쓰일 수 있습니다.
Core-profile vs Immediate mode
옛날에는 OpenGL을 사용한다는 것은 그래픽을 그리기 위한 사용하기 쉬운 방법인
OpenGL의 core-profile을 사용할 때 OpenGL은 우리가 최근의 기술을 사용하도록 합니다. OpenGL의 사용되지 않는 함수 중 하나를 사용하려고 할 때마다 OpenGL은 오류를 발생시키고 그리기를 중지합니다. 현대적인 기술을 배우는 이점은 매우 유연하고 효율적이다는 것이지만 배우기가 더 어렵다는 단점이 있습니다. immediate mode는 OpenGL이 수행 한 실제 작업을 추상화하여 배우기는 쉽지만 OpenGL이 실제로 어떻게 작동하는지 파악하기가 어려웠습니다. 현대적인 접근법은 조금 어려울지라도 개발자가 OpenGL과 그래픽 프로그래밍을 진정으로 이해할 수 있어야 한다. 이 것은 훨씬 더 유연하고 효율적인 방법이며 그래픽 프로그래밍에 대한 이해를 중요하게 생각합니다.
이것이 우리의 강좌가 Core-Profile OpenGL 버전 3.3에 맞추어져있는 이유이기도 합니다. 더 어렵더라도 노력할만한 가치가 있습니다.
현재, 더 최신 버전의 OpenGL(OpenGL 4.5)이 나왔는데 왜 OpenGL 3.3버전을 배워야하는지 궁금할 것입니다. 그 질문에 대한 답은 비교적 간단합니다. OpenGL의 향후 버전은 기본적으로 OpenGL의 핵심 기능을 변경하지 않고 OpenGL 3.3 버전에 기능을 추가한 형태입니다. 최신 버전은 동일한 작업을 수행하는 데 약간 더 효율적이거나 유용한 방법이 추가되었을 뿐입니다. 결과적으로 모든 개념과 기술은 최신 OpenGL 버전과 동일하게 유지되므로 OpenGL 3.3을 배우는 것은 타당하다고 생각합니다. 여러분이 준비가 되었거나 많은 경험을 해본다면 최신 버전의 OpenGL의 특정 기능을 사용하는 데에 어려움이 없을 것입니다.
일부 강좌에서는 때때로 최신 기능을 찾아 볼 수 있습니다.
확장
OpenGL의 가장 큰 특징은 확장 기능을 지원한다는 것입니다. 그래픽 회사에서 렌더링을 위한 새로운 기술 또는 최적화가 등장할 때마다 드라이버에서 그 기술이
개발자는 이러한 확장이 사용 가능한지 여부를 확인해야 합니다(또는 OpenGL 확장 라이브러리 사용). 이를 통해 개발자는 확장 기능을 사용할 수 있는지 여부에 따라 보다 효율적이거나 고급 기술의 작업을 수행할 수 있습니다.
if(GL_ARB_extension_name)
{
// 하드웨어가 지원하는 새롭고 현대적인 기능을 수행
}
else
{
// 확장 미지원: 예전의 방법으로 기능을 수행
}
OpenGL 3.3버전에서는 대부분의 기술에 대한 확장이 거의 필요하지 않지만 필요한 경우 적절한 설명을 해드릴 것입니다.
State machine
OpenGL은 그 자체로 거대한 stata machine(OpenGL이 현재 어떻게 작동해야하는지를 줭의하는 변수들의 집합)입니다. OpenGL의 상태는 일반적으로 OpenGL
OpenGL에게 삼각형 대신 선을 그려야 한다고 말할 때마다 OpenGL이 그려야하는 방식을 설정하는 context 변수를 변경하여 OpenGL의 상태를 변경합니다. OpenGL이 선을 그어야한다고 말하여 상태를 변경하자마자, 다음 드로잉 명령은 이제 삼각형 대신 선을 그리는 명령이 됩니다.
OpenGL에서 작업 할 때는 OpenGL의 현재 상태를 기반으로 일부 작업을 수행하는 여러가지
객체
OpenGL 라이브러리는 C로 작성되었으며 다른 언어로 된 많은 파생어를 허용하지만 핵심 부분은 C 라이브러리입니다. C 언어의 언어 구조가 다른 고급언어와 잘 일치하기 않기 때문에 OpenGL은 몇가지 추상화를 염두에 두고 개발되었습니다. 이러한 추상화 중 하나는 OpenGL의 객체입니다.
OpenGL의
struct object_name {
float option1;
int option2;
char[] name;
};
객체를 사용하고자 할 때 일반적으로 다음과 같은 코드를 볼 수 있습니다.(OpenGL의 context가 큰 구조체로 시각화 됨)
// OpenGL의 상태
struct OpenGL_Context {
...
object* object_Window_Target;
...
};
// 객체 생성
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 객체를 context에 바인딩
glBindObject(GL_WINDOW_TARGET, objectId);
// GL_WINDOW_TARGET에 현재 바인딩 된 객체의 옵션을 설정합니다.
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// context 대상을 다시 기본값으로 설정
glBindObject(GL_WINDOW_TARGET, 0);
이 짧은 코드는 OpenGL에서 작업 할 때 자주 볼 수 있는 작업 흐름입니다. 우리는 먼저 객체를 생성하고 그 객체에 대한 참조를 id로 저장합니다(실제 객체 데이터는 뒤에서 저장됩니다). 그런 다음 객체를 context의 대상 위치에 바인딩합니다(예제 윈도우 객체 대상의 위치는 GL_WINDOW_TARGET로 정의됩니다). 다음으로 창 옵션을 설정하고 마지막으로 창 대상의 현재 객체 id를 0
으로 설정하여 객체의 바인딩을 해제합니다. 우리가 설정한 옵션은 objectId가 참조하는 객체에 저장되고 객체를 GL_WINDOW_TARGET에 바인딩 하자마자 복원됩니다.
이 객체를 사용할 때의 장점은 응용 프로그램에서 둘 이상의 객체를 정의하고 옵션을 설정할 수 있으며 OpenGL의 상태를 사용하는 작업을 시작할 때마다 객체를 원하는 설정으로 바인딩한다는 것입니다. 예를 들어 3D 모델 데이터(집 또는 캐릭터)의 컨테이너 객체 역할을 하는 객체가 있고 그 중 하나를 그리려 할 때마다 그리려는 모델 데이터가 포함 된 객체를 바인딩 합니다(우리는 먼저 객체를 생성해야 하고 이 객체들에 대한 옵션을 설정해야 합니다). 여러 객체를 사용하면 많은 모델을 지정할 수 있으며 특정 모델을 그리려 할때마다 해당 옵션을 다시 설정하지 않고 그리기 전에 해당 객체를 간단하게 바인딩만 하면 됩니다.
시작
이제는 OpenGL이 사양 및 라이브러리로써 OpenGL이 대략 어떻게 작동하는지, 그리고 OpenGL에서 사용하는 몇 가지 사용자 정의 기법에 대해 조금 배웠습니다. 모든 것이 이해가 가지 않는다고 걱정하지 마세요. 강좌에서 각 단계를 거치며 OpenGL을 실제로 이해할 수 있는 예제를 볼 수 있을 것입니다. 다음 단계에서는 OpenGL context와 첫 번째 창을 만들 수 있을 것입니다.
추가 자료
- opengl.org: OpenGL 공식 웹사이트.
- OpenGL registry: 모든 OpenGL 버전에 대한 사양 및 확장
'OpenGL' 카테고리의 다른 글
[Learn OpenGL 번역] 2-4. 시작하기 - Hello Triangle (2) | 2018.07.15 |
---|---|
[Learn OpenGL 번역] 2-3. 시작하기 - Hello Window (5) | 2018.07.15 |
[Learn OpenGL 번역] 2-2. 시작하기 - Window 생성 (0) | 2018.07.15 |
[Learn OpenGL 번역] 1. 소개 (1) | 2018.07.15 |
LearnOpenGL 번역 시작 (5) | 2018.07.15 |