欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2014年07月14日 11:57:31   投稿:shichen2014  
這篇文章主要介紹了Delphi下OpenGL2d繪圖之初始化流程詳解,對于OpenGL的總體了解很有幫助,需要的朋友可以參考下

一、前言:

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.

完整代碼點此下載

相關(guān)文章

最新評論