一、前言:

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 := ; // version
dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // support double-buffering
iPixelType := PFD_TYPE_RGBA; // color type
cColorBits := ; // preferred color depth
cRedBits := ;
cRedShift := ; // color bits (ignored)
cGreenBits := ;
cGreenShift := ;
cBlueBits := ;
cBlueShift := ;
cAlphaBits := ;
cAlphaShift := ; // no alpha buffer
cAccumBits := ;
cAccumRedBits := ; // no accumulation buffer,
cAccumGreenBits := ; // accum bits (ignored)
cAccumBlueBits := ;
cAccumAlphaBits := ;
cDepthBits := ; // depth buffer
cStencilBits := ; // no stencil buffer
cAuxBuffers := ; // no auxiliary buffers
iLayerType := PFD_MAIN_PLANE; // main layer
bReserved := ;
dwLayerMask := ;
dwVisibleMask := ;
dwDamageMask := ;
end;
FDC := GetDC(Handle);
pixelFormat := ChoosePixelFormat(FDC, @pfd);
if pixelFormat = then
Exit;
if not SetPixelFormat(FDC, pixelFormat, @pfd) then
Exit;
FHRC := wglCreateContext(FDC);
wglMakeCurrent(FDC, FHRC); // 设置背景色为 黑色 参数为 RGBA
glClearColor(, , , );
// 设置视图投影变换矩阵 正投影
glMatrixMode(GL_PROJECTION);
// 重置当前指定的矩阵为单位矩阵
glLoadIdentity;
// 指定OpenGL在此区域内绘图
glViewPort(, , ClientWidth, ClientHeight);
// 设置世界坐标系的范围
gluOrtho2D(, ClientWidth, ClientHeight, );
// 将矩阵变换对象切换为模型视图变换
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(, , );
glBegin(GL_TRIANGLES);//告诉OpenGL将要绘制三角形
glVertex2f(, ); //传输三角形的三个顶点坐标给OpenGL
glVertex2f(, );
glVertex2f(, );
glEnd; //结束图元的绘制。
SwapBuffers(FDC); //交换双缓冲区内容,这将把刚绘制的图形翻印到屏幕上。
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
// 清空缓冲区
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
// 清空缓冲区
glColor3ub(, , );
glBegin(GL_TRIANGLES);//告诉OpenGL将要绘制三角形
glVertex2f(, ); //传输三角形的三个顶点坐标给OpenGL
glVertex2f(, );
glVertex2f(, );
glEnd; //结束图元的绘制。
SwapBuffers(FDC); //交换双缓冲区内容,这将把刚绘制的图形翻印到屏幕上。
end; procedure TForm1.FormCreate(Sender: TObject);
var
 pfd:TPIXELFORMATDESCRIPTOR;
pixelFormat: Integer;
begin
With pfd do
begin
nSize := sizeof(TPIXELFORMATDESCRIPTOR); // size
nVersion := ; // version
dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // support double-buffering
iPixelType := PFD_TYPE_RGBA; // color type
cColorBits := ; // preferred color depth
cRedBits := ;
cRedShift := ; // color bits (ignored)
cGreenBits := ;
cGreenShift := ;
cBlueBits := ;
cBlueShift := ;
cAlphaBits := ;
cAlphaShift := ; // no alpha buffer
cAccumBits := ;
cAccumRedBits := ; // no accumulation buffer,
cAccumGreenBits := ; // accum bits (ignored)
cAccumBlueBits := ;
cAccumAlphaBits := ;
cDepthBits := ; // depth buffer
cStencilBits := ; // no stencil buffer
cAuxBuffers := ; // no auxiliary buffers
iLayerType := PFD_MAIN_PLANE; // main layer
bReserved := ;
dwLayerMask := ;
dwVisibleMask := ;
dwDamageMask := ;
end;
FDC := GetDC(Handle);
pixelFormat := ChoosePixelFormat(FDC, @pfd);
if pixelFormat = then
Exit;
if not SetPixelFormat(FDC, pixelFormat, @pfd) then
Exit;
FHRC := wglCreateContext(FDC);
wglMakeCurrent(FDC, FHRC); // 设置背景色为 黑色 参数为 RGBA
glClearColor(, , , );
// 设置视图投影变换矩阵 正投影
glMatrixMode(GL_PROJECTION);
// 重置当前指定的矩阵为单位矩阵
glLoadIdentity;
// 指定OpenGL在此区域内绘图
glViewPort(, , ClientWidth, ClientHeight);
// 设置世界坐标系的范围
gluOrtho2D(, ClientWidth, ClientHeight, );
// 将矩阵变换对象切换为模型视图变换
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(, , , );
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glViewPort(, , ClientWidth, ClientHeight);
gluOrtho2D(, ClientWidth, ClientHeight, );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end; end.

五、运行效果图如下:

源码下载:http://files.cnblogs.com/lin557/OpenGL_01.zip

2014-06-26 by lin

Delphi下OpenGL2d绘图(01)-初始化的更多相关文章

  1. Delphi下OpenGL2d绘图(04)-画四边形

    一.前言 画四边形基本上与前几遍文字代码是相同.区别在于glBegin()的参数“GL_QUADS”.绘制的框架代码可以使用 Delphi下OpenGL2d绘图(01)-初始化 中的代码.修改的部份为 ...

  2. Delphi下OpenGL2d绘图(03)-画线

    一.前言 画线与画点基本上代码是相同.区别在于glBegin()的参数.绘制的框架代码可以使用 Delphi下OpenGL2d绘图(01)-初始化 中的代码.修改的部份为 Draw 函数的内容. 二. ...

  3. Delphi下OpenGL2d绘图(02)-画点

    一.前言 图形的绘制可以使用glBegin().glEnd()之间完成,绘制的框架代码可以使用 Delphi下OpenGL2d绘图(01)-初始化 中的代码.修改的部份为 Draw 函数的内容. 二. ...

  4. Delphi下OpenGL2d绘图(06)-画图(多窗口、多视图、多个DC)

    一.前言 在学习OpenGL的过程中,发现很多函数都是全局的.前面几章中都是在一个窗口DC中画图,那么要在多个窗口画图,需要怎么处理呢?网上方法有多种,这里采用其中一种,利用wglMakeCurren ...

  5. Delphi下OpenGL2d绘图(05)-画图片Bmp

    一.前言 找了不少资料,要画图片要先处理一下,需要引用别的单元,Delphi中没带,需要另外下载Gl.pas.看网上说是自带的OpenGl单元封装的是1.0版的,有此函数未声明.网上可以找到Gl.pa ...

  6. DELPHI下API简述(1800个API)

    DELPHI下API简述 http://zero.cnbct.org/show.asp?id=144 auxGetDevCaps API 获取附属设备容量 auxGetNumDevs API 返回附属 ...

  7. 深入Delphi下的DLL编程

    深入Delphi下的DLL编程 作者:岑心 引 言 相信有些计算机知识的朋友都应该听说过“DLL”.尤其是那些使用过windows操作系统的人,都应该有过多次重装系统的“悲惨”经历——无论再怎样小心, ...

  8. DELPHI下的SOCK编程(转)

    DELPHI下的SOCK编程      本文是写给公司新来的程序员的,算是一点培训的教材.本文不会涉及太多的编程细节,只是简单讲解在DELPHI下进行Winsock编程最好了解的知识. 题外话:我认为 ...

  9. DELPHI下的SOCK编程

     DELPHI下的SOCK编程(转自http://www.cnblogs.com/devcjq/articles/2325600.html) 本文是写给公司新来的程序员的,算是一点培训的教材.本文不会 ...

随机推荐

  1. Centos iptables防火墙设置

    iptables的基本语法格式 iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]说明:表名.链名用于指定iptables命令所操作的表和链,命令选项用于指定 ...

  2. WPF Viewport3D 解决透视模式时窗体模糊

    最近折腾Viewport3D玩,遇到了一些诡异的问题,研究一下略有心得,特此和大家分享~ 三维图形概述: https://msdn.microsoft.com/zh-cn/library/ms7474 ...

  3. .net core 高性能对象映射

    关于对象转换已经有不少轮子(AutoMapper,TinyMapper) .出于项目需要,手动造一个简单轮子.先贴代码 1.采用静态泛型类缓存,避免了拆箱装箱操作. 2.对于转换对象中有,字段名一样但 ...

  4. Template 动画

    如果设置Template的动画,也就意味着对每一个具有此Template的对象进行动画处理. 比如对ListBoxI的ItemTemplate进行设置,添加动画,触发器等,每一个ListBoxItem ...

  5. windows测试登陆

    测试工具我使用2种(Medusa和hydra): 第一种:Medusa支持端口登录但是不支持rdp协议,意思就是可以验证密码是否正确,新用户不会创建家目录: 使用方法: medusa -M smbnt ...

  6. winform datagridview记录的颜色设定

    DataGridViewCellStyle属性进行如下图的设置,预览可直接看到效果

  7. linux命令提示符[root@localhost ~]#详解

    [root@localhost ~]#   1. @之前代表当前登录用户 在Linux中管理员用户是root,还有一些普通用户: 在此例中,root代表当前登录用户   2. @之后代表当前计算机主机 ...

  8. php数据库编程---mysqli扩展库

    1,mysqli扩展库允许我们访问MySQL数据库,并对MySql数据库进行curd操作.Mysqli扩展库比mysql扩展库加强了. 2,mysqli扩展库和mysql扩展库的比较 (1) mysq ...

  9. php 中将完整的年月日时分秒的时间转换成 年月日的形式

    strtotime() 函数将任何英文文本的日期或时间描述解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数), 将完整的时间格式转换成时间撮的形式,再去进 ...

  10. debian下安装 locale 并设置 zh_CN.UTF-8 [转]

    root@Linkstation :~# apt-get install locales root@Linkstation:~# dpkg-reconfigure locales root@Links ...