Delphi下OpenGL2d繪圖之初始化流程詳解
一、前言:
Delphi默認(rèn)支持OpenGl,可以使用uses OpenGL單元進行引用,之后就可以使用OpenGL的函數(shù)。OpenGl是跨平臺的,而且Windows很早就支持并集成在系統(tǒng)中,存在于system32中的opengl32.dll,不需要再額外進行安裝。雖然windows本身有d3d,但是其能力有限,相關(guān)學(xué)習(xí)資料頁相對較少。
通常OpenGL僅僅支持以下幾種基本幾何圖形:點,線和多邊形。沒有表面或者更高級的圖形(比如球狀圖形)能被作為基本圖形元素繪制。但是它們能夠用多邊形來完美的模仿出來。隨意看看現(xiàn)代3D游戲,你會發(fā)現(xiàn)它們幾乎完全是由三角形建立的。因此,我們不會被此限制所約束。
二、初始化
在使用OpenGL之前,需要先進行一些相關(guān)的參數(shù)設(shè)置。一般流程為:
“設(shè)置匹配的像素格式”(ChoosePixelFormat、SetPixelFormat)
“創(chuàng)建一個新的OpenGL渲染描述表”(wglCreateContext)
“設(shè)置OpenGL相關(guān)參數(shù)”、“繪圖”(glBegin、glEnd)
“刪除OpenGL渲染描述表”(wglDeleteContext)
procedure TForm1.FormCreate(Sender: TObject); var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer; begin With pfd do begin nSize := sizeof(TPIXELFORMATDESCRIPTOR); // size nVersion := 1; // version dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // support double-buffering iPixelType := PFD_TYPE_RGBA; // color type cColorBits := 24; // preferred color depth cRedBits := 0; cRedShift := 0; // color bits (ignored) cGreenBits := 0; cGreenShift := 0; cBlueBits := 0; cBlueShift := 0; cAlphaBits := 0; cAlphaShift := 0; // no alpha buffer cAccumBits := 0; cAccumRedBits := 0; // no accumulation buffer, cAccumGreenBits := 0; // accum bits (ignored) cAccumBlueBits := 0; cAccumAlphaBits := 0; cDepthBits := 16; // depth buffer cStencilBits := 0; // no stencil buffer cAuxBuffers := 0; // no auxiliary buffers iLayerType := PFD_MAIN_PLANE; // main layer bReserved := 0; dwLayerMask := 0; dwVisibleMask := 0; dwDamageMask := 0; end; FDC := GetDC(Handle); pixelFormat := ChoosePixelFormat(FDC, @pfd); if pixelFormat = 0 then Exit; if not SetPixelFormat(FDC, pixelFormat, @pfd) then Exit; FHRC := wglCreateContext(FDC); wglMakeCurrent(FDC, FHRC); // 設(shè)置背景色為 黑色 參數(shù)為 RGBA glClearColor(0, 0, 0, 0); // 設(shè)置視圖投影變換矩陣 正投影 glMatrixMode(GL_PROJECTION); // 重置當(dāng)前指定的矩陣為單位矩陣 glLoadIdentity; // 指定OpenGL在此區(qū)域內(nèi)繪圖 glViewPort(0, 0, ClientWidth, ClientHeight); // 設(shè)置世界坐標(biāo)系的范圍 gluOrtho2D(0, ClientWidth, ClientHeight, 0); // 將矩陣變換對象切換為模型視圖變換 glMatrixMode(GL_MODELVIEW); // 重置當(dāng)前指定的矩陣為單位矩陣 glLoadIdentity; end;
三、繪圖
OpenGL的基本圖元為點、線、多邊形等,每次繪圖都需要使用glBegin()與glEnd()。如以下繪制函數(shù)procedure Draw;
procedure TForm1.Draw; begin // 清空緩沖區(qū) glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // 清空緩沖區(qū) glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES);//告訴OpenGL將要繪制三角形 glVertex2f(200, 300); //傳輸三角形的三個頂點坐標(biāo)給OpenGL glVertex2f(400, 300); glVertex2f(300, 150); glEnd; //結(jié)束圖元的繪制。 SwapBuffers(FDC); //交換雙緩沖區(qū)內(nèi)容,這將把剛繪制的圖形翻印到屏幕上。 end;
四、最后記得釋放。全部代碼如下:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OpenGL; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormPaint(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.Draw; begin // 清空緩沖區(qū) glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // 清空緩沖區(qū) glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES);//告訴OpenGL將要繪制三角形 glVertex2f(200, 300); //傳輸三角形的三個頂點坐標(biāo)給OpenGL glVertex2f(400, 300); glVertex2f(300, 150); glEnd; //結(jié)束圖元的繪制。 SwapBuffers(FDC); //交換雙緩沖區(qū)內(nèi)容,這將把剛繪制的圖形翻印到屏幕上。 end; procedure TForm1.FormCreate(Sender: TObject); var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer; begin With pfd do begin nSize := sizeof(TPIXELFORMATDESCRIPTOR); // size nVersion := 1; // version dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // support double-buffering iPixelType := PFD_TYPE_RGBA; // color type cColorBits := 24; // preferred color depth cRedBits := 0; cRedShift := 0; // color bits (ignored) cGreenBits := 0; cGreenShift := 0; cBlueBits := 0; cBlueShift := 0; cAlphaBits := 0; cAlphaShift := 0; // no alpha buffer cAccumBits := 0; cAccumRedBits := 0; // no accumulation buffer, cAccumGreenBits := 0; // accum bits (ignored) cAccumBlueBits := 0; cAccumAlphaBits := 0; cDepthBits := 16; // depth buffer cStencilBits := 0; // no stencil buffer cAuxBuffers := 0; // no auxiliary buffers iLayerType := PFD_MAIN_PLANE; // main layer bReserved := 0; dwLayerMask := 0; dwVisibleMask := 0; dwDamageMask := 0; end; FDC := GetDC(Handle); pixelFormat := ChoosePixelFormat(FDC, @pfd); if pixelFormat = 0 then Exit; if not SetPixelFormat(FDC, pixelFormat, @pfd) then Exit; FHRC := wglCreateContext(FDC); wglMakeCurrent(FDC, FHRC); // 設(shè)置背景色為 黑色 參數(shù)為 RGBA glClearColor(0, 0, 0, 0); // 設(shè)置視圖投影變換矩陣 正投影 glMatrixMode(GL_PROJECTION); // 重置當(dāng)前指定的矩陣為單位矩陣 glLoadIdentity; // 指定OpenGL在此區(qū)域內(nèi)繪圖 glViewPort(0, 0, ClientWidth, ClientHeight); // 設(shè)置世界坐標(biāo)系的范圍 gluOrtho2D(0, ClientWidth, ClientHeight, 0); // 將矩陣變換對象切換為模型視圖變換 glMatrixMode(GL_MODELVIEW); // 重置當(dāng)前指定的矩陣為單位矩陣 glLoadIdentity; end; procedure TForm1.FormDestroy(Sender: TObject); begin wglMakeCurrent(FDC, FHRC); wglDeleteContext(FHRC); ReleaseDC(Handle, FDC); end; procedure TForm1.FormPaint(Sender: TObject); begin Draw; end; procedure TForm1.FormResize(Sender: TObject); begin // 窗口改變大小時重新指定繪圖區(qū)域 glClearColor(0, 0, 0, 0); glMatrixMode(GL_PROJECTION); glLoadIdentity; glViewPort(0, 0, ClientWidth, ClientHeight); gluOrtho2D(0, ClientWidth, ClientHeight, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity; end; end.
完整代碼點此下載
上一篇:Delphi編程常用快捷鍵大全
欄 目:Delphi
下一篇:Delphi實現(xiàn)讀取系統(tǒng)時間與日期完整實例
本文標(biāo)題:Delphi下OpenGL2d繪圖之初始化流程詳解
本文地址:http://mengdiqiu.com.cn/a1/Delphi/8634.html
您可能感興趣的文章
- 01-10在Delphi實現(xiàn)在數(shù)據(jù)庫中存取圖像的圖文演示無錯
- 01-10delphi建立、讀取、存貯INI文件的方法《三》
- 01-10Delphi Command模式
- 01-10delphi 正弦曲線圖
- 01-10delphi建立、讀取、存貯INI文件的方法《二》
- 01-10插件管理框架 for Delphi(二)
- 01-10插件管理框架 for Delphi(一)
- 01-10Delphi中判斷文件是否為文本文件的函數(shù)
- 01-10delphi中一個值得大家來考慮的DLL問題
- 01-10初探Delphi中的插件編程


閱讀排行
本欄相關(guān)
- 01-10在Delphi實現(xiàn)在數(shù)據(jù)庫中存取圖像的圖
- 01-10delphi建立、讀取、存貯INI文件的方法
- 01-10delphi 正弦曲線圖
- 01-10Delphi Command模式
- 01-10delphi建立、讀取、存貯INI文件的方法
- 01-10插件管理框架 for Delphi(二)
- 01-10插件管理框架 for Delphi(一)
- 01-10Delphi中判斷文件是否為文本文件的函
- 01-10delphi中一個值得大家來考慮的DLL問題
- 01-10初探Delphi中的插件編程
隨機閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢data目錄下的sessions文件夾有什