一、前言:

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. 自己动手设计并实现一个linux嵌入式UI框架(设计)

    看了"自己动手设计并实现一个linux嵌入式UI框架"显然没有尽兴,因为还没有看到庐山真面目,那我今天继续,先来说说,我用到了哪些知识背景.如:C语言基础知识,尤其是指针.函数指针 ...

  2. 菜鸟的Xamarin.Forms前行之路——从新建项目到APP上架各种报错问题解决方法合集(不定时更新)

    出自:博客园-半路独行 原文地址:http://www.cnblogs.com/banluduxing/p/7425791.html 本文出自于http://www.cnblogs.com/banlu ...

  3. django response reuqest

    HttpRequest objects 属性 HttpRequest.scheme 表示请求协议的字符串(通常是http或https). HttpRequest.body 原始HTTP请求主体作为字节 ...

  4. python之爬虫(三) Urllib库的基本使用

    官方文档地址:https://docs.python.org/3/library/urllib.html 什么是Urllib Urllib是python内置的HTTP请求库包括以下模块urllib.r ...

  5. jQuery阻止默认行为

      <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF- ...

  6. ArchLinux 下 OpenSSH 高级运用

    00x0.相关介绍 OpenSSH(OpenBSD Secure Shell)使用 SSH 通过计算机网络加密通信的实现. 它是替换由 SSH Communications Security 所提供的 ...

  7. proxy思考

    vue从2.5版本之后开始强化typescript的支持程度,在ide方面增强对visual stadio的支持,更重要的是,双数据绑定那一块,要使用es6的proxy来代替Object.define ...

  8. Linux/Windows 平台最容易安装 Composer教程

    我们采用的是全局安装方式,这样的话,就能够在命令行窗口中直接执行 composer 命令了. Mac 或 Linux 系统: 打开命令行窗口并执行如下命令将前面下载的 composer.phar 文件 ...

  9. Java传参都是传引用变量的副本

    最近做练习时碰到一个问题,Java到底是怎样传参的,经过查资料与实验,我发现Java传参都是传引用变量的副本值. 1 Java中的引用变量 1.1 字面值引用变量:即基本数据类型的引用变量 ,如 in ...

  10. SQLAlachemy 自动提交配置 SQLALCHEMY_COMMIT_ON_TEARDOWN

    挖坑:自动提交省去了每次 commit,添加数据对象后立马取 id 返回None 填坑 :立马要取 id 的地方 commit一下