一、前言:

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

最新文章

  1. JS(去掉前后空格或去掉所有空格)的用法
  2. SQL*LOADER错误总结
  3. Spark standlone安装与配置
  4. IBatis 构建 In语句
  5. 20145220java程序设计第九周学习总结
  6. Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别
  7. poj 1087 A Plug for UNIX
  8. 定制的Server-Sent Events 聊天服务器
  9. HTTP性能测试
  10. 树莓派高级GPIO库,wiringpi2 for python使用笔记(五)i2c读取测试
  11. leetcode 最长连续序列 longest consecutive sequence
  12. 使用print2flash开发在线文档
  13. Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)
  14. [git]入门-工作区、暂存区、版本库
  15. 51Nod 1298 圆与三角形(计算几何)
  16. Go语言规格说明书 之 类型声明(Type declarations)
  17. websocket连接的后台反向代理问题
  18. mvc 缓存 sqlCacheDependency 监听数据变化
  19. 【剑指offer】调整数组数字位置
  20. jeecms常用的标签

热门文章

  1. java 统计字符串中子字符串个数
  2. HAOI2010 工厂选址
  3. python之爬虫(二)爬虫的原理
  4. swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~
  5. TCP和UDP的最完整的区别【转】
  6. [AIR] 读写数据
  7. 2019建模美赛B题(派送无人机)M奖论文
  8. Python中执行变量而非字符串
  9. click事件和jquery选项卡
  10. windows本地搭建nginx+php+mysql+redis环境详细步骤