OpenGL完全教程 第一章 初始化OpenGL_第1頁
OpenGL完全教程 第一章 初始化OpenGL_第2頁
OpenGL完全教程 第一章 初始化OpenGL_第3頁
OpenGL完全教程 第一章 初始化OpenGL_第4頁
OpenGL完全教程 第一章 初始化OpenGL_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、OpenGL 完全教程 第一章 初始化OpenGL作者:何詠 日期:2006-2-3 20:47:09 點擊:3373如需轉(zhuǎn)載本文,請聲明作者及出處。第一章初始化OpenGL無論是什么東西,要使用它,就必須對它進(jìn)行初始化。如果你之前使用過GDI ,你應(yīng)該也多多少少了解到GDI 在繪制圖形之前要為之創(chuàng)建渲染環(huán)境。OpenGL 也一樣。本章給出的代碼,大家可以不必理解其中的具體意義,反正以后每次初始化是使用這個代碼即可。首先,在一個新的應(yīng)用程序中,我們需要添加對OpenGL 庫的引用。Delphi 已經(jīng)為我們寫好了OpenGL 的頭文件,因此我們只須直接在單元的uses 中添加OpenGL 即可:

2、.uses Windows, Graphics, OpenGL, .在創(chuàng)建窗口時,應(yīng)添加如下代碼:procedure Form1.Create(Sender:TObject;var DC: HDC;HRC :HGLRC ;pfd:TPIXELFORMATDESCRIPTOR; pixelFormat:integer;beginDC := GetDC(Handle;With pfd dobeginnSize:=sizeof(TPIXELFORMATDESCRIPTOR; / sizenVersion:=1; / versiondwFlags:=PFD_SUPPORT_OPENGL or PFD_

3、DRAW_to _WINDOW orPFD_DOUBLEBUFFER; / support double-bufferingiPixelType:=PFD_TYPE_RGBA; / color typecColorBits:=24; / preferred color depthcRedBits:=0;cRedShift:=0; / color bits (ignoredcGreenBits:=0;cGreenShift:=0;cBlueBits:=0;cBlueShift:=0;cAlphaBits:=0;cAlphaShift:=0; / no alpha buffercAccumBits

4、:=0;cAccumRedBits:=0; / no accumulation buffer,cAccumGreenBits:=0; / accum bits (ignoredcAccumBlueBits:=0;cAccumAlphaBits:=0;cDepthBits:=16; / depth buffercStencilBits:=0; / no stencil buffercAuxBuffers:=0; / no auxiliary buffersiLayerType:=PFD_MAIN_PLANE; / main layerbReserved:=0;dwLayerMask:=0;dwV

5、isibleMask:=0;dwDamageMask:=0;end ;pixelFormat := ChoosePixelFormat(DC, pfd;if (pixelFormat = 0 thenexit;if (SetPixelFormat(DC, pixelFormat, pfd TRUE thenexit;hRc := wglCreateContext(DC;wglMakeCurrent(DC,HRC;end ;上面的代碼是Windows 下初始化OpenGL 的固定代碼。因為本教程不使用任何第三方庫,所以在初始化上顯得麻煩些。但這些代碼是固定的,每次初始化OpenGL 時,照抄代碼

6、即可。下面對上述代碼作簡單的說明。 首先,我們用GetDC(Handle獲取當(dāng)前窗口的設(shè)備目錄。然后初始化一個TPIXELFORMATDESCRIPTOR 類型的字段,用于描述將要使用的像素格式。在此字段中,dwFlags 表示渲染方式,一般情況下使用PFD_SUPPORT_OPENGL or PFD_DRAW_to _WINDOW or PFD_DOUBLEBUFFER。其中,PFD_DOUBLEBUFFER表示支持雙緩沖。這將會在今后的章節(jié)中講到。cColorBits 表示使用的色深,一般情況下使用24位色深。在今后的教程中,會根據(jù)不同的需求而改變TPIXELFORMATDESCRIPTO

7、R 字段中的值,而其他代碼一般都是不變的。初始化完OpenGL 之后,就可以調(diào)用OpenGL 的繪制函數(shù)來繪制圖形了。一般情況下,我們把所有繪制圖形的函數(shù)調(diào)用寫在一個名為RenderScene 的過程中:procedure TForm1.RenderScene;begin.end ;然后,我們使用一個Timer, 其Interval 屬性設(shè)為1,然后在OnTimer 事件中調(diào)用RenderScene 即可。在窗體關(guān)閉時,我們還必須關(guān)閉渲染環(huán)境以釋放內(nèi)存。方法如下:procedure TForm1.Form1Close(Sender:TObject;.;beginwglMakeCurrent(D

8、C,HRC;wglDeleteContext(hRc;ReleaseDC(Handle,DC;end ;其實,關(guān)于OpenGL 初始化,我已經(jīng)寫好了一個類。用這個類初始化,可以讓窗體的代碼簡潔一些。首先,下載glInit.pas, 并引用它。然后向單元中加入如下代碼初始化OpenGL 。.uses .,GLInit;varglInitor:TOpenGLInit;implementationprocedure TForm1.Create(.;beginglInitor:=TOpenGLInit.Create(Handle,24,stdDoubleBuffer;end ;procedure TF

9、orm1.Close(.;beginglInitor.Free;end ;在本章的示例程序中,我們將初始化OpenGL, 并用OpenGL 繪制一個三角形。在此程序中,我們還對OpenGL 作了其他一些設(shè)置,現(xiàn)在你無須理解其中的意義。此程序中,InitOpenGL 過程用于初始化OpenGL,FreeOpenGL 過程用于銷毀OpenGL,SetView 過程用于設(shè)置視圖投影(將在今后的章節(jié)中講到, 在RenderScene 過程中,我們使用了一個OpenGL 的函數(shù)繪制了一個三角形。以下就是本章示例程序的代碼。unit untMainForm;interfaceusesWindows, Me

10、ssages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, OpenGL;typeTfrmMain = class(TFormtmrRender: TTimer;procedure FormCreate(Sender: TObject;procedure FormClose(Sender: TObject; var Action: TCloseAction; procedure tmrRenderTimer(Sender: TObject;privateprocedure InitOpen

11、GL;procedure FreeOpenGL;procedure SetView;procedure RenderScene;publicend ;varfrmMain: TfrmMain;DC: HDC;HRC :HGLRC ;implementation$R *.dfmprocedure TfrmMain.FreeOpenGL;beginwglMakeCurrent(DC,HRC;wglDeleteContext(hRc;ReleaseDC(Handle,DC;end ;procedure TfrmMain.InitOpenGL;var pfd:TPIXELFORMATDESCRIPTO

12、R; pixelFormat:integer;beginDC := GetDC(Handle;with pfd dobeginnSize:=sizeof(TPIXELFORMATDESCRIPTOR; / 此結(jié)構(gòu)尺寸 nVersion:=1;dwFlags:=PFD_SUPPORT_OPENGL or PFD_DRAW_to _WINDOW or PFD_DOUBLEBUFFER; / 使用雙緩沖區(qū)iPixelType:=PFD_TYPE_RGBA; /使用RGBA 顏色空間cColorBits:=24; cRedBits:=0; cRedShift:=0; cGreenBits:=0; cG

13、reenShift:=0; cBlueBits:=0; cBlueShift:=0; cAlphaBits:=0; cAlphaShift:=0; cAccumBits:=0; cAccumRedBits:=0; cAccumGreenBits:=0; cAccumBlueBits:=0; cAccumAlphaBits:=0; cDepthBits:=16; cStencilBits:=0; cAuxBuffers:=0; /24 位真彩色 iLayerType:=PFD_MAIN_PLANE; bReserved:=0; dwLayerMask:=0; dwVisibleMask:=0;

14、dwDamageMask:=0; end; pixelFormat := ChoosePixelFormat(DC, pfd; if (pixelFormat = 0 then exit; if (SetPixelFormat(DC, pixelFormat, pfd TRUE then exit; hRc := wglCreateContext(DC; wglMakeCurrent(DC,HRC; end; procedure TfrmMain.FormCreate(Sender: TObject; begin InitOpenGL; SetView; end; procedure Tfrm

15、Main.FormClose(Sender: TObject; var Action: TCloseAction; begin FreeOpenGL; end; procedure TfrmMain.tmrRenderTimer(Sender: TObject; begin RenderScene; end; procedure TfrmMain.RenderScene; begin glLoadIdentity; glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT;/清空緩沖區(qū) glColor3ub(0,255,0; /將顏色設(shè)置為綠色。 glBegin(GL_TRIANGLES;/告訴 OpenGL 將要繪制三角形 glVertex2f(200,300; glVertex2f(400,300; glVertex2f(300,150; /傳輸三角形的三個頂點坐標(biāo)給 OpenGL glEnd; /結(jié)束圖元的繪制。 SwapBuffers(DC;/交換雙緩沖區(qū)內(nèi)容,這將把剛繪制的圖形翻印到屏幕上。 end; procedure TfrmMain.SetView; begin glClearColor(0,0,0,0;/設(shè)置背景顏色為黑色 glViewPort(0,0,Cli

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論