MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
Bonjour et merci le montagnard,
J'ai importé dlgopengl. Ca me pose un problème car quand je crée la forme par
Dans l'execution, il n'accepte pas la ligne "RC:=wglCreateContext(DC);"DC:=GetDC(batdisgnfrm.perspanel.Handle);
SetupPixelFormat(DC);
RC:=wglCreateContext(DC); //makes OpenGL window out of DC
wglMakeCurrent(DC, RC); //makes OpenGL window active
GLInit; //initialize vue projection ...OpenGL
La valeur de DC est très élevée et il bloque.
Ca ne se passait pas avec l'opengl que j'avais.
Merci d'avance,
Fred
Pardon,
C'est "glmatrixmode(GL_PROJECTION) qu'il n'accepte pas.
Il s'arrète avec une exception
salut
pour @sergio ... sur les dernieres version je ne sais pas ... ont il fait evoluer l'unité pour cela il faudrais que j'ai les sources, je n'ai pas les moyens
de m'acheter la version avec les sources ...
pour @AlfredKr il nous est difficile de repondre sans voir le debut d'une esquise d'un bout de code
l'openg gl est il bien initialisé quand tu fait appel àcette fonction ne devrais etre appeller quand dans la methode onpaint de ton element fenêtré
Code : Sélectionner tout - Visualiser dans une fenêtre à part glmatrixmode(GL_PROJECTION)
d'apres ce que j'ai vu c'est celle d'un panel
Blaise PascalNous souhaitons la vérité et nous trouvons qu'incertitude. [...]
Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
PS : n'oubliez pas le tag
Avec l’opengl initial ça fonctionnait parfaitement.
Est-ce que cette instruction réagit différemment avec les 2 «*OpenGL*» ?
Théoriquement, si après cette instruction j’écris [EDIT] «*glloadidentitymatrixGlloadidentity il ne peut pas y avoir un débordement du stack car cette dernière instruction réinitialise la pile de projection.
Je vais essayer d’enlever ce couple d’instructions.
Je passe souvent par ces instructions car dans mon programme l’utilisateur modifie les position, direction et le Near du glulookat.
Concernant l’utilisation du panel,je me suis aperçu que le dessin 3D sur un paintbox ne fonctionne pas.
Le programme fonctionne sans faute avec l’opengl original
Merci
Cordialement
Fred
salut
tu n'utiliserais pas glLoadIdentity entre un glBegin et un glEnd ?
ceci declenche un GL_INVALID_OPERATION
La fonction glLoadIdentity remplace la matrice actuelle par la matrice unitaire
Blaise PascalNous souhaitons la vérité et nous trouvons qu'incertitude. [...]
Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
PS : n'oubliez pas le tag
Non, non,
je l'utilise juste après chaque glmatrixmode pour l'initialiser.
L'erreur arrive sur la ligne de glloadidentity (ACCES VIOLATION)
Questions :
Faut-il rappeler le couple glmatrixmode(GL_PROJECTION)/glidentity avant un glulookat ou un glfrustum ?
Pourquoi le programme fonctionne vraiment très bien avec l'ancien opengl ?
parceque l'ancienne unité contient une section d'initialisation, il suffit de l'ajouter dans le Uses avec les autres (de préférence avant) ou d'ajouter ce code dans ton projet avec System.Math
EDIT: dans les derniers Delphi il y a une unité complémentaire Winapi.OpenGLext
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 begin SetExceptionMask([exInvalidOp..exPrecision]); end.
Bonjour Mr TOTH,
Merci pour votre réponse.
D'abord voici quelques détails:
- J'ai delphi XE5 pro.
- Je travaille avec un portable PC dont l'écran est un 12.5".
- Jusqu'à aujourd'hui, dans mon programme c'était une plateforme 64 b. En modifiant en 32 b, l'erreur fatale ne se produit pas au même endroit.
- La surface dans laquelle est dessiné l'objet en perspective (un bâtiment) en 3D est un panel. Je ne voulais pas utiliser une forme entière lui étant dévouée parce que je voulais placer un écran paintbox auxiliaire qui me permettait de modifier les position, focale et direction de la caméra. En dynamique j'avais le bâtiment qui se déplaçait automatiquement. Tout ceci fonctionne et fonctionnait à merveille avec l'opengl de base inclus dans le delphi que j'ai acheté il y a plus de 5 ans à sa sortie.
J'ai opté pour un panel car ça ne passait pas avec un paintbox. Je ne sais pas pourquoi.
Je n'ai pas encore essayé de dessiner dans une forme annexe avec le nouveau dglopengl.
Ca a l'air de bloquer à ou après l'initialisation de prise en main de l'écran.
Voici la procédure:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 procedure GLInit; const light0_position:TGLArrayf4=( 0.0, 5.0, 5.0, 1.0); ambient: TGLArrayf4=( 0.98, 0.878, 0.478, 1.0); var stri : string; begin SetExceptionMask([exInvalidOp..exPrecision]); glMatrixMode(GL_PROJECTION); glLoadIdentity; with batdisgnfrm.perspanel do glFrustum(-xfrustum, xfrustum, -xfrustum * height / width, xfrustum * height / width, poseecran, 12000.0); // glFrustum(-1.0, 1.0, -1.0, 1.0, poseecran, 12000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity; glEnable(GL_DEPTH_TEST); glclearcolor(0.0, 0.0, 0.0, 1.0); // glclearcolor(0.149, 0.490, 0.929, 1.0); // ciel glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0, GL_POSITION, @light0_position); glLightfv(GL_LIGHT0, GL_AMBIENT, @ambient); glEnable(GL_LIGHT0); gldisable(GL_LIGHTING); // stri := glgetstring(GL_VERSION); // showmessage(stri); end;Glinit est appelé par formcreate et une autre fois quand je modifie glulookat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 procedure Tbatdisgnfrm.FormCreate(Sender: TObject); begin DC:=GetDC(batdisgnfrm.perspanel.Handle); SetupPixelFormat(DC); RC:=wglCreateContext(DC); wglMakeCurrent(DC, RC); GLInit; end;
Votre "setexception..." n'a pas résolu le problème. Je l'avais placé au début
Voilà.
N'hesitez pas à me proposer d'autres investigations si nécessaire.
Est-ce que votre openglext serait plus sûr pour mon cas ?
Merci encore
cordialement
Fred
Voici un dessin de la form en exe
salut
quelque petites question
dans ton setupPixelFormat tu fait bien un truc de ce genre là ?
Quelle type de valeur est DC ? THandle,integer,... ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 var nPixelFormat: Integer; pfd: TPIXELFORMATDESCRIPTOR; Begin Result := False; FillChar(pfd, SizeOf(TPIXELFORMATDESCRIPTOR),0); pfd.nSize := sizeof(TPixelFormatDescriptor); // Size of this structure pfd.nVersion := 1; // Version number pfd.dwFlags := PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType := PFD_TYPE_RGBA; // RGBA pixel values pfd.cColorBits := 24; pfd.cDepthBits := 24; pfd.iLayerType:= PFD_MAIN_PLANE; // Layer type SetLastError(0); // on remet les erreurs a zero nPixelFormat := ChoosePixelFormat(GlMemDC, @pfd); If nPixelFormat <> 0 then Begin if not SetPixelFormat(GlMemDC, nPixelFormat, @pfd) then raise Exception.CreateFmt('Unable to Set Pixel Format %d ', [getlasterror]); end else raise Exception.CreateFmt(''Unable to Pick Pixel Format %d ', [getlasterror]); Result := true;
D'apres ce que tu dis
cela ressemble fortement a un soucis d'étendu(changement de type)- Jusqu'à aujourd'hui, dans mon programme c'était une plateforme 64 b. En modifiant en 32 b, l'erreur fatale ne se produit pas au même endroit.
tu n'utiliserais pas des Extended dans ton code ?
cecin'a besoin d'etre appelé qu'une seul fois
Code : Sélectionner tout - Visualiser dans une fenêtre à part SetExceptionMask([exInvalidOp..exPrecision]);
c'est pour "trapper les erreur mathematique due aux nombres reel"
de plus si tu veut utiliser un tpanel il faut que tu accede a son canvas pour ce faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 TPanel = class(ExtCtrls.TPanel) public property Canvas; // TPanel contient un canvas qu'il faut publié! end;
Blaise PascalNous souhaitons la vérité et nous trouvons qu'incertitude. [...]
Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
PS : n'oubliez pas le tag
j'ai voulu tester ton code mais il manque la moitié des choses
sinon j'aime bien utiliser un TFrame pour OpenGL
https://www.developpez.net/forums/d1...ame-plusieurs/
Bonjour,
Je vais essayer de répondre le plus clairement possible et si possible à toutes tes interrogations.
D'abord, j'avais oublié de mentionner que j'utilise des "double" pour des glfloatf, en toute rigueur je devrai utiliser des Simple.
Bon, voici mes réponses.
- ça ne me dérangerait pas de remplacer le panel par un frame. Comme ça marchait avec opengl, tu penses bien que j'ai utilisé le handle du panel et la bonne unité pour le DC.
Je te communique les codes
Voici les déclarations de DC et RC:
Voici ce qui manquait concernant la partie opengl
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 DC:HDC; RC:HGLRC;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 procedure setupPixelFormat(DC:HDC); const pfd:TPIXELFORMATDESCRIPTOR = ( nSize:sizeof(TPIXELFORMATDESCRIPTOR); // size nVersion:1; // version dwFlags:PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // support double-buffering iPixelType:PFD_TYPE_RGBA; // color type cColorBits:24; // preferred color depth cRedBits:0; cRedShift:0; // color bits (ignored) cGreenBits:0; cGreenShift:0; cBlueBits:0; cBlueShift:0; cAlphaBits:0; cAlphaShift:0; // no alpha buffer cAccumBits: 0; cAccumRedBits: 0; // no accumulation buffer, cAccumGreenBits: 0; // accum bits (ignored) cAccumBlueBits: 0; cAccumAlphaBits: 0; cDepthBits:16; // depth buffer cStencilBits:0; // no stencil buffer cAuxBuffers:0; // no auxiliary buffers iLayerType:PFD_MAIN_PLANE; // main layer bReserved: 0; dwLayerMask: 0; dwVisibleMask: 0; dwDamageMask: 0; ); var pixelFormat:integer; begin pixelFormat := ChoosePixelFormat(DC, @pfd); if (pixelFormat = 0) then exit; if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE) then exit; end;procédures
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 procedure GLInit; const light0_position:TGLArrayf4=( 0.0, 5.0, 5.0, 1.0); ambient: TGLArrayf4=( 0.98, 0.878, 0.478, 1.0); var stri : string; begin SetExceptionMask([exInvalidOp..exPrecision]); glMatrixMode(GL_PROJECTION); glLoadIdentity; with batdisgnfrm.perspanel do glFrustum(-xfrustum, xfrustum, -xfrustum * height / width, xfrustum * height / width, poseecran, 12000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity; glEnable(GL_DEPTH_TEST); glclearcolor(0.0, 0.0, 0.0, 1.0); glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0, GL_POSITION, @light0_position); glLightfv(GL_LIGHT0, GL_AMBIENT, @ambient); glEnable(GL_LIGHT0); gldisable(GL_LIGHTING); end;
La procédure draw met dans le buffer du pipeline tous les éléments du bâtiment et l'envoie dans le panel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure Tbatdisgnfrm.FormDestroy(Sender: TObject); begin wglmakecurrent(dc,0); wgldeletecontext(RC); end; procedure Tbatdisgnfrm.FormPaint(Sender: TObject); begin glinit; draw; end;
Pour anapurna:
C'est vrai que dans pixelformatdescriptor je ne gère pas les erreurs.
Je pourrai le faire.
Je n'utilise jamais d'Extended.
Les autres feuilles de cette forme m'aident à créer et positionner les poteaux et voiles sous chaque plancher. Ensuite j'effectue une analyse temporelle du bâtiment ainsi créé durant un séisme horizontal.
Cordialement,
Fred
euh...dans OpenGL toutes les fonctions qui se terminent pas "f" (float) attendent des Single, et celles qui se terminent pas "d" (double) des Double...et on peut avoir les deux comme glVertex3f ou glVertex3d
il y a tout de même un défaut dans ta logique puisque tu dessines dans le Handle du Panel sur le OnPaint de la fiche qui possède son propre Handle, ça peut fonctionner mais ce n'est pas logique. Si tu regardes mon code de TGLFrame je surcharge les méthodes adaptée aux besoins.
Bonjour Paul et Anapurna,
D'abord avec mon delphi XE5 pro je n'ai pas de Tframe. Comment l'obtenir ?
Le programme bloque à la création de la form à l'instruction "RC:=wglCreateContext(DC)"
Question à Anapurna:
Est-ce que dglopengl est valable avec delphi XE5 pro ?
Dans dglopengl.pas, la fonction createrenderingcontext regroupe toutes les fonctions de l'écran 3D->2D.
Le PFD et la création du context.
Peut-être que dans le formcreate il faut seulement écrire DC:=GetDC(batdisgnfrm.perspanel.Handle) et ensuite appeler createrenderingcontext qui, aussi, remplacera cette fonction.
J'ai essayé et obtiens toujours l'erreur !!!
Cordialement,
Fred
Hourrah !!!!Hourrah !!!
J'ai trouvé la solution à mon problème.
Avec dglopengl il faut ce formcreate :
Avec ça, ca fonctionne, je l'espère comme avant ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 procedure Tbatdisgnfrm.FormCreate(Sender: TObject); var opt : TRCoptions; begin InitOpenGL; DC:=GetDC(batdisgnfrm.perspanel.Handle); opt := [opDoubleBuffered]; RC := CreateRenderingContext(DC, opt, 24, 24,0, 0, 0, 0); SetupPixelFormat(DC); ActivateRenderingContext(DC, RC); GLInit; end;
Bonnes fêtes de Pâques
Fred
J'ai oublié de mentionner que la réponse était dans le site ("ici") de chargement de dglopengl.pas communiqué par Anapurna.
Le code suivant qui m'a aidé se trouve dans dglopengl.html.
Soit
Merci encore à vous 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 procedure MyGLInit; begin InitOpenGL; // Don't forget, or first gl-Call will result in an access violation! MyDC := GetDC(...); MyRC := CreateRenderingContext(...); ActivateRenderingContext(MyDC, MyRC); // Necessary, will also read some extension ... end; // After doing the above initialisation, you're ready to use all OpenGL-Functions and extensions your card supports. And also don't forget to release your context properly when exiting : procedure MyDeInit; begin DeactivateRenderingContext; // Deactivates the current context wglDeleteContext(myRC); ReleaseDC(Handle, myDC); end;
Paul TOTH et Anapurna
Fred
Bonjour,
J'ai relancé cette discussion parce qu'en l'indiquant comme résolue et comme la finalité se trouve en 2ème feuillet, le lecteur intéressé n'aurait pas vu le résultat final.
Cordialement,
Fred
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager