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

Aktuelle Zeit: Mo Jul 14, 2025 04:48

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: OpenGL auf Panel / Image ?
BeitragVerfasst: Sa Nov 13, 2004 12:49 
Offline
DGL Member

Registriert: Mo Nov 01, 2004 10:49
Beiträge: 14
Wohnort: Schönebeck
Hi Leute, ich brauche gerade eine etwas andere Variante der OpenGL Iniialisierung.
Ich erzeige mit Delphi ein Formular und habe darauf eine Komponente.
Ich würde jetzt gerne die OpenGL Szene nur auf dieser Komponente darstellen,
damit das restliche Formular noch für den Rest des Leveleditors genutzt werden kann.

Ich habe es zunächst mit einem Panel versucht, aber für die Lösung, die ich im DF gefunden habe,
braucht die Komponente ein Canvas und Handle.
Leider hat ein Image wider kein Handle :(

Code:
  1.  
  2. procedure SetDCPixelFormat(Handle: HDC);
  3. var
  4.   [...]
  5. begin
  6.   [...]
  7.   SetPixelFormat(Handle, nPixelFormat, @pfd);
  8. end;
  9.  
  10. procedure TForm1.FormCreate(Sender: TObject);
  11. begin
  12.   DC := GetDC(Form1.Handle);
  13.   SetDCPixelFormat(Form1.Canvas.Handle);
  14.   hrc := wglCreateContext(Form1.Canvas.Handle);
  15. end;
  16.  


Eigentlich möchte ich das genau so machen, aber ich finde halt keine Komponente,
die Canvas und Handle hat.
Vielleicht könnt ihr mir irgendwie helfen.
Danke
Sebastian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 13, 2004 12:57 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Nimm anstelle des Form Handles das Handle des Panels und hole von dem Panel Handle mit GetDC das DC dann.

DC := GetDC(Form1.Panel1.Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 13, 2004 12:59 
Offline
DGL Member

Registriert: Mo Nov 01, 2004 10:49
Beiträge: 14
Wohnort: Schönebeck
Das funktioniert nicht.
Ich brauche irgendwie was mit dem Canvas, wie bei meinem Beispiel.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 13, 2004 13:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Was willst du denn dann überhaupt mit dem Canvas machen? Der wird doch durch das OpenGL-Rendering eh unbrauchbar. Wenn du das trotzdem brauchst. Und ausserdem hat ein Canvas doch nen Handle.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 13, 2004 13:12 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Kann sein, dass ich mich irre. Aber bekam mein das Handle vom Canvas nicht mit Canvas.Handle? :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 13, 2004 13:15 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Das Canvas Handle ist ein DC, der TCanvas kapselt ja ein DC, während das Handle eines Panel ein Fenster Handle ist. Soweit ich das mal ausprobiert haben, funktioniert OpenGL nicht mit dem Handle eines normalen Canvas, sondern nur wenn man das DC extra mit GetDC erzeugt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 13, 2004 13:20 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Bilder sagen mehr als Worte:


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 13, 2004 13:25 
Offline
DGL Member

Registriert: Mo Nov 01, 2004 10:49
Beiträge: 14
Wohnort: Schönebeck
Also ich habe jetzt das ganze mit dem OpenGL 1.5 Template versucht, da geht es.
Aber mit meiner Version nicht (1.2).
Liegt sicher aber an meiner Vorlage :(
Ich wollte einfach mal versuchen, ob das auch mit dem Code aus dem DF geht:
http://www.delphi-forum.de/topic_Wie+be ... hi_72.html
Der erste Sourcecode lädt das auf das ganze Formular.
Und das wollte ich jetzt so umstellen, dass es nur auf ein Panel geladen wird.
Ihr könnt den Code ja mal kopieren und dann Panel einsetzen und so wir ihr meint veändern.
Bei mir geht das nicht.
Ich bin doch ziemlich neu in OpenGL deshalb will ich keinen Mist erzählen.
Schaut euch das Beispiel mal an. Ich weiss net, warum man da einen Canvas braucht.

Ach ja: Das ein Form ein Handle hat und dass der / das Canvas von dem Form dann auch ein Handle hat wusste ich.
Genau darum geht es ja bei dem Beispiel. Wenn ein Objekt Handle und Canvas hat geht es.
Aber ein Panel hat nur den Handle und kein Canvas.
Und das Image hat zwar Canvas, aber das Image selber keinen Handle.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 01, 2005 11:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Ich hab das auch mal mit nem Panel ausprobiert.
Bei mir klappts (benutze auch OpenGl 1.5).

Du schreibst einfach bei Init-Procedure rein:

DC := GetDC(Form1.Panel1.Handle);
SetDCPixelFormat(Form1.Panel1.Handle);
hrc := wglCreateContext(Form1.Panel1.Handle);

musste halt ausprobieren!

Schreibst einfach überall wo 'Form1.handle' steht,
'Form1.Panel1.handle' rein, und dann müsste es funktionieren! :wink:

pheasant

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 01, 2005 14:48 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
Probier es mal so:

Code:
  1. var
  2.   RC: HGLRC;
  3.   DC: HDC;
  4.   StartTick : Cardinal;
  5.  
  6. procedure TForm1.FormCreate(Sender: TObject);
  7. begin
  8. // Wenn gewollt, dann hier in den Vollbildmodus wechseln
  9. // Muss vorm Erstellen des Kontextes geschehen, da durch den Wechsel der
  10. // Gerätekontext ungültig wird!
  11.  
  12. // OpenGL-Funtionen initialisieren
  13. InitOpenGL;
  14. // Gerätekontext holen
  15. DC := GetDC(Panel1.Handle);
  16. // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  17. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  18. // Erstellten Renderkontext aktivieren
  19. ActivateRenderingContext(DC, RC);
  20. // Tiefenpuffer aktivieren
  21. glEnable(GL_DEPTH_TEST);
  22.  
  23. // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) \"durchlassen\"
  24. glDepthFunc(GL_LESS);
  25. // Löschfarbe für Farbpuffer setzen
  26. glClearColor(0,0,0,0);
  27. // Zeitpunkt des Programmstarts für FPS-Messung speichern
  28. StartTick := GetTickCount;
  29. end;
  30.  
  31. procedure TForm1.Destroy(Sender:TObject);
  32. begin
  33. // Renderkontext deaktiveren
  34. DeactivateRenderingContext;
  35. // Renderkontext \"befreien\"
  36. wglDeleteContext(RC);
  37. // Erhaltenen Gerätekontext auch wieder freigeben
  38. ReleaseDC(Handle, DC);
  39. // Falls wir im Vollbild sind, Bildschirmmodus wieder zurücksetzen
  40. ChangeDisplaySettings(devmode(nil^), 0);
  41. end;
  42.  
  43. // Idle-Prozedur in ein ApplicationEvents
  44.  
  45. procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
  46.   var Done: Boolean);
  47. begin
  48. // In die Projektionsmatrix wechseln
  49. glMatrixMode(GL_PROJECTION);
  50. // Identitätsmatrix laden
  51. glLoadIdentity;
  52. // Viewport an Clientareal des Fensters anpassen
  53. glViewPort(0, 0,Panel1.Width, Panel1.Height);
  54. // Perspective, FOV und Tiefenreichweite setzen
  55. gluPerspective(60, Panel1.Width/Panel1.Height, 1, 128);
  56. // In die Modelansichtsmatrix wechseln
  57. glMatrixMode(GL_MODELVIEW);
  58. // Identitätsmatrix laden
  59. glLoadIdentity;
  60. // Farb- und Tiefenpuffer löschen
  61. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  62.  
  63. // <-- Hier kommen die Befehle rein
  64.  
  65. // Hinteren Puffer nach vorne bringen
  66. SwapBuffers(DC);
  67. end;


Muss gehen (also bei mir gings ;))


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 22, 2005 12:41 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
LH_Freak hat geschrieben:
Muss gehen (also bei mir gings ;))

Funktioniert, wenn man noch ein GluLookAt reinschiebt und die Kamera richtig setzt.

Beispiel:
Code:
  1.  
  2. gluLookAt(0,0,10,
  3.           0,0,0,
  4.           0,1,0);
  5.  


Gruß

Wolf

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]