Graphics/OpenGL

OpenGL 기초 - GLUT : Win32 예제

MOLOKINI 2014. 5. 27. 15:01
그냥 맛보기로 윈도우 환경 OpenGL 예제를 한번 보자.
 
윈도우 환경이 제공되는 경우라면 굳이 GLUT를 쓰지 않아도 구현이 가능하다.
GLUT는 앞서 말했듯 플랫폼 독립성을 보장하기 위해 윈도우를 지원하지 않는 운영체제에서도 사용가능하기 위해 존재하는 라이브러리다,
때문에, 윈도우가 있는 윈도우 운영체제에서는 GLUT없이도 구현이 가능한 것이다.
 
그럼, GLUT없이 구현된 OpenGL Win32예제를 보겠다.
 
GLUT를 추가하지 않았기 때문에, 프로젝트 구성요소에서 입력부분에 라이브러리 링크를 달아줘야한다.
 
opengl32.lib;glu32.lib
 
 

#include <windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>
//#include <gl/GLUT.h>                  GLUT없이 하는 예제
 
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void DoDisplay();
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("OpenGL");
HDC hdc;
HGLRC hrc;
 
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
       ,LPSTR lpszCmdParam,int nCmdShow)
{
     HWND hWnd;
     MSG Message;
     WNDCLASS WndClass;
     g_hInst=hInstance;
 
     WndClass.cbClsExtra=0;
     WndClass.cbWndExtra=0;
     WndClass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
     WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
     WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
     WndClass.hInstance=hInstance;
     WndClass.lpfnWndProc=WndProc;
     WndClass.lpszClassName=lpszClass;
     WndClass.lpszMenuName=NULL;
     WndClass.style=CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
     RegisterClass(&WndClass);
 
     hWnd=CreateWindow(lpszClass,lpszClass,
          WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
          CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
          NULL,(HMENU)NULL,hInstance,NULL);
     ShowWindow(hWnd,nCmdShow);
 
     while (GetMessage(&Message,NULL,0,0)) {
          TranslateMessage(&Message);
          DispatchMessage(&Message);
     }
     return (int)Message.wParam;
}
 
void DoDisplay()
{
     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:
          hWndMain=hWnd;
          PIXELFORMATDESCRIPTOR pfd;
          int nPixelFormat;
 
          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(hdc, &pfd);
          SetPixelFormat(hdc, nPixelFormat, &pfd);
 
          hrc=wglCreateContext(hdc);
          wglMakeCurrent(hdc, hrc);
          return 0;
     case WM_PAINT:
          DoDisplay();
          SetTextColor(hdc, RGB(255,255,0));
          SetBkMode(hdc,TRANSPARENT);
          TextOutA(hdc,10,10,"Win32 OpenGL",12);
          ValidateRect(hWnd, NULL);
          return 0;
     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();
          return 0;
     case WM_DESTROY:
          wglMakeCurrent(hdc, NULL);
          wglDeleteContext(hrc);
          ReleaseDC(hWnd,hdc);
          PostQuitMessage(0);
          return 0;
     }
     return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

 

 

 

'Graphics > OpenGL' 카테고리의 다른 글

glPush, PopMatrix, Ortho 등  (0) 2014.05.27
glutGameModeString, EnterGameMode 등  (0) 2014.05.27
OpenGL 기초 - GLUT : 애니메이션  (0) 2014.05.27
OpenGL 기초 - GLUT : 팝업메뉴  (0) 2014.05.27
OpenGL 기초 - GLUT : 입력처리  (0) 2014.05.27