Wednesday, May 4, 2011

OpenGL Initialization example.

Following code is OpenGL initialization example using WGL.
First, it creates a GL surface for rendering and associate it with
current windows Device Context. WGL(an Windows version of EGL) is
used to perform this work. [tag: OpenGL Initialization]

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

    // Adjust the window size.
    RECT    kRect = { 0, 0, g_iWidth-1, g_iHeight-1 };

    AdjustWindowRect(&kRect, WS_OVERLAPPEDWINDOW, true);

    hInst = hInstance;

    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      0, 0, kRect.right - kRect.left + 1, kRect.bottom - kRect.top + 1, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   // Get DC for OpenGL.
   g_hDC = GetDC(hWnd);

   {
        // Select format for drawing surface.
        PIXELFORMATDESCRIPTOR    kPFD;
        int                        iPixelFormat;
        BOOL                    bSuccess;

        memset(&kPFD, 0, sizeof(PIXELFORMATDESCRIPTOR));
        kPFD.nSize = sizeof(PIXELFORMATDESCRIPTOR);
        kPFD.nVersion = 1;
        kPFD.dwFlags = PFD_DRAW_TO_WINDOW |
                        PFD_SUPPORT_OPENGL |
                        PFD_GENERIC_ACCELERATED |
                        PFD_DOUBLEBUFFER;
        kPFD.iPixelType = PFD_TYPE_RGBA;
        kPFD.cColorBits = 24;
        kPFD.cDepthBits = 16;
        kPFD.cStencilBits = 8;

        // Choose pixel format.
        iPixelFormat = ChoosePixelFormat(g_hDC, &kPFD);
        if( iPixelFormat == 0 )
        {
            ReleaseDC(hWnd, g_hDC);
            return -1;
        }

        // Set pixel format.
        bSuccess = SetPixelFormat(g_hDC, iPixelFormat, &kPFD);
        if( !bSuccess )
        {
            ReleaseDC(hWnd, g_hDC);
            return -1;
        }

        // Create openGL context.
        g_hGLRC = wglCreateContext(g_hDC);
        if( !g_hGLRC )
        {
            ReleaseDC(hWnd, g_hDC);
            return -3;
        }

        // Make current context.
        bSuccess = wglMakeCurrent(g_hDC, g_hGLRC);
        if( !bSuccess )
        {
            wglDeleteContext(g_hGLRC);
            ReleaseDC(hWnd, g_hDC);
            return -4;
        }

        // Initialize OpenGL Environment.
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();

        // Set viewport.
        glViewport(0, 0, g_iWidth, g_iHeight);

        // Set ModelView matrix.
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        // Set clear color.
        glClearColor(0.2f, 0.0f, 0.0f, 1.0f);
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}