본문 바로가기

Graphics Note

device context and rendering context

GLUT를 사용하지 않고 openGL을 사용하기 위한 가장 중요한 과정은 openGL의 context를 얻는것이다. Windows에서 rendering context라 불리는 이 context를 얻기 위해서는 먼저 device context를 가지고 있어야한다. device context는 GDI에서 정의하는 그래픽 오브젝트에 대한 여러 특성을 담고있는 구조체(핸들러)이며 다음과 같이 윈도우 핸들러에 대한 DC를 얻어올 수 있다.

 

mhDC = GetDC(mhWnd);

 

다음으로 아래와 같이 DC의 포멧 설정을 한 후,

 

PIXELFORMATDESCRIPTOR pfd;

int nPixelFormat;

memset(&pfd, 0, sizeof(pfd));

pfd.nSize = sizeof(pfd);

pfd.nVersion = 1;

pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

pfd.iPixelType = PFD_TYPE_RGBA;

pfd.cColorBits = 32;

pfd.cDepthBits = 16;

pfd.iLayerType = PFD_MAIN_PLANE;

nPixelFormat = ChoosePixelFormat(mhDC, &pfd);

SetPixelFormat(mhDC, nPixelFormat, &pfd);

 

설정 된 DC에 대한 RC를 가져온다.

 

mhRC = wglCreateContext(mhDC);

 

이렇게 만들어진 context를 내 어플리케이션에서 사용하기 위해서는 생성된 context를 현재 사용되는 context로 설정해줘야한다.

 

wglMakeCurrent(mhDC, mhRC);

 

이는 메모리가 굉장히 작던 시절 context에 대한 메모리 비용이 크기때문에 여러 프로세스에서 하나의 context를 공유하며 쓰던 방식이 남아있기 때문이다. 하지만 opengl의 api가 context를 문제 없이 사용하기 위해서는 윈도우에 DC를 온전히 할당해줄 필요가 있는데, 이를 위해서 윈도우의 스타일에 CS_OWNDC 속성을 반드시 추가시켜야 한다.

이제 context를 가졌으니 gl의 함수를 원하는 만큼 사용하면 된다. 픽셀 포멧에 더블 버퍼를 사용한다 하였으니 렌더링을 위해서

 

SwapBuffers(mhDC);

 

를 통해 버퍼를 스왑해주도록 한다.

context를 다 사용하고 난 후에는 제거해주는 과정이 필수적이다. RC는 더이상 사용하지 않으니 제거하고, DC는 윈도우에게 돌려준다.

 

wglMakeCurrent(NULL, NULL);

wglDeleteContext(mhRC);

ReleaseDC(mhWnd, mhDC);

 

 

위 내용을 기반으로 opengl application을 위한 코어를 구성해보았다.

 

'Graphics Note' 카테고리의 다른 글

[Mathematics] quaternion interpolation  (0) 2014.03.28
[Mathematics] rotation quaternion details  (0) 2014.03.28
Bezier curve  (0) 2014.02.04
cube map upside-down  (0) 2014.01.22
Normal Matrix  (1) 2013.12.15