当前位置:文档之家› OpenGL完全教程 第一章 初始化OpenGL

OpenGL完全教程 第一章 初始化OpenGL

OpenGL完全教程 第一章 初始化OpenGL作者:何咏 日期:2006-2-3 20:47:09 点击:3373如需转载本文,请声明作者及出处。

第一章初始化OpenGL无论是什么东西,要使用它,就必须对它进行初始化。

如果你之前使用过GDI,你应该也多多少少了解到GDI 在绘制图形之前要为之创建渲染环境。

OpenGL也一样。

本章给出的代码,大家可以不必理解其中的具体意义,反正以后每次初始化是使用这个代码即可。

首先,在一个新的应用程序中,我们需要添加对OpenGL库的引用。

Delphi已经为我们写好了OpenGL的头文件,因此我们只须直接在单元的uses中添加OpenGL即可:...uses Windows, Graphics, OpenGL, ......在创建窗口时,应添加如下代码: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_DRAW_to_WINDOW orPFD_DOUBLEBUFFER; // support double-bufferingiPixelType:=PFD_TYPE_RGBA; // color typecColorBits:=24; // preferred color depthcRedBits:=0;cRedShift:=0; // color bits (ignored)cGreenBits:=0;cGreenShift:=0;cBlueBits:=0;cBlueShift:=0;cAlphaBits:=0;cAlphaShift:=0; // no alpha buffercAccumBits:=0;cAccumRedBits:=0; // no accumulation buffer,cAccumGreenBits:=0; // accum bits (ignored)cAccumBlueBits:=0;cAccumAlphaBits:=0;cDepthBits:=16; // depth buffercStencilBits:=0; // no stencil buffercAuxBuffers:=0; // no auxiliary buffersiLayerType:=PFD_MAIN_PLANE; // main layerbReserved:=0;dwLayerMask:=0;dwVisibleMask:=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时,照抄代码即可。

下面对上述代码作简单的说明。

首先,我们用GetDC(Handle)获取当前窗口的设备目录。

然后初始化一个TPIXELFORMATDESCRIPTOR类型的字段,用于描述将要使用的像素格式。

在此字段中,dwFlags表示渲染方式,一般情况下使用PFD_SUPPORT_OPENGL or PFD_DRAW_to_WINDOW or PFD_DOUBLEBUFFER。

其中,PFD_DOUBLEBUFFER表示支持双缓冲。

这将会在今后的章节中讲到。

cColorBits表示使用的色深,一般情况下使用24位色深。

在今后的教程中,会根据不同的需求而改变TPIXELFORMATDESCRIPTOR字段中的值,而其他代码一般都是不变的。

初始化完OpenGL之后,就可以调用OpenGL的绘制函数来绘制图形了。

一般情况下,我们把所有绘制图形的函数调用写在一个名为RenderScene的过程中:procedure TForm1.RenderScene;begin...end;然后,我们使用一个Timer,其Interval属性设为1,然后在OnTimer事件中调用RenderScene即可。

在窗体关闭时,我们还必须关闭渲染环境以释放内存。

方法如下:procedure TForm1.Form1Close(Sender:TObject;....);beginwglMakeCurrent(DC,HRC);wglDeleteContext(hRc);ReleaseDC(Handle,DC);end;其实,关于OpenGL初始化,我已经写好了一个类。

用这个类初始化,可以让窗体的代码简洁一些。

首先,下载glInit.pas,并引用它。

然后向单元中加入如下代码初始化OpenGL。

...uses ...,GLInit;varglInitor:TOpenGLInit;implementationprocedure TForm1.Create(....);beginglInitor:=TOpenGLInit.Create(Handle,24,stdDoubleBuffer);end;procedure TForm1.Close(...);beginglInitor.Free;end;在本章的示例程序中,我们将初始化OpenGL,并用OpenGL绘制一个三角形。

在此程序中,我们还对OpenGL作了其他一些设置,现在你无须理解其中的意义。

此程序中,InitOpenGL过程用于初始化OpenGL,FreeOpenGL过程用于销毁OpenGL,SetView过程用于设置视图投影(将在今后的章节中讲到),在RenderScene过程中,我们使用了一个OpenGL的函数绘制了一个三角形。

以下就是本章示例程序的代码。

unit untMainForm;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, OpenGL;typeTfrmMain = class(TForm)tmrRender: TTimer;procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);procedure tmrRenderTimer(Sender: TObject);privateprocedure InitOpenGL;procedure FreeOpenGL;procedure SetView;procedure RenderScene;publicend;varfrmMain: TfrmMain;DC: HDC;HRC :HGLRC ;implementation{$R *.dfm}procedure TfrmMain.FreeOpenGL;beginwglMakeCurrent(DC,HRC);wglDeleteContext(hRc);ReleaseDC(Handle,DC);end;procedure TfrmMain.InitOpenGL;var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat:integer;beginDC := GetDC(Handle);with pfd dobeginnSize:=sizeof(TPIXELFORMATDESCRIPTOR); // 此结构尺寸nVersion:=1;dwFlags:=PFD_SUPPORT_OPENGL or PFD_DRAW_to_WINDOW orPFD_DOUBLEBUFFER; // 使用双缓冲区iPixelType:=PFD_TYPE_RGBA; //使用RGBA颜色空间cColorBits:=24; //24位真彩色cRedBits:=0;cRedShift:=0;cGreenBits:=0;cGreenShift:=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;iLayerType:=PFD_MAIN_PLANE;bReserved:=0;dwLayerMask:=0;dwVisibleMask:=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;procedure TfrmMain.FormCreate(Sender: TObject);beginInitOpenGL;SetView;end;procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction); beginFreeOpenGL;end;procedure TfrmMain.tmrRenderTimer(Sender: TObject);beginRenderScene;end;procedure TfrmMain.RenderScene;beginglLoadIdentity;glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);//清空缓冲区glColor3ub(0,255,0); //将颜色设置为绿色。

相关主题