GGym's Practice Notes

WinAPI에 OpenGL 쓰기 본문

WinAPI

WinAPI에 OpenGL 쓰기

GGym_ 2020. 5. 13. 22:28

OpenGL을 쓰기 위해선 PIXELFORMATDESCRIPTOR에 대하여 알아야한다.

PIXELFORMATDESCRIPTOR : 이 구조체는 서피스를 그리는데 필요한 픽셀포멧을 기술한다.

서피스는 그림상자라고 이해하면 편하다.

PIXELFORMATDESCRIPTOR pfd;

 

구조체의 내용을 채운다.

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

pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;

대부분의 기본 값을 0으로 하기위해서 memset()을 사용하여 0으로 설정한다. 나머지의 설명은 아래와 같다.

  nSize : 데이터 구조체의 크기

  nVersion : 데이터 구조체의 버전을 정한다. 1로 설정한다.

  dwFlags : 픽셀 버퍼의 속성을 정하는 비트플래그이다.

             PFD_DRAW_TO_WINDOW : 윈도우 혹은 디바이스 서피스에 그린다.

             PFD_SUPPORT_OPENGL : openGL그리기를 지원한다.

  iPixelType : 픽셀 데이터의 타입을 정한다.

             PFD_TYPE_RGBA : 각 픽셀을 RGBA성분으로 지니게 한다.

  cColorBits : 각 컬러 버퍼에서 컬러 비트 평면의 숫자를 정한다. ( 32비트 컬러 )

참조 : https://blog.naver.com/sony4u/80069584301

 

nPixelFormat = ChoosePixelFormat(g_hdc, &pfd);

DC가 지원하는 주어진 픽셀 포맷 사양과 일치하는 적절한 픽셀 포맷을 찾는다.

SetPixelFormat(g_hdc, nPixelFormat, &pfd);

지정된 DC의 픽셀포맷을 iPixelFormat이 가리키는 포맷으로 설정

 

HGLRC(GL Rendering Context Handle)와 DC를 연결한다.

렌더링 과정은 OpenGL drawing → HGLRC → HDC → application window 으로 이어진다.

g_hrc = wglCreateContext(g_hdc);	// Rendering Context 생성
wglMakeCurrent(g_hdc, g_hrc);	// 현재 스레드에 Rendering Context 설정

DC를 해제 하듯이 HGLRC도 해제 해주어야 한다.

wglMakeCurrent(g_hdc, NULL);	// Rendering Context 설정 해제
wglDeleteContext(g_hrc);	// Rendering Context 삭제

 

이제 WM_PAINT에 Display 함수를 두어 출력할 수 있다.

예제 코드 : 

더보기
void display()
{
	glClear(GL_COLOR_BUFFER_BIT);

	glBegin(GL_TRIANGLES);
	glVertex2f(0.0, 0.5);
	glVertex2f(-0.5, -0.5);
	glVertex2f(0.5, -0.5);
	glEnd();
	glFinish();
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) {
	switch (iMessage) {
	case WM_CREATE: {
		g_hWnd = hWnd;
		PIXELFORMATDESCRIPTOR pfd;
		int nPixelFormat;

		g_hdc = GetDC(hWnd);
		memset(&pfd, 0, sizeof(pfd));

		pfd.nSize = sizeof(pfd);
		pfd.nVersion = 1;
		pfd.dwFlags = PFD_DRAW_TO_WINDOW |
			PFD_SUPPORT_OPENGL;
		pfd.iPixelType = PFD_TYPE_RGBA;
		pfd.cColorBits = 32;

		nPixelFormat = ChoosePixelFormat(g_hdc, &pfd); // DC가 지원하는 주어진 픽셀 포맷 사양과 일치하는 적절한 픽셀 포맷을 찾는다.
		SetPixelFormat(g_hdc, nPixelFormat, &pfd);	// 지정된 DC의 픽셀포맷을 iPixelFormat이 가리키는 포맷으로 설정

		g_hrc = wglCreateContext(g_hdc);	// Rendering Context 생성
		wglMakeCurrent(g_hdc, g_hrc);	// 현재 스레드에 Rendering Context 설정
	}
				  break;
	case WM_PAINT: {
		display();
		ValidateRect(hWnd, NULL);
	}
				 break;
	case WM_SIZE: {
		glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();

		glOrtho(-1, 1, -1, 1, 1, -1);

		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
	}
				break;
	case WM_DESTROY: {
		wglMakeCurrent(g_hdc, NULL);	// Rendering Context 설정 해제
		wglDeleteContext(g_hrc);	// Rendering Context 삭제
		ReleaseDC(hWnd, g_hdc);
		PostQuitMessage(0);
	}
	}

	return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

'WinAPI' 카테고리의 다른 글

GDI Object  (0) 2020.05.09
DC (Device Context)  (0) 2020.05.07
윈도우 창크기 조정 세팅 (AdjustWindowRect(), SetWindowPos)  (0) 2020.05.07
WinAPI 기본 구조  (0) 2020.05.07