科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件浅述Delphi下的OpenGL图形开发

浅述Delphi下的OpenGL图形开发

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将帮助你获得在Delphi中进行OpenGL开发的有效知识

作者:wyb_star 来源:CSDN 2007年10月31日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
从基本元素(primitive)到对象

  现在开始最有意思的部分:对象。OpenGL仅仅支持以下几种基本几何图形:点,线和多边形。没有表面或者更高级的图形(比如球状图形)能被作为基本图形元素绘制。但是它们能够用多边形完美的模仿出来。随意看看现代3D游戏,你会发现它们完全由三角形建立。因此,我们不会被此限制所约束。

  对象的绘制非常类似Pascal语言编程。每个块都应该被begin-end包含着,更为确切的说是glBegin()和glEnd()。如同下面的例子:

const S=1.0; D=5.0;
...
glBegin(GL_TRIANGLES);
glVertex3f( -S, 0, D); glVertex3f(S, 0, D); glVertex3f(0, S, D);
glEnd;

  这是个简单的三角形。它距离你的视点有5个单位,自身高1个单位,宽2个单位。

  这是屏幕截图:


  即使它看起来不象3D图形,但它是我们的初始块。在下面你可以看到这个例子的源代码。

  在你开始钻研代码前,还有些话要说。每次OpenGL编程,都包含一些初始化输出设备的OS设定(OS-specific)代码。如果你使用Win32,你将需要设置像素格式以及建立显示上下文环境脱离windows设备上下文环境。如果windows系统级编程你并不很在行,你可以把如下的代码作为模版使用。FormCreate中被调用函数的详细信息可以参考帮助文档。

FILE: Tri.pas
unit Tri;

interface

uses
OpenGL, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls;

type
 TForm1 = class(TForm)
 procedure FormCreate(Sender: TObject);
 procedure FormPaint(Sender: TObject);
private
 procedure Draw; //Draws an OpenGL scene on request
public
end;

var
 Form1: TForm1;

 implementation

 {$R *.DFM}

 procedure setupPixelFormat(DC:HDC);
const
 pfd:TPIXELFORMATDESCRIPTOR = (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; // no layer, visible, damage masks
);
var pixelFormat:integer;
begin
 pixelFormat := ChoosePixelFormat(DC, @pfd);
 if (pixelFormat = 0) then
  exit;
 if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE) then
  exit;
end;

procedure GLInit;
begin
 // set viewing projection
 glMatrixMode(GL_PROJECTION);
 glFrustum(-0.1, 0.1, -0.1, 0.1, 0.3, 25.0);
 // position viewer
 glMatrixMode(GL_MODELVIEW);
 glEnable(GL_DEPTH_TEST);
end;

procedure TForm1.FormCreate(Sender: TObject);
var DC:HDC;
 RC:HGLRC;
 i:integer;
begin
 DC:=GetDC(Handle); //Actually, you can use any windowed control here
 SetupPixelFormat(DC);
 RC:=wglCreateContext(DC); //makes OpenGL window out of DC
 wglMakeCurrent(DC, RC); //makes OpenGL window active
 GLInit; //initialize OpenGL
end;

procedure TForm1.Draw;
 const S=1.0; D=5.0;
begin
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 glLoadIdentity;
 glTranslatef(0.0, 0.0, -12.0);
 glBegin(GL_TRIANGLES);
 glVertex3f( -S, 0, D); glVertex3f(S, 0, D); glVertex3f(0, S, D);
 glEnd;
 SwapBuffers(wglGetCurrentDC);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 Draw;
end;

end.
FILE: Tri.dfm
object Form1: TForm1
BorderStyle = bsDialog
Caption = 'BASIC OpenGL Program'
ClientHeight = 318
ClientWidth = 373
OnCreate = FormCreate
OnPaint = FormPaint
end
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章