Delphi下OpenGL2d繪圖之初始化流程詳解
一、前言:
Delphi默認(rèn)支持OpenGl,可以使用uses OpenGL單元進(jìn)行引用,之后就可以使用OpenGL的函數(shù)。OpenGl是跨平臺(tái)的,而且Windows很早就支持并集成在系統(tǒng)中,存在于system32中的opengl32.dll,不需要再額外進(jìn)行安裝。雖然windows本身有d3d,但是其能力有限,相關(guān)學(xué)習(xí)資料頁(yè)相對(duì)較少。
通常OpenGL僅僅支持以下幾種基本幾何圖形:點(diǎn),線和多邊形。沒(méi)有表面或者更高級(jí)的圖形(比如球狀圖形)能被作為基本圖形元素繪制。但是它們能夠用多邊形來(lái)完美的模仿出來(lái)。隨意看看現(xiàn)代3D游戲,你會(huì)發(fā)現(xiàn)它們幾乎完全是由三角形建立的。因此,我們不會(huì)被此限制所約束。
二、初始化
在使用OpenGL之前,需要先進(jìn)行一些相關(guān)的參數(shù)設(shè)置。一般流程為:
“設(shè)置匹配的像素格式”(ChoosePixelFormat、SetPixelFormat)
“創(chuàng)建一個(gè)新的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); // 將矩陣變換對(duì)象切換為模型視圖變換 glMatrixMode(GL_MODELVIEW); // 重置當(dāng)前指定的矩陣為單位矩陣 glLoadIdentity; end;
三、繪圖
OpenGL的基本圖元為點(diǎn)、線、多邊形等,每次繪圖都需要使用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); //傳輸三角形的三個(gè)頂點(diǎn)坐標(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); //傳輸三角形的三個(gè)頂點(diǎn)坐標(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);
// 將矩陣變換對(duì)象切換為模型視圖變換
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
// 窗口改變大小時(shí)重新指定繪圖區(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.
完整代碼點(diǎn)此下載
相關(guān)文章
mybatis in foreach雙層嵌套的問(wèn)題解決
在使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),有時(shí)候需要處理雙層嵌套的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了mybatis in foreach雙層嵌套的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Delphi2007編譯的程序在Win7下圖標(biāo)模糊的解決辦法
這篇文章主要介紹了Delphi2007編譯的程序在Win7下圖標(biāo)模糊的解決辦法,需要的朋友可以參考下2014-08-08
delphi簡(jiǎn)單判斷程序30秒沒(méi)有鍵盤和鼠標(biāo)動(dòng)作示例
本文為大家詳細(xì)介紹下delphi判斷程序30秒沒(méi)有鍵盤和鼠標(biāo)動(dòng)作,這里給timer設(shè)置了1000ms)的參數(shù),表示30秒的間隔,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06
Delphi實(shí)現(xiàn)木馬文件傳輸代碼實(shí)例
這篇文章主要介紹了Delphi實(shí)現(xiàn)木馬文件傳輸?shù)姆椒?對(duì)于了解木馬的運(yùn)行原理有一定的幫助,需要的朋友可以參考下2014-07-07
Delphi實(shí)現(xiàn)Listbox中的item根據(jù)內(nèi)容顯示不同顏色的方法
這篇文章主要介紹了Delphi實(shí)現(xiàn)Listbox中的item根據(jù)內(nèi)容顯示不同顏色的方法,需要的朋友可以參考下2014-07-07
delphi7連接mysql5的實(shí)現(xiàn)方法
這篇文章主要介紹了delphi7連接mysql5的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-07-07

