Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

게임공장

[Learn OpenGL 번역] 2-1. 시작하기 - OpenGL 본문

OpenGL

[Learn OpenGL 번역] 2-1. 시작하기 - OpenGL

짱승_ 2018. 7. 5. 14:20

OpenGL

시작하기/OpenGL

  시작하기 전에 먼저 OpenGL이란 무엇인지 알아야 합니다. OpenGL은 그래픽 및 이미지를 조작하는 데 사용할 수 있는 많은 기능들을 제공하는 API(Application Programming Interface)라고 볼 수 있습니다. 하지만 OpenGL 자체는 API가 아니라 Khronos Group이 개발하고 유지 관리하는 설명서입니다.

Image of OpenGL's logo

  

  OpenGL 설명서는 각 함수의 출력이 무엇이고 어떻게 수행되어야 하는지를 정의합니다. 이 설명서를 구현(implementing)하는 개발자는 해당 함수가 어떻게 작동해야하는지에 대한 솔루션을 제시해야 합니다. OpenGL 설명서는 구현 세부 사항을 제공하지 않으므로 OpenGL의 실제 개발 된 버전은 함수의 구현이 다를 수 있습니다.


  실제 OpenGL 라이브러리를 개발하는 사람들은 일반적으로 그래픽 카드 제조업체입니다. 여러분들이 구입한 각 그래픽 카드는 해당 카드(시리즈) 용으로 특별히 개발 된 OpenGL의 특정 버전을 지원합니다. Apple 시스템을 사용할 때 OpenGL 라이브러리는 Apple이 자체적으로 관리하며 Linux에서는 그래픽 공급 업체의 버전과 애호가(?)의 조합이 이러한 라이브러리에 존재합니다. 이 것은 OpenGL이 이상한 행동을 보여주는 것은 그래픽 카드 제조업체(또는 라이브러리를 개발 / 유지보수한 사람)의 잘못이라고 생각합니다.

  대부분의 구현은 그래픽 카드 제조사에 의해 만들어 졌기 때문에 버그가 발견된다면 일반적으로 그래픽 카드 드라이버를 업데이트하면 해결됩니다. 이러한 드라이버에는 카드가 지원하는 가장 최신 OpenGL 버전이 포함되어 있습니다. 이것이 그래픽 드라이버를 업데이트 하라는 알림이 항상 뜨는 이유 중 하나입니다.

  Khronos는 모든 OpenGL 버전에 대한 모든 설명 문서를 공개하고 있습니다. 관심있는 분은 여기에 OpenGL 3.3 버전(우리가 사용할 버전입니다.)을 찾을 수 있습니다. OpenGL의 세부사항을 공부하고 싶다면 많은 도움이 될 것입니다. 또한 설명서는 함수의 정확한 작동을 찾는 훌륭한 참고 자료로 쓰일 수 있습니다.

Core-profile vs Immediate mode

  옛날에는 OpenGL을 사용한다는 것은 그래픽을 그리기 위한 사용하기 쉬운 방법인 immediate mode (fixed function pipeline이라고도 함)로 개발한다는 것을 의미했습니다. OpenGL의 기능 대부분은 라이브러리에 숨겨져 있으며 개발자는 OpenGL의 작동 밥법에 대해 자유롭게 접근할 수 없었습니다. 개발자들은 계속해서 더 많은 유연성을 원했고 시간이 지남에 따라 사양이 더욱 유연해졌습니다. 그 결과 개발자들은 그래픽을 보다 잘 제어할 수 있게 되었습니다. immediate mode는 사용하기 쉽고 이해하기 쉽지만 매우 비효율적입니다. 이러한 이유 때문에 OpenGL은 3.2번에서 imiediate mode를 더 이상 사용하지 않기 시작했으며 개발자가 OpenGL의 사양에 따라 OpenGL의 core-profile 모드로 개발하도록 유도하기 시작했습니다.


  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의 하위 버전을 대상으로 하고 더 높은 버전의 기능은 선택적으로 활용하는 이유입니다.

  일부 강좌에서는 때때로 최신 기능을 찾아 볼 수 있습니다.

확장

  OpenGL의 가장 큰 특징은 확장 기능을 지원한다는 것입니다. 그래픽 회사에서 렌더링을 위한 새로운 기술 또는 최적화가 등장할 때마다 드라이버에서 그 기술이 확장되어 구현된 것을 발견할 수 있습니다. 응용 프로그램에서 실행되는 하드웨어가 이러한 확장을 지원하면 개발자는 확장에서 제공하는 기능을 사용하여 고급 그래픽 또는 효율적인 그래픽을 사용할 수 있습니다. 이렇게 하면 그래픽 개발자는 그래픽 카드가 확장 기능을 지원하는지 여부만 확인하여 OpenGL이 향후 버전의 기능을 포함할 때까지 기다릴 필요없이 이러한 새로운 렌더링 기술을 즉시 사용할 수 있습니다. 종종 확장 기능이 많이 쓰이거나 매우 유용하다가 생각되면 결국엔 추후 OpenGL 버전의 일부가 됩니다.


  개발자는 이러한 확장이 사용 가능한지 여부를 확인해야 합니다(또는 OpenGL 확장 라이브러리 사용). 이를 통해 개발자는 확장 기능을 사용할 수 있는지 여부에 따라 보다 효율적이거나 고급 기술의 작업을 수행할 수 있습니다.


if(GL_ARB_extension_name)
{
    // 하드웨어가 지원하는 새롭고 현대적인 기능을 수행
}
else
{
    // 확장 미지원: 예전의 방법으로 기능을 수행
}

  OpenGL 3.3버전에서는 대부분의 기술에 대한 확장이 거의 필요하지 않지만 필요한 경우 적절한 설명을 해드릴 것입니다.

State machine

  OpenGL은 그 자체로 거대한 stata machine(OpenGL이 현재 어떻게 작동해야하는지를 줭의하는 변수들의 집합)입니다. OpenGL의 상태는 일반적으로 OpenGL context라고 합니다. OpenGL을 사용할 때 일부 옵션을 설정하고 버퍼를 조작한 다음 현재 context를 사용하여 렌더링함으로써 상태를 변경하는 경우가 많습니다.


  OpenGL에게 삼각형 대신 선을 그려야 한다고 말할 때마다 OpenGL이 그려야하는 방식을 설정하는 context 변수를 변경하여 OpenGL의 상태를 변경합니다. OpenGL이 선을 그어야한다고 말하여 상태를 변경하자마자, 다음 드로잉 명령은 이제 삼각형 대신 선을 그리는 명령이 됩니다.


  OpenGL에서 작업 할 때는 OpenGL의 현재 상태를 기반으로 일부 작업을 수행하는 여러가지 state-using 함수와 context를 변경하는 몇 가지 상태 변경 함수들을 보게 될 것입니다. OpenGL은 기본적으로 하나의 대형 state machine이라는 것을 생각하고 있다면 대부분의 기능들을 이해하기 수월할 것입니다.

객체

  OpenGL 라이브러리는 C로 작성되었으며 다른 언어로 된 많은 파생어를 허용하지만 핵심 부분은 C 라이브러리입니다. C 언어의 언어 구조가 다른 고급언어와 잘 일치하기 않기 때문에 OpenGL은 몇가지 추상화를 염두에 두고 개발되었습니다. 이러한 추상화 중 하나는 OpenGL의 객체입니다.


  OpenGL의 객체(object)는 OpenGL 상태의 하위 집합을 나타내는 옵션들의 모음입니다. 예를 들어 드로잉 창의 설정을 나타내는 객체를 가질 수 있습니다. 우리는 창의 크기, 얼마나 많은 색상을 지원하는 지 등을 설정할 수 있습니다. 객체를 C와 같은 구조체로 시각화할 수 있습니다.


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의 작동 방식에 대한 간략한 설명입니다. 앞으로 강좌를 통해 충분한 실제 예제를 접하게 될 것입니다.

  이 객체를 사용할 때의 장점은 응용 프로그램에서 둘 이상의 객체를 정의하고 옵션을 설정할 수 있으며 OpenGL의 상태를 사용하는 작업을 시작할 때마다 객체를 원하는 설정으로 바인딩한다는 것입니다. 예를 들어 3D 모델 데이터(집 또는 캐릭터)의 컨테이너 객체 역할을 하는 객체가 있고 그 중 하나를 그리려 할 때마다 그리려는 모델 데이터가 포함 된 객체를 바인딩 합니다(우리는 먼저 객체를 생성해야 하고 이 객체들에 대한 옵션을 설정해야 합니다). 여러 객체를 사용하면 많은 모델을 지정할 수 있으며 특정 모델을 그리려 할때마다 해당 옵션을 다시 설정하지 않고 그리기 전에 해당 객체를 간단하게 바인딩만 하면 됩니다.

시작

  이제는 OpenGL이 사양 및 라이브러리로써 OpenGL이 대략 어떻게 작동하는지, 그리고 OpenGL에서 사용하는 몇 가지 사용자 정의 기법에 대해 조금 배웠습니다. 모든 것이 이해가 가지 않는다고 걱정하지 마세요. 강좌에서 각 단계를 거치며 OpenGL을 실제로 이해할 수 있는 예제를 볼 수 있을 것입니다. 다음 단계에서는 OpenGL context와 첫 번째 창을 만들 수 있을 것입니다.

추가 자료




출처 : https://learnopengl.com, Joey de Vries

반응형