时间:2021-05-20
一、前言:
Delphi默认支持OpenGl,可以使用uses OpenGL单元进行引用,之后就可以使用OpenGL的函数。OpenGl是跨平台的,而且Windows很早就支持并集成在系统中,存在于system32中的opengl32.dll,不需要再额外进行安装。虽然windows本身有d3d,但是其能力有限,相关学习资料页相对较少。
通常OpenGL仅仅支持以下几种基本几何图形:点,线和多边形。没有表面或者更高级的图形(比如球状图形)能被作为基本图形元素绘制。但是它们能够用多边形来完美的模仿出来。随意看看现代3D游戏,你会发现它们几乎完全是由三角形建立的。因此,我们不会被此限制所约束。
二、初始化
在使用OpenGL之前,需要先进行一些相关的参数设置。一般流程为:
“设置匹配的像素格式”(ChoosePixelFormat、SetPixelFormat)
“创建一个新的OpenGL渲染描述表”(wglCreateContext)
“设置OpenGL相关参数”、“绘图”(glBegin、glEnd)
“删除OpenGL渲染描述表”(wglDeleteContext)
三、绘图
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.完整代码点此下载
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、前言Delphi图形的绘制可以在glBegin()、glEnd()之间完成,绘制的框架代码可以使用Delphi下OpenGL2d绘图的初始化代码,具体内容可
Java中初始化块详解在Java中,有两种初始化块:静态初始化块和非静态初始化块.静态初始化块:使用static定义,当类装载到系统时执行一次.若在静态初始化块
1.只能在构造函数初始化列表初始化的成员变量的类型?a.const成员变量b.引用类型的成员变量c.static不能在初始化列表中进行初始化d.类成员变
C++中引用和指针的关系实例详解1.引用在定义时必须初始化,指针没有要求int&rNum;//未初始化不能通过编译int*pNum;//可以2.一旦一个引用被初
规则1(无继承情况下):对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器证明代码