一、前言:
Delphi預設支援OpenGl,可以使用uses OpenGL單元來引用,之後就可以使用OpenGL的函數。 OpenGl是跨平台的,而且Windows很早就支援並整合在系統中,存在於system32中的opengl32.dll,不需要再額外安裝。雖然windows本身有d3d,但其能力有限,相關學習資料頁相對較少。
通常OpenGL僅支援以下幾種基本幾何圖形:點,線和多邊形。沒有表面或更高級的圖形(例如球狀圖形)能被繪製為基本圖形元素。但是它們能夠用多邊形來完美的模仿出來。隨意看看現代3D遊戲,你會發現它們幾乎完全是由三角形建立的。因此,我們不會被此限制所約束。
二、初始化
在使用OpenGL之前,需要先進行一些相關的參數設定。一般流程為:
「設定匹配的像素格式」(ChoosePixelFormat、SetPixelFormat)
「建立一個新的OpenGL渲染描述表」(wglCreateContext)
「設定OpenGL相關參數」、「繪圖」(glBegin、glEnd)
「刪除OpenGL渲染描述表」(wglDeleteContext)
procedure TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;begin With pfd do begin nSize := sizeof(TPIXELFORMATDESCRIPTOR); // size nVersion : 11; PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // support double-buffering iPixelType := PFD_TYPE_RGBA; // color type cColorBits := 24; // preferred color depth cRedBits := 0; ; cGreenShift := 0; cBlueBits := 0; cBlueShift := 0; cAlphaBits := 0; cAlphaShift := 0; // no alpha buffer cAccumBits := 0; cAccumRedBits := 0: no accumulation buffer; ; // accum bits (ignored) cAccumBlueBits := 0; cAccumAlphaBits := 0; cDepthBits := 16; // depth buffer cStencilBits := 0; // no stencil buffer cAuxBuffers := 0; // no auxiliary buffers iLayer := 0; = 0; dwLayerMask := 0; dwVisibleMask := 0; dwDamageMask := 0; end; FDC := GetDC(Handle); pixelFormat := ChoosePixelFormat(FDC, @pfd); if pixelFormat = 0 then FormatnFormat; , @pfd) then Exit; FHRC := wglCreateContext(FDC); wglMakeCurrent(FDC, FHRC); // 設定背景色為黑色參數為RGBA glClearColor(0, 0, 0, 0); // 設定視圖投影轉換矩陣正向投影glMatrixMode(GL_PROJECTION(GL_PROJECTION ); // 重置目前指定的矩陣為單位矩陣glLoadIdentity; //指定OpenGL在此區域內繪圖glViewPort(0, 0, ClientWidth, ClientHeight); // 設定世界座標系的範圍gluOrtho2D(0, ClientWidth, ClientHeight, 0); // 將矩陣轉換物件切換為模型視圖轉換glMatrixMode( GL_MODELVIEW); // 重置目前指定的矩陣為單位矩陣glLoadIdentity;end;
三、繪圖
OpenGL的基本圖元為點、線、多邊形等,每次繪圖都需要使用glBegin()與glEnd()。如以下繪製函數procedure Draw;
procedure TForm1.Draw;begin // 清空緩衝區glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // 清空緩衝區glColor3ub(0, 255, 0); glBegin(Vertex_TRIANGLES); ; //傳輸三角形的三個頂點座標給OpenGL glVertex2f(400, 300); glVertex2f(300, 150); glEnd; //結束圖元的繪製。 SwapBuffers(FDC); //交換雙緩衝區內容,這將把剛繪製的圖形翻印到螢幕上。 end;
四、最後記得釋放。全部程式碼如下:
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OpenGL;type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender:); Sender: TObject); procedure FormResize(Sender: TObject); private { Private declarations } FDC: HDC; FHRC: HGLRC; procedure Draw; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Dbem; / 清空緩衝區glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // 清空緩衝區glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES);//告訴OpenGL將要繪製三角形glVertex2f(200, 300); //傳輸三角形的三個頂點座標給OpenglGL Vertex22f( , 300); glVertex2f(300, 150); glEnd; //結束圖元的繪製。 SwapBuffers(FDC); //交換雙緩衝區內容,這將把剛繪製的圖形翻印到螢幕上。 end;procedure TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;begin With pfd do begin nSize := sizeof(TPIXELFORMATDESCRIPTOR); or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // support double-buffering iPixelType := PFD_TYPE_RGBA; // color type cColorBits := 24; // preferred color depth cRedBits type cColorBits := 24; // preferred color depth cRedBits := cign); 0; cGreenShift := 0; cBlueBits := 0; cBlueShift := 0; cAlphaBits := 0; cAlphaShift := 0; // no alpha buffer cAccumBits := 0; cAccumRedBits := 0; = 0; // accum bits (ignored) cAccumBlueBits := 0; cAccumAlphaBits := 0; cDepthBits := 16; // depth buffer cStencilBits := 0; // no stencil buffer cAuxBuffers := 0; // no auxiliary buffers iLayer := 0; = 0; dwLayerMask := 0; dwVisibleMask := 0; dwDamageMask := 0; end; FDC := GetDC(Handle); pixelFormat := ChoosePixelFormat(FDC, @pfd); if pixelFormat := ChoosePixelFormat(FDC, @pfd); if pixelFormat = 0 then FormatnFormat; , @pfd) then Exit; FHRC := wglCreateContext(FDC); wglMakeCurrent(FDC, FHRC); // 設定背景色為黑色參數為RGBA glClearColor(0, 0, 0, 0); // 設定視圖投影轉換矩陣正向投影glMatrixMode(GL_PROJECTION(GL_PROJECTION ); // 重置目前指定的矩陣為單位矩陣glLoadIdentity; //指定OpenGL在此區域內繪圖glViewPort(0, 0, ClientWidth, ClientHeight); // 設定世界座標系的範圍gluOrtho2D(0, ClientWidth, ClientHeight, 0); // 將矩陣轉換物件切換為模型視圖轉換glMatrixMode( GL_MODELVIEW); // 重置目前指定的矩陣為單位矩陣glLoadIdentity;end;procedure TForm1.FormDestroy(Sender: TObject);begin wglMakeCurrent(FDC, FHRC); wglDeleteContext(FHRC); ReleaseDC(Handle, FDC);end;procedure TForm1.FormPaint(Sender: TObject);beginrawt; (Sender: TObject);begin //視窗改變大小時重新指定繪圖區域glClearColor(0, 0, 0, 0); glMatrixMode(GL_PROJECTION); glLoadIdentity; glViewPort(0, 0, ClientWidth, ClientHeight); gluOrtho2D(0, ClientWidd, ClientHeight,Ma Mode, Fight,Yat, ClientWidtrix, Height,Ma Mode, FightY, 標,Fight,Wight*, 標葉GL_MODELVIEW); glLoadIdentity;end;end.
完整程式碼點此下載