블로그 이미지
대갈장군

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

'Device Context'에 해당되는 글 2

  1. 2009.03.12 OpenGL Rendering Context v.s. Windows Device Context
  2. 2009.03.11 Device Context의 개념 + GetDC / ReleaseDC
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 대갈장군
2009. 3. 11. 04:45 프로그래밍/Windows API
OpenGL 프로그램을 주로 작성하면 사실 Windows API에 대해서 많은 지식이 필요하지 않지만 늘 듣는 말에 대해서는 알아둘 필요가 있는데 아무래도 넘버 1이 Device Context가 아닌가 싶다.

알고 있으면 쉽지만 모르면 알쏭달쏭한 것이 Device Context이다.

기본적으로 Windows는 세가지 동적 연결 라이브러리 (DLL)로 구성되는데 메모리와 프로그램을 관리하는 KERNEL, 유저 인터페이스와 윈도우를 관리하는 USER, 그리고 화면 처리와 그래픽을 담당하는 GDI이다.

GDI는 풀어서 쓰면 Graphic Device Interface인데 한글로 다시 풀어 설명하면 '그래픽 장치 접속 (접근) 함수'이다.

한글로 풀어쓰니 우끼다.. ㅋㅋㅋ

GDI를 통해서 우리는 화면에 글도 쓰고 그림도 넣는 것이다. 그러므로 간단히 생각해도 GDI와 Device Context (DC)가 관계되어 있다는 것을 알수 있다.

일단 답부터 말하면 DC는 걍 구조체이다. 그 구조체 안에는 각종 멤버 함수들이 정보를 담고 있는데 이 정보는 특정한 '하나의' 윈도우에 대한 그래픽 정보이다. 예를 들자면 폰트, 선의 색상, 굵기, 채움 무늬, 그리기 모드, 시작 위치 등이다.

여기서 중요한 점은 '하나의' 윈도우에 대한 것이라는 점이다. Windows API 함수를 이용해 프로그램을 작성하다 보면 항상 임의의 윈도우에 뭔가를 그리기 위해서는 'GetDC()' 함수를 이용해서 '해당 윈도우'의 Device Context를 작성해야 한다.

이 점을 잊어버리게 되면 Device Context를 변경하지 않거나 해제 하지 않고 다른 윈도우에 이전 윈도우의 DC를 사용하는 오류를 저지를 수 있지 않을까 하는 생각이 든다...

아무튼 Device Context는 한글로 해석하면 '장치 내용' 정도가 되겠는데 푸훗.. 우끼다... 이 Device라는 단어를 한국어로 해석하면 '장치'이지만 사실 그 의미는 컴퓨터에 삽입된 하드웨어 장치만 의미하는 것이 아니라 특정한 어떤것이 그 하나로써 독립적이면 전부 Device라고 하는 듯 하다.

즉, 윈도우 한개, 동영상 파일 한개, 그림 이미지 한개 등 그 하나로써 독립성을 완벽하게 가지는 것을 Device라고 한다면 Device Context의 의미가 좀더 쉽게 다가온다.

Device에 대한 각종 정보를 담고 있는 구조체가 바로 Device Context이고 Windows API에서 Device는 바로 '하나의 윈도우'를 의미한다.

이런 DC를 작성하는 것이 바로 GetDC(HWND hWnd) 함수이다. 이 함수는 입력으로 들어오는 HWND hWnd 윈도우에 적당한 DC를 만들어서 (각종 그리기 정보들) 그 값을 리턴하여 준다.

즉, hdc = GetDC(hWnd); 하게 되면 hWnd 윈도우에 알맞는 DC를 만들어서 hdc에 대입하고 이 hdc를 이용해서 그 윈도우에다가 마구 마구 그리면 된다. 참 쉽죠잉~

GetDC() 함수 대신 BeginPaint() 함수도 있는데 이 함수의 특징은 '오직' WM_PAINT 루틴에서만 사용가능하다는 점이다. 흠. 흥미롭죠~

주의할 건 GetDC로 특정 윈도우의 DC를 얻어왔다면 반드시 ReleaseDC로 해제해주는 것을 잊지 말자는 것.




'프로그래밍 > Windows API' 카테고리의 다른 글

윈도우 - 차일드, 팝업  (0) 2009.11.17
윈도우 - SetClassLongPtr(), SetWindowLongPtr()  (0) 2009.11.17
윈도우 - WNDCLASS 구조체  (0) 2009.11.17
윈도우 - CreateWindow()  (0) 2009.11.17
메모리, Win32 vs. Win16  (2) 2009.05.22
posted by 대갈장군
prev 1 next