Delphi下OpenGL2d畫圖之初始化流程詳解。本站提示廣大學習愛好者:(Delphi下OpenGL2d畫圖之初始化流程詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Delphi下OpenGL2d畫圖之初始化流程詳解正文
1、媒介:
Delphi默許支撐OpenGl,可使用uses OpenGL單位停止援用,以後便可以應用OpenGL的函數。OpenGl是跨平台的,並且Windows很早就支撐並集成在體系中,存在於system32中的opengl32.dll,不須要再額定停止裝置。固然windows自己有d3d,然則其才能無限,相干進修材料頁絕對較少。
平日OpenGL僅僅支撐以下幾種根本幾何圖形:點,線和多邊形。沒有外面或許更高等的圖形(好比球狀圖形)能被作為根本圖形元素繪制。然則它們可以或許用多邊形來完善的模擬出來。隨便看看古代3D游戲,你會發明它們簡直完整是由三角形樹立的。是以,我們不會被此限制所束縛。
2、初始化
在應用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 := 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); // 設置配景色為 黑色 參數為 RGBA glClearColor(0, 0, 0, 0); // 設置視圖投影變換矩陣 正投影 glMatrixMode(GL_PROJECTION); // 重置以後指定的矩陣為單元矩陣 glLoadIdentity; // 指定OpenGL在此區域內畫圖 glViewPort(0, 0, ClientWidth, ClientHeight); // 設置世界坐標系的規模 gluOrtho2D(0, ClientWidth, ClientHeight, 0); // 將矩陣變換對象切換為模子視圖變換 glMatrixMode(GL_MODELVIEW); // 重置以後指定的矩陣為單元矩陣 glLoadIdentity; end;
3、畫圖
OpenGL的根本圖元為點、線、多邊形等,每次畫圖都須要應用glBegin()與glEnd()。如以下繪制函數procedure Draw;
procedure TForm1.Draw; begin // 清空緩沖區 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // 清空緩沖區 glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES);//告知OpenGL將要繪制三角形 glVertex2f(200, 300); //傳輸三角形的三個極點坐標給OpenGL glVertex2f(400, 300); glVertex2f(300, 150); glEnd; //停止圖元的繪制。 SwapBuffers(FDC); //交流雙緩沖區內容,這將把剛繪制的圖形翻印到屏幕上。 end;
4、最初記得釋放。全體代碼以下:
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 // 清空緩沖區 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // 清空緩沖區 glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES);//告知OpenGL將要繪制三角形 glVertex2f(200, 300); //傳輸三角形的三個極點坐標給OpenGL glVertex2f(400, 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); // 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); // 設置配景色為 黑色 參數為 RGBA glClearColor(0, 0, 0, 0); // 設置視圖投影變換矩陣 正投影 glMatrixMode(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); begin Draw; end; procedure TForm1.FormResize(Sender: TObject); begin // 窗口轉變年夜小時從新指定畫圖區域 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.
完全代碼點此下載