現在是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