Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 00:32

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: OpenGL auf Panel ausgeben
BeitragVerfasst: Do Dez 02, 2004 11:11 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Aug 29, 2003 16:34
Beiträge: 34
Wohnort: Black Forrest
Hallo Leutz,

ich hatte zwar alle Tutorials durchgelesen und die Beispiel Source haben auch funktioniert. Nun wollte ich bei meinen eigenen Projekt einfach ein Grafik Ausgabe (Open GL) einbauen.
Zunächst mal wollte ich testen ob es überhaupt funktionieren wird. Da ich es auf einen Panel anzeigen wollte. Oder ist das nicht der richtige Weg ?

Also im Var habe ich die beiden eingebaut
Code:
  1.  
  2.   MyDC: HDC;
  3.   MyRC: HGLRC;
  4.  


Dann habe ich die beiden Proceduren:
Code:
  1.  
  2. {--------------------------------------------------------------
  3.      Procedure: MyGLInit
  4.   Beschreibung: Init OpenGL
  5. ---------------------------------------------------------------}
  6. procedure MyGLInit;
  7. begin
  8. InitOpenGL; // Don't forget, or first gl-Call will result in an access violation!
  9. MyDC := GetDC(Form1.Panel2.Handle);
  10. MyRC := CreateRenderingContext(MyDC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  11. ActivateRenderingContext(MyDC, MyRC); // Necessary, will also read some extension
  12.  
  13. end;
  14.  
  15. {--------------------------------------------------------------
  16.      Procedure: MyDeInit
  17.   Beschreibung: OpenGL schliessen (wenn Programm beendet wird)
  18. ---------------------------------------------------------------}
  19. procedure MyDeInit;
  20. begin
  21. DeactivateRenderingContext; // Deactivates the current context
  22. wglDeleteContext(myRC);
  23. ReleaseDC(Form1.Panel2.Handle, myDC);
  24. end;
  25.  


Beim Form.Create rufe ich MyGLInit auf.
Und beim Form.Close rufe ich dieses auf MyDeInit


Und um zu testen (sieht sicher verwirrt aus weil so gemixt ist. hatte halt verschiedenes ausprobiert) rufe ich diese Procedure bei ButtonClick auf um zu sehen ob was passiert.
Code:
  1.  
  2. procedure TForm1.Button1Click(Sender: TObject);
  3. begin
  4.   glEnable(GL_TEXTURE_2D);
  5.   glMatrixMode(GL_PROJECTION);
  6.   glLoadIdentity;
  7.   glViewport(0,0,ClientWidth,ClientHeight);
  8.   glOrtho(0,640,0,480, 0,128);
  9.  
  10.  
  11.   glBegin(GL_TRIANGLES);
  12.     glVertex3f(-1.0,-1.0, 0.0);
  13.     glVertex3f( 0.0, 1.0, 0.0);
  14.     glVertex3f( 1.0,-1.0, 0.0);
  15.   glEnd();
  16.  
  17.   glBegin(GL_TRIANGLES);
  18.     glColor3f(1,0,0);
  19.     glVertex3f(-1.0,-1.0, 0.0);
  20.     glColor3f(0,1,0);
  21.     glVertex3f( 0.0, 1.0, 0.0);
  22.     glColor3f(0,0,1);
  23.     glVertex3f( 1.0,-1.0, 0.0);
  24.   glEnd();
  25.  
  26. end;
  27.  

Aber es gibt zwar keine Fehler aus, nur es passiert nix. Daher denke ich mal ich liege hier irgendwo falsch oder habe was vergessen. Könnte mir einer helfen wie man das auf einer Panel ausgeben kann ? Danke euch.


[/code]

_________________
Mfg [-Darty-]
- Gehörlose Delphianer gibt es selten -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 02, 2004 14:14 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Lass mal das Ergebnis von InitOpenGL in ne Boolean schreiben. Dann kannst du nachgucken, ob InitOpenGL überhaupt funktioniert. (Bool := InitOpenGL)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 02, 2004 14:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wo ist denn dein SwapBuffers(DC) ? Ohne dass bleibt der gerenderte Pufferinhalt im hinteren Puffer und ist natürlich nicht sichtbar.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 03, 2004 09:18 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Aug 29, 2003 16:34
Beiträge: 34
Wohnort: Black Forrest
Flash hat geschrieben:
Lass mal das Ergebnis von InitOpenGL in ne Boolean schreiben. Dann kannst du nachgucken, ob InitOpenGL überhaupt funktioniert. (Bool := InitOpenGL)

Also ich hatte am Ende der KlickProzedur dies
Code:
  1.   Edit1.Text := BoolToStr(InitOpenGl);
und als Rückgabewert ist -1 was laut OH True bedeutet. Also müsste es in Ordnung sein.

_________________
Mfg [-Darty-]
- Gehörlose Delphianer gibt es selten -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 03, 2004 09:20 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Aug 29, 2003 16:34
Beiträge: 34
Wohnort: Black Forrest
Sascha Willems hat geschrieben:
Wo ist denn dein SwapBuffers(DC) ? Ohne dass bleibt der gerenderte Pufferinhalt im hinteren Puffer und ist natürlich nicht sichtbar.
Also als ich am Ende
Code:
  1.   SwapBuffers(MyDC);
hinnzugemacht habe dann passiert endlich etwas. Nur ... sieht es so aus wie ein Art abgestürztes WirrWarr Grafik bei einen Spiel. Weiss nicht wie ich es beschreiben soll auf jedenfalls denke ich fehlen mir noch befehle das der Puffer zuerst geleert wird oder ähnliches. Müsste ich jetzt noch mal suchen. Aber falls Problem bekannt ist wäre schön wenn einer es sagen könnte. Danke schon mal.

_________________
Mfg [-Darty-]
- Gehörlose Delphianer gibt es selten -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 03, 2004 10:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das ist kein Problem, sondern normal. Wenn du die Puffer nicht explizit leerst (was oben nicht getan wird), dann ist deren Inhalt undefiniert, also oft "Grafik-Wirr-Warr".

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 03, 2004 14:02 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Aug 29, 2003 16:34
Beiträge: 34
Wohnort: Black Forrest
mit dieser Code
Code:
  1. procedure TForm1.Zeichnen();
  2. begin
  3.   // In die Projektionsmatrix wechseln
  4.   glMatrixMode(GL_PROJECTION);
  5.   // Identitätsmatrix laden
  6.   glLoadIdentity;
  7.   // Viewport an Clientareal des Fensters anpassen
  8.   glViewPort(0, 0, ClientWidth, ClientHeight);
  9.   // Perspective, FOV und Tiefenreichweite setzen
  10.   gluPerspective(60, Panel2.Width/Panel2.Height, 1, 128);
  11.   // In die Modelansichtsmatrix wechseln
  12.   glMatrixMode(GL_MODELVIEW);
  13.   // Identitätsmatrix laden
  14.   glLoadIdentity;
  15.   // Farb- und Tiefenpuffer löschen
  16.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  17.  
  18.   glTranslatef(-5.0,-5.0,-25);
  19.   glBegin(GL_QUADS);
  20.     glVertex3f(0.0, 0.0, 0.0);
  21.     glVertex3f(10.0, 0.0, 0.0);
  22.     glVertex3f(10.0, 10.0, 0.0);
  23.     glVertex3f(0.0, 10.0, 0.0);
  24.   glEnd();
  25.   // Hinteren Puffer nach vorne bringen
  26.   SwapBuffers(MyDC);
  27. end;
klappts nun ...
Mich wunderts nur das ich die Procedure zwar beim Klick ausführe funzt. Aber bei Form Create oder Rezise funktioniert es nicht. Mit Idle dagegen schon. Aber es flackert dabei ? Kann man da was dagegen tun ?

_________________
Mfg [-Darty-]
- Gehörlose Delphianer gibt es selten -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 03, 2004 14:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Doublebuffering aktivieren (siehe auch unsere Tutorials). Im Create kanns ja kaum klappen, da danach deine Form neugezeichnet und somit der Frontpuffer überschrieben wird. Aber das sind OpenGL-Basics die in unseren Tuts geklärt werden.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 03, 2004 15:06 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja...da du die Initialisierung ja schon fast geschafft hast, wärs absolut richtig mal die Tuts hier durchzuarbeiten. Das Tut.1 beschägtigt sich nochmal mit der Initialisierung.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 07, 2004 17:52 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Aug 29, 2003 16:34
Beiträge: 34
Wohnort: Black Forrest
Ja ich danke euch für euer Hilfe. Mir fällt nur auf das es sich auf ein Win2000 anders verhält als auf einen XP beim Resizen vom Form. Aber das muss ich mir erst mal genauer angucken.
Thx nochnmals..

_________________
Mfg [-Darty-]
- Gehörlose Delphianer gibt es selten -


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.016s | 15 Queries | GZIP : On ]