OpenGL最簡單的入門

來源:互聯網
上載者:User

     現在是1:00了,在睡覺之前先寫一點東西...想了一下,就簡單的OpenGL入門介紹吧。在Windows下的使用者都知道Direct X系列驅動吧,OpenGL也是與這種東西Direct3D作用很一樣的。關於DirectX與OpenGL的詳細介紹,文章太多了,國內有一篇文章介紹得很詳細,而且曆史脈絡也說得很清楚,推薦看一下:http://www.zkxt.com/D3D_OPENGL_1.htm。作為一個程式員,單是瞭解這些還是不夠的,不過,不看這篇文章的話更是不行,先看以上這篇文章再說吧。

    OpenGL全稱"開放式圖形庫",是由SGI公司開發的低層三維圖形API,目前在圖形開發領域已經成為工業標準。作為一個標準,在其官方網站可以查看其標準:http://www.opengl.org/,主要是由非贏利組織ARB來維護,主要是C/C++庫的實現,其他的實現現在已經有Java的支援http://www.opengl.org/resources/java/ (如:GL4Java)。不過,目前主要還是用於C/C++。在一些遊戲產商的強烈要求下,微軟公司也在Windows95以上的平台都實現了自己的作業系統的OpenGL庫支援,SGI公司也有自己的一套實現,不過是作為軟體來實現的,不支援硬體加速。

    以下就簡單的介紹一下入門知識:

1、環境的選擇:

     由於是國內很多使用者都是Windows作業系統,現在我簡單的介紹在Dev-C++中怎樣編譯自己的第一個OpenGL程式。Dev-C++是基於MinGW來開發的,關於這些資訊請到網上尋找吧。下載資訊請看我的其他Blog( ftp://ftp.jaist.ac.jp )裡為你提供的一個高速開源,登陸伺服器後,在sourceforge系列裡尋找Dev-cpp檔案夾,然後再下載就OK了。

     好了,開啟Dev-C++,選擇菜單:檔案/建立/工程/MultiMedia,選擇OpenGL,c++工程,然後確定就okay了。預設會替你建立一個範例的檔案。你現在也可以編譯運行它,F9快速鍵(或者使用菜單:運行/編譯運行也行)。好了,等待,一個不停選擇的三角形在動了吧。

    等等,就這麼簡單的話,我肯定要被人罵死的,尤其是那些不熟悉Win32API函數的讀者,根本就看不懂代碼是在做什麼。現在我來把這些簡單化。

2、簡單化的學習:

    找到代碼:

    else
        {
            /* OpenGL animation code goes here */

            glClearColor (0.0f, 0.0f, 0.0f, 0.0f);  //這一行開始

            ....

            SwapBuffers (hDC);

            theta += 1.0f; //到這一行
            Sleep (1);

        }

        好的,主要的內容就在這裡了,現在我們把這部分OpenGL繪圖的內容提到一個函數drawGrapchics中,並放到其他檔案中(這樣的話,我們在學習中就可以簡單的不管這個main.cpp檔案了)。

       好了,現在我們建立一個新的檔案simple.hpp吧,在左邊的工程管理裡,右擊,然後建立單元,把這個檔案儲存為simple.hpp,把上面的相關代碼剪下下來:

  float theta=1.0f;  //注意在原來的main.cpp的相關的這行東西,也剪下出來(這個主要是旋轉控制角度的)
  void drawGraphics(HDC& hDC){
    glClearColor (0.0f, 0.0f, 0.0f, 0.0f);

    ......

    SwapBuffers (hDC);  //調用交換緩衝資料,無論哪中實現,這個最後都是要調用的。

    theta -= 1.0; //控制角度,旋轉角度的大小
}   

main.cpp就變為:

...

#include "simple.hpp"     //添加標頭檔

....

else
        {
            /* OpenGL animation code goes here */
            drawGraphics(hDC); //簡化為函數操作
            Sleep (1);

        }     

...

以後當你要練習其他的話,呵呵,就添加其他的,然後把#include "simple.hpp"改為自己測試的檔案就行了,其他的都不用改。

3、大量的練習與學習:

      對於程式員來說,沒有API函數尋找是最為痛苦的事情了,在這方面Java做的最好。Dev-C++提供了Win32API和OpenGL API文檔的參考手冊下載,請到我上面提到的那個下載Dev-C++裡面下載。

      最好的入門教材莫過於OpenGL的RedBook了http://www.opengl.org/documentation/red_book_1.0/ 官方網站提供了這個版本的1.1的免費下載,其他版本的話自己出錢好了....~~。注意,學習過程中,不要看其他的架構實現,你主要是看OpenGL的主要主要函數實現,由於RedBook使用的是aux的建立視窗的方法,所以這部分東西我們可以省略,主要就學習其中的gl的實現就OK了。

      其次,再一步就是看NeHe的教程,現在國內有中文版下載,上Google搜尋下載就行了。

      其他的就等著學習,自己寫代碼,經驗學習了....

4、核對一下,完整的代碼(以免誤解了我的說解~~~):

首先是main.cpp:

/**************************
 * Includes
 *
 **************************/

#include <windows.h>
#include <gl/gl.h>
#include "simple.hpp"
//::void drawGraphics(HDC&);使用opengl

/**************************
 * 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;

    /* 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 */
   drawGraphics(hDC);
            Sleep (2);

        }
    }

    /* 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);
}

其次是simple.hpp:

//simple.hpp
float theta=1.0f;
void drawGraphics(HDC& hDC){
    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.0;
}

5、好了,簡單的怎樣介紹入門的就到這裡了,想學習OpenGL的哥們,還有MM,剩下的功夫到你自己了,努力去看,努力去寫吧...不要相信自己的眼力,不要相信自己理解了,實踐才是真理:-)

 

 

Note:oh,寫了40多分鐘....鬱悶!要睡覺了~~~各位朋友,有問題的話留言給我;或者看我的聯絡方法,發E-mail給我也行。先下線睡覺,晚安!

對這篇文章有什麼問題的話,可以留言給我。作者聯絡地址:Sidney.J.Yellow@gmail.com

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.