
-----------------------------------
jamonathin
Tue Nov 22, 2005 12:11 pm

Getting Started on OpenGL
-----------------------------------
Hey i was wondering how to get started with OpenGL programming.  If anyone can submit like a basic program (with code) it'd help out a lot.  I know you guys will probabily preach that I should master c++ before i move onto OpenGL, but . . yeah, anyways . . :P.  

If anyoen can help it'd be great, thanks :).

-----------------------------------
jamonathin
Tue Nov 22, 2005 12:30 pm


-----------------------------------
And I really dont know anything about it.  As in, what program to write it in/compile it in.  (i guess you can write it anywhere just dont know how to run it), and 0 OpenlGL commands.  There's a [url="http://www.cprogramming.com/tutorial/gl6.html"]tutorial i found, but it doesn't say how to run it, and it doesn't work in Micosoft Visual C++ :? . . .

   P L E H

-----------------------------------
Geminias
Tue Nov 22, 2005 7:23 pm


-----------------------------------
my suggestion is get a real compiler.. this code will work with MinGW or Dev-c++ since it uses the MinGW compiler. 


/**************************
 * Includes
 *
 **************************/

#include 
#include 


/**************************
 * Function Declarations
 *
 **************************/

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam);
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);


/**************************
 * WinMain
 *
 **************************/

int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,
                    int iCmdShow)
{
    WNDCLASS wc;
    HWND hWnd;
    HDC hDC;
    HGLRC hRC;        
    MSG msg;
    BOOL bQuit = FALSE;
    float theta = 0.0f;

    /* register window class */
    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "GLSample";
    RegisterClass (&wc);

    /* create main window */
    hWnd = CreateWindow (
      "GLSample", "OpenGL Sample", 
      WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
      0, 0, 256, 256,
      NULL, NULL, hInstance, NULL);

    /* enable OpenGL for the window */
    EnableOpenGL (hWnd, &hDC, &hRC);

    /* program main loop */
    while (!bQuit)
    {
        /* check for messages */
        if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
        {
            /* handle or dispatch messages */
            if (msg.message == WM_QUIT)
            {
                bQuit = TRUE;
            }
            else
            {
                TranslateMessage (&msg);
                DispatchMessage (&msg);
            }
        }
        else
        {
            /* OpenGL animation code goes here */

            glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
            glClear (GL_COLOR_BUFFER_BIT);

            glPushMatrix ();
            glRotatef (theta, 0.0f, 0.0f, 1.0f);
            glBegin (GL_TRIANGLES);
            glColor3f (1.0f, 0.0f, 0.0f);   glVertex2f (0.0f, 1.0f);
            glColor3f (0.0f, 1.0f, 0.0f);   glVertex2f (0.87f, -0.5f);
            glColor3f (0.0f, 0.0f, 1.0f);   glVertex2f (-0.87f, -0.5f);
            glEnd ();
            glPopMatrix ();

            SwapBuffers (hDC);

            theta += 1.0f;
            Sleep (1);
        }
    }

    /* shutdown OpenGL */
    DisableOpenGL (hWnd, hDC, hRC);

    /* destroy the window explicitly */
    DestroyWindow (hWnd);

    return msg.wParam;
}


/********************
 * Window Procedure
 *
 ********************/

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
                          WPARAM wParam, LPARAM lParam)
{

    switch (message)
    {
    case WM_CREATE:
        return 0;
    case WM_CLOSE:
        PostQuitMessage (0);
        return 0;

    case WM_DESTROY:
        return 0;

    case WM_KEYDOWN:
        switch (wParam)
        {
        case VK_ESCAPE:
            PostQuitMessage(0);
            return 0;
        }
        return 0;

    default:
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
}


/*******************
 * Enable OpenGL
 *
 *******************/

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
{
    PIXELFORMATDESCRIPTOR pfd;
    int iFormat;

    /* get the device context (DC) */
    *hDC = GetDC (hWnd);

    /* set the pixel format for the DC */
    ZeroMemory (&pfd, 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 = 24;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;
    iFormat = ChoosePixelFormat (*hDC, &pfd);
    SetPixelFormat (*hDC, iFormat, &pfd);

    /* create and enable the render context (RC) */
    *hRC = wglCreateContext( *hDC );
    wglMakeCurrent( *hDC, *hRC );

}


/******************
 * Disable OpenGL
 *
 ******************/

void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)
{
    wglMakeCurrent (NULL, NULL);
    wglDeleteContext (hRC);
    ReleaseDC (hWnd, hDC);
}


-----------------------------------
Geminias
Tue Nov 22, 2005 7:28 pm


-----------------------------------
thats a pretty basic simple program.. one of the simplest you'll ever see in opengl aside from just drawing static objects on the screen.  

see gandolfs spiel on compilers in the c++ tutorial section.  

if you can't run c++ code, dont bother trying to learn opengl.  If you want some graphics for some GUI's or something use winAPI and VC++.. thats much simpler.

-----------------------------------
wtd
Tue Nov 22, 2005 7:32 pm


-----------------------------------
Geminias: that assumes that portability is not a high priority.  Some of us don't like being limited to Windows.

-----------------------------------
Geminias
Tue Nov 22, 2005 7:39 pm


-----------------------------------
true winAPI would be limiting to windows only as it uses the win32.dll...  if you dont like being limited to windows dont use anything made by microsoft and dont use anything that starts with "win"

-----------------------------------
jamonathin
Wed Nov 23, 2005 10:33 am


-----------------------------------
Thanks for your help Geminias :).

-----------------------------------
Mazer
Wed Nov 23, 2005 3:11 pm


-----------------------------------
true winAPI would be limiting to windows only as it uses the win32.dll...  if you dont like being limited to windows dont use anything made by microsoft and dont use anything that starts with "win"
I'd like to see how you clean your glass surfaces without using windex whilst programming in OpenGL!  :?

-----------------------------------
Geminias
Wed Nov 23, 2005 4:50 pm


-----------------------------------
water and vinegar is the linux user alternative  (note: how water and vinegar works much better)

-----------------------------------
md
Wed Nov 23, 2005 8:29 pm


-----------------------------------
Also note that anything that compiles in MinGW or Dev-C++ should also compile in MSVC++, or even on linux using the appropriate libraries. The code posted *might* even run on linux under wine. For truely portable code I'd recomend checking out SDL, though it might take a bit to figure it out at the same time as openGL it's almost guarunteed to be portable.

-----------------------------------
wtd
Wed Nov 23, 2005 8:41 pm


-----------------------------------
Also note that anything that compiles in MinGW or Dev-C++ should also compile in MSVC++

Assuming we're not talking about MSVC++ 6.  That's not always a safe assumption as academic institutions seem to have a perverse love of pointlessly outdated software.
