---- Lors du développement de programmes graphiques, en particulier de programmes graphiques tridimensionnels, j'ai choisi DelphiOpenGL parce que je pensais qu'OpenGL n'était pas aussi compliqué que DirectX. En termes de sensations, Delphi n'était pas aussi compliqué que C++ et était plus convivial. j'ai donc choisi Delphi+ pour faire le travail. Au cours du processus, j'ai rencontré (certainement) quelques problèmes et je voudrais exprimer mon espoir de pouvoir communiquer avec mes amis.
----Le premier est l'initialisation. Lors de l'initialisation, plusieurs tâches doivent être effectuées : ① Créer une table de description de périphérique (Device Context). (Remarque : concernant DC, les traductions de divers documents sont différentes, comme l'environnement de l'appareil, le tableau de description de l'appareil, le contexte de l'appareil, etc., mais elles ne semblent pas très appropriées. Ce serait formidable s'il pouvait y avoir un traducteur comme Li Shanlan. La situation de RC ci-dessous est la même)②Définissez le format de pixel correspondant (PIXELFORMAT DESCRipTOR). ③Créez une table de description du rendu (Contexte de rendu). Il existe plusieurs façons d'obtenir ou de créer des tables de contexte de périphérique dans Delphi. Le plus simple est d'obtenir directement l'attribut handle (Handle) de l'objet canevas (TCanvas), tel que :
DC : HDC ; DC : = Canvas.Handle ; vous pouvez également utiliser la fonction API GetDC pour obtenir le tableau de description des appareils. Tels que : DC:=GetDC(Handle, DC);
---- Vous pouvez également utiliser la fonction CreateCompatibleDC ou BeginPaint..EndPaint (vous devez faire attention à la différence entre eux) pour obtenir le tableau de description des appareils. Cependant, une fois la table de description de l'appareil épuisée, n'oubliez pas de la libérer ou de la supprimer pour libérer des ressources. Une fois que vous avez accès à la table contextuelle de l'appareil, vous pouvez définir le format de pixel correspondant. Le format pixel est un type d'enregistrement avec certains champs ou champs peu utiles (du moins pour l'instant). Une fois la description du format de pixel terminée, appelez les fonctions ChoosePixelFormat et SetPixelFormat pour la faire correspondre et la définir avec le tableau de description de l'appareil. Tel que le code suivant :
fonction SetupPixelFormat(var dc:HDC):Boolean;var ppfd:PPIXELFORMATDESCRIPTOR; npixelformat:Integer;begin New(ppfd^.nSize:=sizeof(PIXELFORMATDESCRIPTOR); =PFD_DRAW_TO_WINDOW ou PFD_SUPPORT_OPENGL ou PFD_DOUBLEBUFFER ; ppfd^.dwLayerMask :=PFD_MAIN_PLANE ; ppfd^.iPixelType :=PFD_TYPE_COLORINDEX ; ppfd^.cColorBits :=8 ; ppfd^.cStencilBits:=0; npixelformat:=ChoosePixelFormat(dc, ppfd); if (nPixelformat=0) then start MessageBox(NULL, 'choosePixelFormat failed', 'Error', MB_OK Result:=False end; ; si (SetPixelFormat(dc, npixelformat, ppfd)= FALSE) puis start MessageBox(NULL, 'SetPixelFormat failed', 'Error', MB_OK); Result:=False; Exit:=True;end; pfd : PixelFormatDescriptor ; nPixelFormat : Entier ; début FillChar(pfd,SizeOf(pfd),0); avec pfd commencer nSize:=sizeof(pfd); nVersion:=1;dwFlags:=PFD_SUPPORT_OPENGL ou PFD_DRAW_TO_BITMAP ou PFD_DOUBLEBUFFER; cDepthBits:=32; iLayerType:=Byte(PFD_MAIN_PLANE); end; nPixelFormat:=ChoosePixelFormat(DC,@pfd); Utilisez DescribePixelFormat pour vérifier si le format de pixel est correctement défini. DescribePixelFormat(DC,nPixelFormat,SizeOf(pfd),@pfd); if (pfd.dwFlags and PFD_NEED_PALETTE) < > 0 then SetupPalette(DC,pfd);//SetupPalette est un fonction personnalisée }end;
----Une fois le travail ci-dessus terminé, il est préférable de l'exécuter à nouveau et de vérifier la valeur de nPixelFormat. Normalement, cette valeur doit être supérieure à 0, sinon il y aura un problème. Pour le même code, je peux obtenir la valeur correcte supérieure à 0 sur la machine NT mais pas la valeur correcte sur la machine PWIN97 ou 98. Cependant, il n'y aura aucun problème lors de la compilation, et après compilation sur NT, cela peut également l'être. utilisé sur la machine PWIN97 Exécuter correctement. Il est maintenant temps de créer le contexte d'ombrage (RC). Appelez les fonctions wglCreateContext et wglMakeCurrent, comme indiqué dans l'exemple suivant :
RC: HGLRC; RC:=wglCreateContext(DC); wglMakeCurrent(DC,RC); Avant la fin du programme, n'oubliez pas de libérer les ressources occupées. wglMakeCurrent(0,0); si RC< >null alors wglDeleteContext(RC); si ghDC< >null alors ReleaseDC(Handle,DC);
---- Le code suivant est adapté de l'exemple OpenGL dans C++Builder 4. La taille du programme compilé est d'environ 300 Ko, tandis que la taille du programme compilé sous C++Builder 4 est de 384 Ko.
---- < a href="061403-05.zip ">Code du programme Zip 3 Ko
---- Les fonctions OpenGL et le format de pixel du programme sont expliqués en détail dans MSHelp dans Delphi. Cet article n'ose pas en expliquer davantage.