1. Avant-propos :
Delphi prend en charge OpenGl par défaut. Vous pouvez utiliser l'unité opens OpenGL pour le référencer, puis utiliser les fonctions OpenGL. OpenGl est multiplateforme et Windows le prend depuis longtemps en charge et intégré au système. Opengl32.dll existe dans system32 et ne nécessite aucune installation supplémentaire. Bien que Windows lui-même dispose de d3d, ses capacités sont limitées et il existe relativement peu de pages de matériel d'apprentissage associées.
Habituellement, OpenGL ne prend en charge que les formes géométriques de base suivantes : points, lignes et polygones . Aucune surface ou graphique de niveau supérieur (tel que des sphères) ne peut être dessiné comme élément graphique de base. Mais ils peuvent être parfaitement simulés à l’aide de polygones. Jetez un coup d'œil décontracté aux jeux 3D modernes et vous verrez qu'ils sont presque entièrement construits à partir de triangles. Nous ne sommes donc pas liés par cette limitation.
2. Initialisation
Avant d'utiliser OpenGL, vous devez définir certains paramètres associés. Le processus général est le suivant :
"Définir le format de pixel correspondant" (ChoosePixelFormat, SetPixelFormat)
"Créer un nouveau contexte de rendu OpenGL" (wglCreateContext)
"Définir les paramètres liés à OpenGL", "Dessin" (glBegin, glEnd)
"Supprimer le contexte de rendu OpenGL" (wglDeleteContext)
procédure TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;begin With pfd do start nSize := sizeof(TPIXELFORMATDESCRIPTOR); // taille nVersion := 1; PFD_DOUBLEBUFFER; // prise en charge du double tampon iPixelType := PFD_TYPE_RGBA; // type de couleur cColorBits := 24; // profondeur de couleur préférée cRedBits := 0; // bits de couleur (ignorés) cGreenBits := 0; := 0; cBleuBits := 0; cBleuShift := 0; cAlphaBits := 0; cAlphaShift := 0; // pas de tampon alpha cAccumBits := 0; cAccumRedBits := 0; // pas de tampon d'accumulation, cAccumGreenBits := 0; = 0; cDepthBits := 16; // tampon de profondeur cStencilBits := 0; // pas de tampon de pochoir cAuxBuffers := 0; // pas de tampon auxiliaire iLayerType := PFD_MAIN_PLANE; // couche principale bReserved := 0; = GetDC(Poignée); pixelFormat := ChoosePixelFormat(FDC, @pfd); si pixelFormat = 0 then Exit ; sinon SetPixelFormat(FDC, pixelFormat, @pfd) then Exit ; to Le paramètre noir est RGBA glClearColor(0, 0, 0, 0); //Définit la projection orthographique de la matrice de transformation de projection de vue glMatrixMode(GL_PROJECTION); //Réinitialise la matrice actuellement spécifiée à la matrice d'identité glLoadIdentity; //Spécifie OpenGL pour dessiner dans cette zone glViewPort(0, 0, ClientWidth, ClientHeight); Définir La plage du système de coordonnées mondial gluOrtho2D(0, ClientWidth, ClientHeight, 0); Basculez l'objet de transformation matricielle vers la transformation de vue modèle glMatrixMode(GL_MODELVIEW); //Réinitialise la matrice actuellement spécifiée sur la matrice d'identité glLoadIdentity;end;
3. Dessin
Les primitives de base d'OpenGL sont les points, les lignes, les polygones, etc. Chaque fois que vous dessinez, vous devez utiliser glBegin() et glEnd(). Par exemple, la procédure de fonction de dessin suivante Draw ;
procédure TForm1.Draw;begin // Effacer le tampon glClear(GL_COLOR_BUFFER_BIT ou GL_DEPTH_BUFFER_BIT); // Effacer le tampon glColor3ub(0, 255, 0); // Demander à OpenGL de dessiner des triangles glVertex2f(200, 300); ; //Transmet les trois coordonnées des sommets du triangle à OpenGL glVertex2f(400, 300); glVertex2f(300, 150); //Fin du dessin des primitives. SwapBuffers(FDC); //Échangez le contenu du double tampon, qui copiera les graphiques qui viennent d'être dessinés à l'écran. fin;
4. Enfin, n'oubliez pas de relâcher . Le code complet est le suivant :
unité Unit1;interfaceutilise Windows, Messages, SysUtils, Variants, Classes, Graphiques, Contrôles, Formulaires, Boîtes de dialogue, OpenGL;type TForm1 = classe(TForm) procédure FormCreate(Expéditeur : TObject) procédure FormDestroy(Expéditeur : TObject procédure FormPaint); Expéditeur : TObject); procédure FormResize (Expéditeur : TObject); private {Déclarations privées } FDC : HDC ; FHRC: HGLRC; procédure Draw; public { Déclarations publiques } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Draw;begin // Effacer le tampon glClear(GL_COLOR_BUFFER_BIT ou GL_DEPTH_BUFFER_BIT); glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES);//Dire à OpenGL que le triangle va être dessiné glVertex2f(200, 300); //Transférer les trois coordonnées des sommets du triangle vers OpenGL glVertex2f(400, 300); glEnd; //Fin du dessin en yuans. SwapBuffers(FDC); //Échangez le contenu du double tampon, qui copiera les graphiques qui viennent d'être dessinés à l'écran. end;procédure TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;begin With pfd do start nSize := sizeof(TPIXELFORMATDESCRIPTOR); // taille nVersion := 1; // version dwFlags := PFD_SUPPORT_OPENGL ou PFD_DRAW_TO_WINDOW ou PFD_DOUBLEBUFFER ; // prend en charge le double tampon iPixelType := PFD_TYPE_RGBA ; // type de couleur cColorBits := 24 ; // profondeur de couleur préférée cRedBits := 0; ; cGreenShift := 0; cBlueBits := 0; cBlueShift := 0; cAlphaBits := 0; cAlphaShift := 0; // pas de tampon alpha cAccumBits := 0; cAccumRedBits := 0; = 0; cAccumAlphaBits := 0; cDepthBits := 16; cStencilBits := 0; // pas de tampon de pochoir cAuxBuffers := 0; // pas de tampon auxiliaire iLayerType := PFD_MAIN_PLANE; // couche principale bReserved := 0; ; FDC := GetDC(Poignée); pixelFormat := ChoosePixelFormat(FDC, @pfd); si pixelFormat = 0 alors Exit ; sinon SetPixelFormat(FDC, pixelFormat, @pfd) then Exit ; wglCreateContext(FDC); La couleur est noire et le paramètre est RGBA glClearColor(0, 0, 0, 0); //Définit la projection orthographique de la matrice de transformation de vue glMatrixMode(GL_PROJECTION); //Réinitialise la matrice actuellement spécifiée à la matrice d'identité glLoadIdentity; //Spécifie OpenGL pour dessiner dans cette zone glViewPort(0, 0, ClientWidth, ClientHeight) ; //Définit la plage du système de coordonnées mondial gluOrtho2D(0, ClientWidth, ClientHeight, 0); Basculer l'objet de transformation matricielle vers la transformation de vue modèle glMatrixMode(GL_MODELVIEW); //Réinitialiser la matrice actuellement spécifiée sur la matrice d'identité glLoadIdentity;end;procedure TForm1.FormDestroy(Sender: TObject);begin wglMakeCurrent(FDC, FHRC); FHRC ); ReleaseDC (Poignée, FDC); fin; procédure TForm1.FormPaint(Sender: TObject);begin Draw;end;procedure TForm1.FormResize(Sender: TObject);begin //Respécifie la zone de dessin lorsque la fenêtre change de taille glClearColor(0, 0, 0, 0); ) ; glLoadIdentity; glViewPort(0, 0, ClientWidth, ClientHeight); gluOrtho2D(0, ClientWidth, ClientHeight, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity;end;end.
Cliquez ici pour télécharger le code complet