Delphi下OpenGL2d绘图之初始化流程详解_Delphi

一、前言:

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 := 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;

三、绘图

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;
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(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.

完整代码点此下载

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索delphi
, 初始化
, 绘图
OpenGL2d
opengl绘图、c opengl 绘图、基于mfc的opengl绘图、opengl绘图原理、启用opengl绘图,以便于您获取更多的相关知识。

时间: 2024-08-02 05:15:49

Delphi下OpenGL2d绘图之初始化流程详解_Delphi的相关文章

Delphi下OpenGL2d绘图之画线的方法_Delphi

一.前言: Delphi画线方法与画点基本上是相同的.区别在于glBegin()的参数.绘制的框架代码可以参考Delphi下OpenGL2d绘图初始化中的代码,地址为http://www.jb51.net/article/52141.htm.修改的部份为 Draw 函数的内容. 二.画线步骤: GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段 GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个

Delphi下OpenGL2d绘图之画四边形的方法_Delphi

一.前言: Delphi实现画四边形的方法基本上与前几遍文字代码是相同的.其区别知识在于glBegin()的参数"GL_QUADS".绘制的框架代码可以使用Delphi下OpenGL2d绘图初始化中的代码,地址为http://www.jb51.net/article/52141.htm.修改的部份为 Draw 函数的内容. 二.画四边形方法: 使用GL_QUADS:绘制由四个顶点组成的一组单独的四边形.顶点4n-3.4n-2.4n-1和4n定义了第n个四边形.总共绘制N/4个四边形.这

Android Bluetooth蓝牙技术使用流程详解_Android

在上篇文章给大家介绍了Android Bluetooth蓝牙技术初体验相关内容,感兴趣的朋友可以点击了解详情. 一:蓝牙设备之间的通信主要包括了四个步骤 设置蓝牙设备 寻找局域网内可能或者匹配的设备 连接设备 设备之间的数据传输 二:具体编程实现 1. 启动蓝牙功能 首先通过调用静态方法getDefaultAdapter()获取蓝牙适配器BluetoothAdapter,如果返回为空,则无法继续执行了.例如: BluetoothAdapter mBluetoothAdapter = Blueto

Linux系统启动流程详解

那篇文章不涉及操作系统,只与主板的板载程序有关.今天,我想接着往下写,探讨操作系统接管硬件以后发生的事情,也就是操作系统的启动流程. 这个部分比较有意思.因为在BIOS阶段,计算机的行为基本上被写死了,程序员可以做的事情并不多:但是,一旦进入操作系统,程序员几乎可以定制所有方面.所以,这个部分与程序员的关系更密切. 我主要关心的是Linux操作系统,它是目前服务器端的主流操作系统.下面的内容针对的是Debian发行版,因为我对其他发行版不够熟悉. 第一步.加载内核 操作系统接管硬件以后,首先读入

Android Bluetooth蓝牙技术使用流程详解

在上篇文章给大家介绍了Android Bluetooth蓝牙技术初体验相关内容,感兴趣的朋友可以点击了解详情. 一:蓝牙设备之间的通信主要包括了四个步骤 设置蓝牙设备 寻找局域网内可能或者匹配的设备 连接设备 设备之间的数据传输 二:具体编程实现 1. 启动蓝牙功能 首先通过调用静态方法getDefaultAdapter()获取蓝牙适配器BluetoothAdapter,如果返回为空,则无法继续执行了.例如: BluetoothAdapter mBluetoothAdapter = Blueto

微信支付的开发流程详解_php技巧

最近在公司做了微信支付的接入,这里总结下开发的一些经验 注意,我使用的是微信开放平台的支付,与手机app相关,而与公众账号无关. 微信支付的主要操作流程 1.用户浏览app,选定商品然后下单. 2.服务器处理订单逻辑,开始正式发起支付流程 3.首先,后台服务器向weixin服务器发起请求,获取一个token. 4.后台服务器拿到token,使用和其他参数加密,再次向weixin服务器发起请求,获取一个预支付prepayid 5.后台服务器将该prepayid返回给app客户端 6.app调用手机

Android编程输入事件流程详解_Android

本文实例讲述了Android编程输入事件流程.分享给大家供大家参考,具体如下: EventHub对输入设备进行了封装.输入设备驱动程序对用户空间应用程序提供一些设备文件,这些设备文件放在/dev/input里面. EventHub扫描/dev/input下所有设备文件,并打开它们. bool EventHub::openPlatformInput(void) { ... mFDCount = 1; mFDs = (pollfd *)calloc(1, sizeof(mFDs[0])); mDev

ReentrantLock的lock-unlock流程详解

[本文转载自ReentrantLock的lock-unlock流程详解] 最近一段时间在研究jdk里的concurrent包,分为了线程管理,锁操作以及原子操作三个部分.线程管理平时用得还算多,但是锁操作和原子操作基本就没用过,只是以前在大学的时候跑了几个例子玩玩.当看到ReentrantLock的时候,发现用法倒是和synchronized有点类似也很简单,但是内部原理比较复杂.网上查了关于ReentrantLock的相关内容,没发现有谁把它分析得很透彻,只是有几篇讲了内部的锁实现机制,只可惜

Android4.X中SIM卡信息初始化过程详解_Android

本文实例讲述了Android4.X中SIM卡信息初始化过程详解.分享给大家供大家参考,具体如下: Phone 对象初始化的过程中,会加载SIM卡的部分数据信息,这些信息会保存在IccRecords 和 AdnRecordCache 中.SIM卡的数据信息的初始化过程主要分为如下几个步骤 1.RIL 和 UiccController 建立监听关系 ,SIM卡状态发生变化时,UiccController 第一个去处理. Phone 应用初始化 Phone 对象时会建立一个 RIL 和UiccCont