---- Bei der Entwicklung von Grafikprogrammen, insbesondere dreidimensionalen Grafikprogrammen, habe ich mich für DelphiOpenGL entschieden, weil ich der Meinung war, dass OpenGL nicht so kompliziert ist wie DirectX. Vom Gefühl her ist Delphi nicht so kompliziert wie C++ und benutzerfreundlicher. Also habe ich mich für Delphi+ entschieden. Dabei bin ich (definitiv) auf einige Probleme gestoßen und möchte meine Hoffnung zum Ausdruck bringen, dass ich mit meinen Freunden kommunizieren kann.
----Die erste ist die Initialisierung. Während der Initialisierung müssen mehrere Aufgaben ausgeführt werden: ① Erstellen Sie eine Gerätebeschreibungstabelle (Gerätekontext). (Hinweis: In Bezug auf DC sind die Übersetzungen verschiedener Materialien unterschiedlich, z. B. Geräteumgebung, Gerätebeschreibungstabelle, Gerätekontext usw., aber sie scheinen nicht sehr angemessen zu sein. Es wäre großartig, wenn es einen Übersetzer wie Li Shanlan geben könnte. Die folgende RC-Situation ist dieselbe.) ②Stellen Sie das entsprechende Pixelformat ein (PIXELFORMAT DESCRipTOR). ③Erstellen Sie eine Rendering-Beschreibungstabelle (Rendering-Kontext). Es gibt mehrere Möglichkeiten, Gerätekontexttabellen in Delphi abzurufen oder zu erstellen. Am einfachsten ist es, das Handle-Attribut (Handle) des Canvas-Objekts (TCanvas) direkt abzurufen, wie zum Beispiel:
DC: HDC; DC: = Canvas.Handle; Sie können auch die API-Funktion GetDC verwenden, um die Gerätebeschreibungstabelle abzurufen. Zum Beispiel: DC:=GetDC(Handle, DC);
---- Sie können auch die Funktion CreateCompatibleDC oder BeginPaint..EndPaint verwenden (Sie müssen auf den Unterschied zwischen ihnen achten), um die Gerätebeschreibungstabelle abzurufen. Wenn die Gerätebeschreibungstabelle jedoch aufgebraucht ist, müssen Sie daran denken, sie freizugeben oder zu löschen, um Ressourcen freizugeben. Sobald Sie Zugriff auf die Gerätekontexttabelle haben, können Sie das entsprechende Pixelformat festlegen. Das Pixelformat ist ein Datensatztyp mit einigen Feldern oder Feldern, die (zumindest im Moment) von geringem Nutzen sind. Nachdem die Beschreibung des Pixelformats abgeschlossen ist, rufen Sie die Funktionen ChoosePixelFormat und SetPixelFormat auf, um sie mit der Gerätebeschreibungstabelle abzugleichen und festzulegen. Wie zum Beispiel der folgende Code:
function SetupPixelFormat(var dc:HDC):Boolean;var ppfd:PPIXELFORMATDESCRIPTOR; npixelformat:Integer;begin New(ppfd^.nSize:=sizeof(ppfd^.nVersion:=1;ppfd^.dwFlags: =PFD_DRAW_TO_WINDOW oder PFD_SUPPORT_OPENGL oder PFD_DOUBLEBUFFER; ppfd^.iPixelType:=PFD_TYPE_COLORINDEX; ppfd^.cDepthBits:=0; ppfd^.cStencilBits:=0; npixelformat:=ChoosePixelFormat(dc, ppfd); if (nPixelformat=0) then begin MessageBox(NULL, 'choosePixelFormat failed', 'Error', MB_OK); ; if (SetPixelFormat(dc, npixelformat, ppfd)= FALSE) then begin MessageBox(NULL, 'SetPixelFormat failed', 'Error', MB_OK); Result:=False;end; pfd: PixelFormatDescriptor; nPixelFormat : Integer;begin FillChar(pfd,SizeOf(pfd),0); mit pfd do begin nSize:=sizeof(pfd); nVersion:=1;dwFlags:=PFD_SUPPORT_OPENGL oder PFD_DOUBLEBUFFER; cDepthBits:=32; iLayerType:=Byte(PFD_MAIN_PLANE); Verwenden Sie DescribePixelFormat, um zu überprüfen, ob das Pixelformat korrekt eingestellt ist. DescribePixelFormat(DC,nPixelFormat,SizeOf(pfd),@pfd); if (pfd.dwFlags and PFD_NEED_PALETTE) < > 0 then SetupPalette(DC,pfd);//SetupPalette ist a benutzerdefinierte Funktion }end;
----Nachdem die obige Arbeit abgeschlossen ist, ist es am besten, sie erneut auszuführen und den Wert von nPixelFormat zu überprüfen. Normalerweise sollte dieser Wert größer als 0 sein, sonst gibt es ein Problem. Für denselben Code kann ich auf dem NT-Computer den korrekten Wert größer als 0 erhalten, auf dem PWIN97- oder 98-Computer jedoch nicht den richtigen Wert. Beim Kompilieren tritt jedoch kein Problem auf, und nach dem Kompilieren auf NT kann dies auch der Fall sein Wird auf dem PWIN97-Computer korrekt ausgeführt. Jetzt ist es an der Zeit, den Shading-Kontext (RC) zu erstellen. Rufen Sie die Funktionen wglCreateContext und wglMakeCurrent auf, wie im folgenden Beispiel gezeigt:
RC: HGLRC; RC:=wglCreateContext(DC); wglMakeCurrent(DC,RC); Denken Sie daran, die belegten Ressourcen freizugeben. wglMakeCurrent(0,0); if RC< >null then wglDeleteContext(RC); if ghDC< >null then ReleaseDC(Handle,DC);
---- Der folgende Code ist aus dem OpenGL-Beispiel in C++Builder 4 übernommen. Die Größe des kompilierten Programms beträgt etwa 300 KB, während die Größe des kompilierten Programms unter C++Builder 4 384 KB beträgt.
---- < a href="061403-05.zip ">Programmcode Zip 3KB
---- Die OpenGL-Funktionen und das Pixelformat im Programm werden in MSHelp in Delphi ausführlich erklärt. Dieser Artikel wagt es nicht, mehr zu erklären.