Delphi下OpenGL2d绘图(01)-初始化
一、前言:
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)-初始化的更多相关文章
- Delphi下OpenGL2d绘图(04)-画四边形
一.前言 画四边形基本上与前几遍文字代码是相同.区别在于glBegin()的参数“GL_QUADS”.绘制的框架代码可以使用 Delphi下OpenGL2d绘图(01)-初始化 中的代码.修改的部份为 ...
- Delphi下OpenGL2d绘图(03)-画线
一.前言 画线与画点基本上代码是相同.区别在于glBegin()的参数.绘制的框架代码可以使用 Delphi下OpenGL2d绘图(01)-初始化 中的代码.修改的部份为 Draw 函数的内容. 二. ...
- Delphi下OpenGL2d绘图(02)-画点
一.前言 图形的绘制可以使用glBegin().glEnd()之间完成,绘制的框架代码可以使用 Delphi下OpenGL2d绘图(01)-初始化 中的代码.修改的部份为 Draw 函数的内容. 二. ...
- Delphi下OpenGL2d绘图(06)-画图(多窗口、多视图、多个DC)
一.前言 在学习OpenGL的过程中,发现很多函数都是全局的.前面几章中都是在一个窗口DC中画图,那么要在多个窗口画图,需要怎么处理呢?网上方法有多种,这里采用其中一种,利用wglMakeCurren ...
- Delphi下OpenGL2d绘图(05)-画图片Bmp
一.前言 找了不少资料,要画图片要先处理一下,需要引用别的单元,Delphi中没带,需要另外下载Gl.pas.看网上说是自带的OpenGl单元封装的是1.0版的,有此函数未声明.网上可以找到Gl.pa ...
- DELPHI下API简述(1800个API)
DELPHI下API简述 http://zero.cnbct.org/show.asp?id=144 auxGetDevCaps API 获取附属设备容量 auxGetNumDevs API 返回附属 ...
- 深入Delphi下的DLL编程
深入Delphi下的DLL编程 作者:岑心 引 言 相信有些计算机知识的朋友都应该听说过“DLL”.尤其是那些使用过windows操作系统的人,都应该有过多次重装系统的“悲惨”经历——无论再怎样小心, ...
- DELPHI下的SOCK编程(转)
DELPHI下的SOCK编程 本文是写给公司新来的程序员的,算是一点培训的教材.本文不会涉及太多的编程细节,只是简单讲解在DELPHI下进行Winsock编程最好了解的知识. 题外话:我认为 ...
- DELPHI下的SOCK编程
DELPHI下的SOCK编程(转自http://www.cnblogs.com/devcjq/articles/2325600.html) 本文是写给公司新来的程序员的,算是一点培训的教材.本文不会 ...
随机推荐
- Spring学习(四)——使用Spring JDBC访问数据库
本篇我们将在上一篇http://www.cnblogs.com/wenjingu/p/3824294.html的Demo程序的基础上增加数据持久层和业务层,实现登录验证功能. 1.修改gradle文件 ...
- SOLR企业搜索平台 二 (分词安装)
标签:linux lucene 分词 solr 全文检索 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://3961409.blog ...
- TestNG+Selenium
是一个开源自动化测试框架.其实类似于JUnit这种单元测试框架,但进行了一些功能扩展 属于selenium?还是说TestNG是一个测试框架,它用到了selenium的web自动化测试的功能,比如使用 ...
- 用FileZilla服务器端和客户端实现本机与虚拟机之间文件上传和下载
1. FileZilla简介 2.准备工作3.安装 FileZilla Server和配置3.1.问题及解决方法3.2.添加目录3.3.测试FIP4.安装FileZilla Client5.连接服务器 ...
- “全栈2019”Java第六十六章:抽象类与接口详细对比
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- leecode刷题(9)-- 有效的数独
leecode刷题(9)-- 有效的数独 有效的数独 描述: 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 ...
- PHP如何将多维数组中的数据批量插入数据库?
PHP将多维数组中的数据批量插入到数据库中,顾名思义,需要用循环来插入. 1.循环insert into 语句,逐渐查询 <?php /* www.qSyz.net */ @mysql_conn ...
- CSS3过渡效果 兼容IE6、IE7、IE8
<style> .box{ width:120px;height:40px;background:yellowgreen;line-height:40px;transition:width ...
- [Swift]堆栈Stack的两种版本:(1)用类包装Stack (2)用泛型包装Stack
堆栈是一个在计算机科学中经常使用的抽象数据类型.堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列. 堆栈中定义了一些操作. 两个最重要的 ...
- JMeter—断言
断言用来对服务器的响应数据做验证,常用的断言是响应断言,支持正则表达式. 一.BeanShell Assertion 用来访问JMeter的属性: log对象,可以利用此对象写日志 SampleRes ...