用Delphi进行OpenGL编程学习心得

嫑爱灬

嫑爱灬

2016-01-29 14:25

用Delphi进行OpenGL编程学习心得,用Delphi进行OpenGL编程学习心得
  首先是初始化。初始化时,有几项工作需要进行:①创建设备描述表(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);
  在程序结束之前,要记得释放所占用的资源。
展开更多 50%)
分享

猜你喜欢

用Delphi进行OpenGL编程学习心得

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

JSP学习心得

Java JAVA基础
JSP学习心得

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Java异常学习心得

编程语言 网络编程
Java异常学习心得

mysql 常见命令和学习心得

编程语言 网络编程
mysql 常见命令和学习心得

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Web开发学习心得2——HTML的结构

Web开发
Web开发学习心得2——HTML的结构

Delphi下的OpenGL开发

编程语言 网络编程
Delphi下的OpenGL开发

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

深入理解Delphi的消息机制

深入理解Delphi的消息机制

用Flash和XML构建论坛实例(下)

用Flash和XML构建论坛实例(下)
下拉加载更多内容 ↓