블로그 이미지
대갈장군

calendar

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
31

Notice

2009. 3. 12. 03:41 OpenGL
OpenGL을 Windows API 환경에서 작성하다 보면 Rendering Context 라는 말을 듣게 된다.

처음에 그 단어를 들었을때 '뭐여? 저것이?' 라고 생각했던 기억이 난다. 알고보니 이 Rendering Context 는 Windows API의 Device Context에 대응되는 OpenGL의 Device Context인 거였다.

바로 어제 작성한 글을 보면 Device Context가 무엇인지 말하고 있는데 DC는 특정한 하나의 윈도우의 다양한 그리기 설정을 저장하고 있는 구조체였다.

이런 구조체가 필요한 이유는 윈도우에서 윈도우 마다 서로 다른 형태의 그림과 글자, 선등을 그려줘야 하기 때문이라고 했다.

OpenGL을 Windows 환경에서 사용할 경우 주로 GLUT 를 이용해서 단 하나의 창으로 모든 렌더링을 보여주곤 하는데 이는 사실 여러개의 윈도우를 동시에 사용하는 멀티 태스킹의 윈도우 환경에는 조금 모순적이다.

고로, 지금 나의 경우처럼 Window API를 이용해 OpenGL 프로그램을 작성할 경우, 내가 렌더링한 OpenGL의 결과 화면 (매 프레임)을 특정한 윈도우에 그려야 하는데 이때 어떤 윈도우에 OpenGL을 그려 넣어야 하나 하는 문제가 생긴다.

따라서 Windows 환경에서는 OpenGL 명령들을 (그림 그려내는 명령들) 수행하기 전에 현재의 렌더링 창 (그려지는 놈이 보여질 창)을 지정하는 방법이 필요하다. 바로 그 정보를 저장하는 놈이 Rendering Context 이다. 결국 이 Rendering Context 는 Windows의 Device Context이고 다만 OpenGL에서는 조금 다른 형태의 구조체로 저장이 된다는 점이다. Rendering Context 는 OpenGL 렌더링을 위한 추가적인 멤버 변수들을 가지고 있을 것이다.

Windows 환경 위에서 작성하는 OpenGL은 반드시 하나 이상의 윈도우를 가져야 하므로 최소한 하나의 유효한 DC는 소유하고 있을 것이다.

이 유효한 (유효하다는 의미는 현재의 graphic device와 호환이 되는 pixel format 을 가진 이라는 의미) DC를 이용해서 OpenGL의 Rendering Context 를 얻어온다. 그 함수가 바로 wglCreateContext() 이다.

이 함수는 올바른 픽셀 포맷을 가진 윈도우 창의 DC를 입력으로 받아서 그와 호화되는 형식의 Rendering Context 를 출력으로 돌려준다.

HGLRC hRC;
HDC hDC;
hRC = wglCreateContext(hDC);


특별한 점은 일반적인 윈도우 어플리케이션의 경우에는 여러개의 Context를 가질수 있지만 OpenGL의 경우에는 작업을 할 목적지 윈도우를 정확하게 알아야 하므로 한개의 스레드당 하나의 Rendering Context만 가질수 있다는 점이다.

wglCreateContext() 함수를 이용해서 Rendering Context를 얻은다음 wglMakeCurrent(HDC hDC, HGLRC hRC); 함수를 호출하게 되면 입력 인자로 들어온 Device Context와 Rendering Context를 연결하게 되어 특정한 윈도우 창과 연결된다.

Rendering Context를 지우기 위해서는 wglMakeCurrent(hDC, NULL)을 호출해서 현재 선택된 Rendering Context를 해제하고 wglDeleteContext(hRC)를 호출해서 해제한 Rendering Context를 삭제하면 된다.

주의 할 것은 위의 함수를 호출해서 Rendering Context를 제거하기 전에 Display List와 Texture 개체를 삭제해야 한다.


posted by 대갈장군