Post Lists

2018년 6월 24일 일요일

Getting Started - OpenGL(2) 번역

https://learnopengl.com/Introduction
위의 자료를 번역한 내용입니다.
---------------------------------------------------------------------------------------
OpenGL
 우리의 여행을 시작하기전에, 우리는 처음에 OpenGL이 실제로 무엇인지를 정의해야만 한다. OpenGL은 주로 API(Application Programming Interface)라고 고려되어진다. 그것은 우리에게 그래픽스와 이미지를 조작하는데 우리가 사용할 수 있는 많은 일련의 함수들을 제공한다. 그러나 OpenGL은 그자체로 API가 아니라 단순히 Khronos Group에 의해 개발되고 유지되는 한 설명서이다. 

OpenGL 설명서는 정확하게 각각의 함수의 결과와 output이 무엇이 되어야하고 그것이 어떻게 수행하는지를 명시한다. 이러한 함수들이 어떻게 작동하는지에 대한 해결책을 생각해내는 것은 이 설명서를 구현하는 개발자에게 달려있다. OpenGL 명세서는 우리에게 구현 세부사항을 주지 않기 때문에, OpenGL의 실제 개발된 버전은 다른 구현방법을 가지는 것을 허용한다. 그들의 결과가 명세서와 부합하는한 (그리고 따라서 사용자에게 같다?)

실제 OpenGL 라이브러리들을 개발하는 사람들은 보통 그래픽카드 제조사이다. 너가 구매한 각각의 그래픽카드는 그 그래픽카드를 위해 특정하게 개발된 OpenGL의 버전들인 OpenGL의 특정한 버전을 지원한다. Apple 시스템을 사용할 때, OpenGL 라이브러리는 Apple 그 자체로 유지되어진다. 리눅스에서는, 그래픽 공급자 버전과 이러한 라이브러리들의 취미자?들의 적응을 조합한게 있다. 이것은 또한 OpenGL이 그것이 해서는 안되는 이상한 행동을 보여줄 때마다, 이것은 그래픽스 카드 제조사의 잘못일 가능성이 있다는 것을 의미한다. 

Green Box
대부분의 구현들이 그래픽카드 제조사들에 의해 만들어지기 때문에, 구현에 있어서 버그가 있을 때마다, 이것은 보통 너의 비디오 카드 드라이버를 업데이트함으로써 해결되어 질 수 있다. 그러한 드라이버들은 너의 그래픽카드가 지원하는 OpenGL의 가장 최신 버전을 포함한다. 이것은 때때로 너의 그래픽 드라이버를 업데이트 시키라고 충고되는 이유들 중의 하나이다.

Khronos는 공공연히 OpenGL versions들에 대한 모든 명세 문서들을 제공한다. 흥미가 있는 독자들은 version 3.3의 OpenGL의 명세서를 여기에서 발견할 수 있다. 만약 당신이 OpenGL의 세부사항을 더 알기를 원한다면 이 문서는 좋은 자료이다 (그것들이 대개 어떻게 구현이 아닌 결과들을 묘사하는지에 주목해라). 명세들은 또한 그것의 함수들의 정확한 동작들을 발견하기 위한 훌륭한 참고서이다.

Core-profile vs Immediate mode
 구세대에서, OpenGL을 사용한다는 것은 immediate mode로 개발하는 것을 의미한다(종종 고정된 함수 파이프라인으로서 언급되는). 그 immediate mode는 그래픽스를 그리는 쉽게 사용할 수 있는 방법이다. 대부분의 OpenGL의 기능들은 라이브러리에 숨겨져있다. 그리고 개발자들은 OpenGL이 그것의 연산을 어떻게 하는지에 대해 어떠한 자유도가 없었다. 개발자들은 결국 좀 더 유연성을 원했고, 시간이 흘러 그 명세들은 좀 더 유연해졌다. 개발자들은 그들의 그래픽스에 대해 좀 더 통제력을 얻었다. immediate mode는 정말 사용하고 이해하기에 쉽다. 그러나 그것은 또한 극히 비효율적이다. 그 이유 때문에, 명세는 immediate mode 기능들을 3.2 version으로부터 반대하기 시작했다. 그리고 개발자들이 OpenGL의 core-profile 모드에서 개발하도록 동기부여하기 시작했다. core-profile 모드는 모든 오래된 반대되는 기능들을 제거한 OpenGL의 명세의 분할이다.

OpenGL의 core-profile을 사용할 때, OpenGL은 우리가 현대의 pratice들을 사용하는 것을 강요한다. 우리가 OpenGL의 반대되어지는 함수들 중 하나를 사용하려고 할 때마다, OpenGL은 에러를 일으키고 draw를 중단한다. 현대의 접근법을 배우는 것의 이점은 그것이 매우 유연하고 효율적이라는 것이다. 하지만, 불행하게도 배우기 어렵다. immediate mode는 OpenGL이 수행했던 실제 연산으로부터 많은 것들을 추상화했다. 그것이 배우기 쉬운 반면에, OpenGL이 실제로 어떻게 작동하는지를 이해하는 것은 어려웠었다. 현대의 접근법은 개발자들이 OpenGL과 그래픽스 프로그래밍을 진정으로 이해하는 것을 요구한다. 그것이 꽤 어려울지라도, 그것은 유연성, 효율성, 좀 더 중요하게그래픽스 프로그래밍에 대한 더욱 깊은 이해를 감안한다.

이것이 우리의 튜토리얼이 Core-Profile OpenGL version 3.3에서 구성된 이유이다. 그것이 좀 더 어려울지라도, 크게 그 값을 한다.

오늘날에 대해서  OpenGL의 더욱 높은 버전들은 나와있. (글을 쓸 때에는 4.5버전) 너는 물어볼지도 모른다. OpenGL 4.5가 나와있는데 왜 OpenGL 3.3을 배우길 원하냐고?
그 질문에 대한 답은 상대적으로 간단하다. 버전 3.3부터 시작한 OpenGL의 모든 미래의 버전들은 OpenGL의 핵심 역학을 바꾸지않고 부가적인 쓸모있는 기능들을 OpenGL에 더하는 것이다. 새로운 버전은 단지 같은 task를 성취하기 위해 좀 더 효율적이고 또는 좀 더 실용적인 방법을 도입하는 것이다. 그 결과는 모든 개념들과 기술들이 현대 OpenGL 버전들에 대해 같게 남아 있다는 것이다. 그래서 OpenGL 3.3을 배우는 것은 완벽하게 유요하다. 너가 준비가 되거나 또는 좀 더 숙련되어 있을 때 마다, 당신은 쉽게 특정한 OpenGL 버전들로부터 특정한 기능들을 쉽게 사용할 수 있다.

Red Box
가장 최신의 OpenGL 버전으로부터 기능을 사용할 때, 오직 가장 현대의 그리픽카드들이 당신의 프로그램을 실행할 수 있을 것이다. 이것은 종종 대부분의 개발자들이 OpenGL의 더욱 낮은 버전을 타겟으로 잡고 그리고 부가적으로 더욱 높은 버전의 기능을 가능하게 하는이유이다. 

몇몇 튜토리얼에서 당신은 가끔식 좀 더 현대 기능들을 발견할 것이다.

Extensions
 OpenGL의 훌륭한 기능은 그것의 확장 지원이다. 그래픽스 회사가 새로운 기술 또는 렌더링을 위한 새로운 큰 최적화를 고안할 때마다, 이것은 종종 드라이버에서 구현된 확장에서 발견된다. 만약 프로그램이 구동되는 하드웨어가 그러한 확장을 지원한다면, 개발자들은 좀 더 고급의 또는 효율적인 그래픽스를 위한 확장 버전에 의해 제고오디는 기능들을 사용할 수 있다. 이러한 방식으로, 그래픽스 개발자들은 간단히 확장 버전이 그래픽카드에 의해 지원되는지를 체크하여 여전히 OpenGL이 그것의 미래버전에 그 기능을 포함하는 것을 기다리지 않고 이러한 새로운 렌더링 기술들을 사용할 수 있다. 종종, 확장 버전이 인기있거나 매우 유용할 때, 그것은 결국 미래 OpenGL의 미래 버전의 일부가 된다.

개발자는 그러고나서 이러한 확장버전이 이용가능한지를 검색해야만 한다. (또는 OpenGL 확장 라이브러리를 사용해야만 한다.) 이것은 개발자들이 확장 버전이 이용가능한지에 기반으로 하여 좀 더 좋고 효율적인 것을 하도록하게 한다.


if(GL_ARB_extension_name)
{
// Do cool new and modern stuff supported by hardware
}
else
{
// Extension not supported: do it the old way
}

OpenGL 3.3 버전으로, 우리는 대부분의 기술을 위해 확장 버전을 필요하지 않는다. 그러나 필요할 때마다 적절한 지침이 제공되어 진다.


State machine
 OpenGL은 그 자체로 큰 state machine이다. 즉, OpenGL이 어떻게 지금 작동하는지를 정의한 변수들의 모음이다. OpenGL의 상태는 흔히 OpenGL context로서 언급되어 진다. OpenGL을 사용할 때, 우리는 몇가지 옵션을 설정하여 몇가지 버퍼를 조작하고 그리고나서 current context를 사용하면서 종종 그것의 상태를 바꾸고 렌더링한다.

예를들어, 삼각형 대신에 지금 선을 그리길 원한다고 OpenGL에게 말할 때 마다, 우리는 OpenGL이 어떻게 그려야하는지를 설정하는 몇 가지 context variable을 바꿔서 OpenGL의 상태를 바꾼다. 우리가 OpenGL에게 그것이 선을 그려야한다고 말하여 상태를 바꾸자마자, 그 다음 drawing command들은 지금 삼각형 대신에 선을 그릴 것이다.

Objects
 OpenGL 라이브러리들은 C로 쓰였다. 그리고 다른 언어에서의 많은 derivations를(변형? 어원?) 고려한다. 그러나 그것의 핵심에서는, 그것은 C-library로 남아 있다. C언어로 구성된 것들 대부분이 다른 높은 수준의 언어들로 잘 바뀌지 않기 때문에, OpenGL은 몇 가지 추상화로 만들어졌다. 그러한 추상화들 중 하나는 OpenGL에 있는 object이다.

OpenGL에 있는 object는 OpenGL의 상태의 하위 셋트를 나타내는 옵션들의 모음이다. 예를들어, 우리는 drawing window의 상태를 나타내는 object를 가질 수 있다. 우리는 그것의 크기를 설정하고, 그것이 얼마나 많은 색깔들을 지원할지, 등을 설정한다. 어떤 사람은 C같은 구조체를 object로서 시각화 할 수 있다.

struct object_name
{
float option1;
float option2;
char[] name;
};

우리가 object들을 사용하길 원할 때 마다, 그것은 일반적으로 이것처럼 보인다. (큰 구조체로서 OpenGL의 context로서 구현된):

// The State of OpenGL
struct OpenGL_Context
{
...
object * object_Window_Target;
...
};

// create object
unsigned int objectId = 0;
glGenObject(1, &objectId);
// bind object to context
glBindObject(GL_WINDOW_TARGET, objectId);
// set options of object currently bound to GL_WINDOW_TARGET
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 800);
// set context target back to default
glBindObject(GL_WINDOW_TARGET, 0);

이 작은 코드 조각은 OpenGL에서 작업할 때 너가 빈번하게 보게 될 workflow이다. 우리는 처음에 오브젝트를 만들고, 그것에 대한 참조를 아이디로 저장한다. (실제 객체 데이터는 scene뒤에 저장되어진다.) 그리고나서 우리는 object를 context의 target location에 bind한다. ( 예시 윈도우 오브젝트 타겟의 위치는 GL_WINDOW_TARGET으로 정의되어진다.) 다음으로 우리는 윈도우 옵션을 설정하고, 마지막으로 윈도우 타겟의 현재 object id를 0으로 설정하여 object를 unbind한다. 우리가 설정한 옵션들은 objectId로 참조되어지는 객체에 저장되어진다. 그리고 우리가 GL_WINDOW_TARGET에 다시 object를 bind하자마자 재저장 되어진다.

Red Box
지금까지 제공된 코드 샘플들은  OpenGL이 어떻게 작동하는지에 대해 대략적인 것을 보여준다. 튜토리얼 전반을 통해, 당신은 충분히 실제 예제를 만나보게 될 것이다.

이러한 객체들을 사용하는것에 대한 훌륭한 것은 우리가 우리의 프로그램에서 한 객체 이상을 정의할 수 있고, 그들의 옵션을 설정하고 우리가 OpenGL의 상태를 사용하는 연산시작할 때마다 우리는 객체와 선호되는 설정을 bind한다는 것이다. 예를들어, 3D 모델 데이터를 위한 container object로서 행동하는 객체들이 있다. 그리고 우리가 그것들 중 하나를 draw하길 원할 때마다, 우리는 우리가 그리길 원하는 model data를 포함하는 객체를 bind한다. ( 우리는 처음에 이러한 객체들을 위한 옵션들을 만들었고 설정했다.) 몇가지 객체들을 가지는 것은 우리가 많은 모델들을 명시하는 것을 가능하게 한다. 우리가 특정한 모델을 그리길 원할 때 마다, 우리는 모든 그들의 옵션을 다시 설정하지 않고 그리기 전에 상응하는 객체들을 간단히 bind한다.

Let's get started
 너는 지금 명세와 라이브러리로서 OpenGL에 대해 조금 배웠고 어떻게 OpenGL이 hood 밑에서 대략 작동하는지를 배웠고, OpenGL이 사용하는 몇가지 custom tricks들도.
너가 그것을 모두 이해하지 못했다고 해도 걱정하지 말라. 튜토리얼 전반을 통해 우리는 각 단계를 지날 것이고 OpenGL을 이해하기위해 충분한 예제들을 볼 것이다. 만약 너가 다음 단계를 시작할 준비가 되었따면 우리는 OpenGL context와 우리의 처음 window를 만들기 시작할 수 있다.

댓글 없음:

댓글 쓰기