用Delphi进行OpenGL编程学习心得

2016-01-29 14:25 87 1 收藏

用Delphi进行OpenGL编程学习心得,用Delphi进行OpenGL编程学习心得

【 tulaoshi.com - Delphi 】

  首先是初始化。初始化时,有几项工作需要进行:①创建设备描述表(Device Context)。(注:关于DC,各种资料译文不尽相同如设备环境、设备描述表、设备上下文等,但好象都不太贴切。要是能有李善兰这样的翻译就好了。下文中的RC情形相同)②设置相应的象素格式(PIXELFORMAT DESCRIPTOR)。③创建着色描述表(Rendering Context)。 Delphi中有好几种获得或创建设备描述表的方法。最简单的就是直接获得画布对象(TCanvas)的句柄属性(Handle),如:

DC:HDC;
DC:=Canvas.Handle;
  也可以用API函数GetDC获得设备描述表。如:

DC:=GetDC(Handle,DC);
  也可以用函数CreateCompatibleDC或者BeginPaint..EndPaint(需要注意它们之间的区别)等来获得设备描述表。但是设备描述表用完之后要记得释放或删除它,以解放资源的占用。拥有设备描述表的使用权后,就可以设置相应的象素格式。象素格式是个记录类型,其中有些字段或域是没什么用处的(至少现在是)。象素格式描述完成后,调用ChoosePixelFormat和SetPixelFormat函数将之与设备描述表进行匹配和设置。如下面代码:

function SetupPixelFormat(var dc:HDC):Boolean;
var
 ppfd:PPIXELFORMATDESCRIPTOR;
 npixelformat:Integer;
begin
  New(ppfd);
  ppfd^.nSize:=sizeof(PIXELFORMATDESCRIPTOR);
  ppfd^.nVersion:=1;
ppfd^.dwFlags:=PFD_DRAW_TO_WINDOW
or PFD_SUPPORT_OPENGL or
            PFD_DOUBLEBUFFER;
  ppfd^.dwLayerMask:=PFD_MAIN_PLANE;
  ppfd^.iPixelType:=PFD_TYPE_COLORINDEX;
  ppfd^.cColorBits:=8;
  ppfd^.cDepthBits:=16;
  ppfd^.cAccumBits:=0;
  ppfd^.cStencilBits:=0;
  npixelformat:=ChoosePixelFormat(dc, ppfd);
  if (nPixelformat=0) then
   begin
    MessageBox(NULL, ’choosePixelFormat failed’,
    ’Error’, MB_OK);
    Result:=False;
    Exit;
   end;
  if (SetPixelFormat(dc, npixelformat, ppfd)= FALSE) then
   begin
    MessageBox(NULL, ’SetPixelFormat failed’,
  ’Error’, MB_OK);
    Result:=False;
    Exit;
   end;
  Result:=True;
  Dispose(ppfd);
end;
  也可以向下面这样进行设置如:

var pfd: PixelFormatDescriptor;
  nPixelFormat : Integer;
begin
 FillChar(pfd,SizeOf(pfd),0);
 with pfd do
 begin
  nSize:=sizeof(pfd);
  nVersion:=1;
dwFlags:=PFD_SUPPORT_OPENGL
or PFD_DRAW_TO_BITMAP
          or PFD_DOUBLEBUFFER;
  iPixelType:=PFD_TYPE_RGBA;
  cColorBits:=32;
  cDepthBits:=32;
  iLayerType:=Byte(PFD_MAIN_PLANE);
 end;
 nPixelFormat:=ChoosePixelFormat(DC,@pfd);
 SetPixelFormat(DC,nPixelFormat,@pfd);
{ // 使用DescribePixelFormat检查象素格式是否设置正确
 DescribePixelFormat(DC,nPixelFormat,SizeOf(pfd),@pfd);
if (pfd.dwFlags and PFD_NEED_PALETTE)
< > 0 then SetupPalette(DC,pfd);
//SetupPalette是自定义函数
}end;
  上述工作完成以后,最好先运行一遍,并检查nPixelFormat的值。正常的话,该值应该是大于0的,否则就有问题。同样的代码,我在NT机器上能够得到正确的大于0的值而在PWIN97或98的机器上得不到正确值,但是编译时不会有问题,而且NT上编译后在PWIN97机器上也能够正确运行。现在可以创建着色描述表(RC)了。调用函数wglCreateContext、wglMakeCurrent,如下例示:

RC:HGLRC;
RC:=wglCreateContext(DC);
wglMakeCurrent(DC,RC);
  在程序结束之前,要记得释放所占用的资源。

来源:https://www.tulaoshi.com/n/20160129/1493264.html

延伸阅读
----科学计算可视化,计算机动画和虚拟现实是现在计算机图形学的三个热点。而这三个热点的核心都是三维真实感图形的绘制。由于OpenGL( OpenGraphicsLibrary)具有跨平台性、简便、高效、功能完善,目前已经成为了三维图形制作方法中事实上的工业标准。自从WindowsNT3.51在微 机平台上支持OpenGL以后,现在微软公司在Windows95OS...
标签: Delphi
  Delphi是一个优秀的可视化软件开发环境,并已广泛应用于数据库软件的开发。在DelphiC/S版环境中,结合其优化的数据库操作,以及BorlandDatabaseEngine(即:BDE,数据库引擎),对开发客户机/服务器系统下的网络数据库软件提供了更加快速有效的途径。在客户机/服务器系统中,服务器端我们采用Microsoft SQL Server 6....
◇[DELPHI]网络邻居复制文件 uses shellapi; copyfile(pchar('newfile.txt'),pchar('//computername/direction/targer.txt'),false); ◇[DELPHI]产生鼠标拖动效果 通过MouseMove事件、DragOver事件、EndDrag事件实现,例如在PANEL上的LABEL: var xpanel,ypanel,xlabel,ylabel:integer; PAN...
标签: Delphi
  Delphi作为一门新起的Windows编程语言,由于其集众多的优秀特性于一身,因而越来越得到广大编程人员和发烧友的青睐。以下十则技巧涉及的面比较广泛,希望能够对Delphi的爱好者有所裨益。 1.类似于vb.中的doevents功能。 大家或许发现,在Delphi中没有类似于vb.中的doevents函数,这样有的时候,我们将无法使Windows响应...
标签: Delphi
OpenGL驱动一般以二进制库文件的形式提供。它能够动态的连接到你的程序中。在Windows平台上,它将是成为DLL的形式(在你的系统目录下检查opengl.dll)。自从Delphi能够使用任何DLL开始,它对OpenGL 3D编程的能力就像其他任何语言一样容易了。本文将帮助你获得在Delphi中进行OpenGL开发的有效知识。 数学基础 OpenGL拥有强...

经验教程

907

收藏

89
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部