일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 팩터리
- 그루비 스타일 빌더
- 싱글턴 패턴
- 프로토타입
- 싱글톤 패턴
- 빌더 패턴
- 컴포지트
- 싱글턴
- 팩터리 메서드
- 함수형 팩터리
- 디자인패턴
- 싱글톤
- 모던C++디자인패턴
- 브릿지
- 브릿지 패턴
- 추상 팩터리
- 흐름식 빌더
- 데커레이터 패턴
- 데커레이터
- 빌더
- 팩터리 패턴
- 동적 데커레이터
- 프로토타입 중복처리
- 내부 팩터리
- 디자인 패턴
- 프로토타입 패턴
- 컴포지트 빌더
- 컴포지트 패턴
- 단순한 빌더
- 동적 데코레이터
- Today
- Total
GGym's Practice Notes
WinAPI에 OpenGL 쓰기 본문
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 |