在开发图形程序时
尤其是三维的图形程序
因为感觉OpenGL没有DirectX那么庞杂
所以选择了DelphiOpenGL
凭感觉而言
Delphi也没有C++那么繁杂而且更加人性化
于是选择Delphi+OpenGL进行工作
在这过程中
碰到(肯定会)一些问题
在此提出希望和朋友们能够进行交流
首先是初始化初始化时有几项工作需要进行
①创建设备描述表(Device Context)(注关于DC各种资料译文不尽相同如设备环境设备描述表设备上下文等但好象都不太贴切要是能有李善兰这样的翻译就好了下文中的RC情形相同)
②设置相应的象素格式(PIXELFORMAT DESCRIPTOR)
③创建着色描述表(Rendering Context) Delphi中有好几种获得或创建设备描述表的方法最简单的就是直接获得画布对象(TCanvas)的句柄属性(Handle)如
DCHDC
DC=CanvasHandle
也可以用API函数GetDC获得设备描述表如
DC=GetDC(HandleDC)
也可以用函数CreateCompatibleDC或者BeginPaintEndPaint(需要注意它们之间的区别)等来获得设备描述表但是设备描述表用完之后要记得释放或删除它以解放资源的占用拥有设备描述表的使用权后就可以设置相应的象素格式象素格式是个记录类型其中有些字段或域是没什么用处的(至少现在是)象素格式描述完成后调用ChoosePixelFormat和SetPixelFormat函数将之与设备描述表进行匹配和设置如下面代码
function SetupPixelFormat(var dc:HDC):Boolean;
var
ppfd:PPIXELFORMATDESCRIPTOR;
npixelformat:Integer;
begin
New(ppfd);
ppfd^nSize:=sizeof(PIXELFORMATDESCRIPTOR);
ppfd^nVersion:=;
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:=;
ppfd^cDepthBits:=;
ppfd^cAccumBits:=;
ppfd^cStencilBits:=;
npixelformat:=ChoosePixelFormat(dc ppfd);
if (nPixelformat=) then
begin
MessageBox(NULL choosePixelFormat failedError 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(pfdSizeOf(pfd));
with pfd do
begin
nSize:=sizeof(pfd);
nVersion:=;
dwFlags:=PFD_SUPPORT_OPENGL or PFD_DRAW_TO_BITMAP or PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=;
cDepthBits:=;
iLayerType:=Byte(PFD_MAIN_PLANE);
end;
nPixelFormat:=ChoosePixelFormat(DC@pfd);
SetPixelFormat(DCnPixelFormat@pfd);
{
// 使用DescribePixelFormat检查象素格式是否设置正确
DescribePixelFormat(DCnPixelFormatSizeOf(pfd)@pfd);
if (pfddwFlags and PFD_NEED_PALETTE)
< > then SetupPalette(DCpfd);
//SetupPalette是自定义函数
} end
上述工作完成以后最好先运行一遍并检查nPixelFormat的值正常的话该值应该是大于的否则就有问题同样的代码我在NT机器上能够得到正确的大于的值而在PWIN或的机器上得不到正确值但是编译时不会有问题而且NT上编译后在PWIN机器上也能够正确运行现在可以创建着色描述表(RC)了调用函数wglCreateContextwglMakeCurrent如下例所示
RCHGLRC
RC:=wglCreateContext(DC);
wglMakeCurrent(DCRC);
在程序结束之前要记得释放所占用的资源
wglMakeCurrent();
if RC< >null then
wglDeleteContext(RC);
if ghDC< >null then
ReleaseDC(HandleDC);
以下的代码是从C++Builder 中OpenGL的例子改写过来的编译后的程序大小为K左右而在C++Builder 下编译后程序的大小为K
< a href=zip >程序代码 Zip KB
程序中的OpenGL函数及象素格式在Delphi中的MSHelp中有比较详细的解释本文不敢多做解释