麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Delphi > 正文

Delphi下OpenGL2d繪圖之初始化流程詳解

2020-01-31 20:51:42
字體:
來源:轉載
供稿:網友

一、前言:

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 := 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;

三、繪圖

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;

四、最后記得釋放。全部代碼如下:

unit Unit1;interfaceuses 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.

完整代碼點此下載

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 77成人影院 | 99热高清| 一本一道久久久a久久久精品91 | 久久精品一区二区三区不卡牛牛 | 爱性久久久久久久 | 人人舔人人舔 | 久久无毛 | 成人性生活视频在线播放 | 美国人成人在线视频 | 成人三级黄色片 | 黄色一级片在线观看 | 国产精品美女久久久久久网站 | 911精品影院在线观看 | 亚洲5区| 国产美女视频免费 | 国产乱淫av | 国产精品一区二区三区在线看 | 鸳鸯谱在线观看高清 | chinese乱子伦xxxx国语对白 | 欧美巨根 | 黄色片视频观看 | 欧美a视频 | 日本一级黄色毛片 | 国产精品久久国产精品 | 久久嗨 | 久久99精品久久久久久236 | 久久久一区二区三区四区 | 91福利影视 | 日韩欧美中文字幕视频 | 国产一级淫片在线观看 | 成人午夜在线免费观看 | 免费毛片小视频 | 黄色大片在线免费看 | 91一级毛片 | 中文在线观看视频 | 91短视频在线观看视频 | av在线免费网 | 久久久久久久久久亚洲 | 九色中文 | 色女人在线 | 西川av在线一区二区三区 |