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

Aktuelle Zeit: Fr Jul 18, 2025 00:22

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Initialisieren *seuftz*
BeitragVerfasst: So Aug 15, 2004 22:49 
Offline
DGL Member

Registriert: So Aug 15, 2004 17:51
Beiträge: 13
Im Voraus: ich weiss dass das jetzt nach ganz schön viel Code aussieht aber ich hab wirklich schon alles probiert und es will GARNICHTS tun - ich weiss was es für Arbeit macht, fremden Code durchzugehn und entschuldige mich hiermit förmlichst, dass ich es wage, euch das anzutun

Ich schätze mal das Thema wurde hier schon 100mal gestellt, da es aber in 90% der Fälle ein anderer Fehler ist wird mir hier die Suchfunktion wohl nix nutzen ^^

Wenn ich mein Panel initialisiere und dann zeichne passiert nämlich GAR NICHTS - und nachdem ich jetzt den ganzen tag mit rumexperimentieren verbracht habe denke ich mal es is einer der Fehler die man als laie nicht findet, die ihr aber hoffentlich sofort seht ;)

ich poste hier jetzt mal grosse teile des programmes aber schön unterteilt, damit jeder da jagen kann wo er seiner Erfahrung nach am meisten findet ;)

ich habe das ganze als Thread am laufen, der sieht folgendermassen aus (glaube hier mal nicht an Fehler, aber sicher is sicher)


Code:
  1.  
  2. procedure TOGLThread.Execute;
  3. begin
  4.   Initialize;
  5.   while (not Terminated) do begin
  6.     try
  7.       wglMakeCurrent(h_DC, h_rc);
  8.       Render;
  9.       wglMakeCurrent(0, 0);
  10.     except on e: exception do
  11.       begin
  12.       ShowMessage(e.Message);
  13.       break;
  14.       end;
  15.     end;
  16.   end;
  17.   Term;
  18. end;
  19.  


äh ja, und in nem Form.Create starte ich den Thread dann

Code:
  1.  
  2.   Thread:=TOGLThread.Create(true);
  3.   Thread.PParent := @Panel1;
  4.   Thread.FreeOnTerminate := True;
  5.   Thread.Resume;
  6.  



Initialisiert wird das ganze also in Init - hier eine wunderschöne Code-Schlange, zu grossen Teilen Copy & paste aus dem DGL-SDK 8nachdem ichs mit 3 Tuts abgetippt hatte und nix funzte wars mir zu blöd)

Code:
  1.  
  2. procedure TOGLThread.Initialize;
  3. var
  4.   PixelFormat : GLuint;
  5.   pfd : TPIXELFORMATDESCRIPTOR;
  6.  
  7. begin
  8.   if init then exit;
  9.  
  10.   h_DC := GetDC(PParent^.Handle);
  11.  
  12.   with pfd do
  13.   begin
  14.     nSize           := SizeOf(TPIXELFORMATDESCRIPTOR); // Größe des Pixel Format Descriptor
  15.     nVersion        := 1;                    // Version des Daten Structs
  16.     dwFlags         := PFD_DRAW_TO_WINDOW    // Buffer erlaubt zeichenen auf Fenster
  17.                        or PFD_SUPPORT_OPENGL // Buffer unterstützt OpenGL drawing
  18.                        or PFD_DOUBLEBUFFER;  // Double Buffering benutzen
  19.     iPixelType      := PFD_TYPE_RGBA;        // RGBA Farbformat
  20.     cColorBits      := 24;                   // OpenGL Farbtiefe
  21.     cRedBits        := 0;
  22.     cRedShift       := 0;
  23.     cGreenBits      := 0;
  24.     cGreenShift     := 0;
  25.     cBlueBits       := 0;
  26.     cBlueShift      := 0;
  27.     cAlphaBits      := 0;                    // Not supported
  28.     cAlphaShift     := 0;                    // Not supported
  29.     cAccumBits      := 0;                    // Kein Accumulation Buffer
  30.     cAccumRedBits   := 0;
  31.     cAccumGreenBits := 0;
  32.     cAccumBlueBits  := 0;
  33.     cAccumAlphaBits := 0;
  34.     cDepthBits      := 16;                   // Genauigkeit des Depht-Buffers
  35.     cStencilBits    := 0;                    // Stencil Buffer ausschalten
  36.     cAuxBuffers     := 0;                    // Not supported
  37.     iLayerType      := PFD_MAIN_PLANE;       // Wird Ignoriert!
  38.     bReserved       := 0;                    // Anzahl der Overlay und Underlay Planes
  39.     dwLayerMask     := 0;                    // Wird Ignoriert!
  40.     dwVisibleMask   := 0;                  
  41.     dwDamageMask    := 0;                    // Wird Ignoriert!
  42.   end;
  43.  
  44.   PixelFormat := ChoosePixelFormat(h_DC, @pfd);
  45.   SetPixelFormat(h_DC, PixelFormat, @pfd);
  46.  
  47.   h_RC := wglCreateContext(h_DC);
  48.  
  49.  
  50.   PParent^.OnResize := oresize;
  51.  
  52.   oresize(nil);
  53.  
  54.   init := true;
  55. end;
  56.  


OResize, meine OnResize-Prozedur (wie passend ^^)
achtung, was den Part hier angeht bin ich am unsichersten, vielleicht ist hier ja was
Code:
  1.  
  2. procedure TOGLThread.OResize(Sender: TObject);
  3. begin
  4.   wglMakeCurrent(h_DC, h_rc);
  5.   glViewport(0, 0, PParent^.Width, PParent^.Height);
  6.   glMatrixMode(GL_PROJECTION);
  7.   glLoadIdentity();
  8.   gluPerspective(45.0, PParent^.Width/PParent^.Height, 1.0, 100.0);
  9.   glMatrixMode(GL_MODELVIEW);
  10.   glLoadIdentity();
  11.   wglMakeCurrent(0,0);
  12. end;
  13.  


Render-prozedur:
Code:
  1.  
  2. procedure TOGLThread.Render;
  3. begin
  4.  
  5.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  6.  
  7.   glLoadIdentity;
  8.  
  9.   glBegin(GL_TRIANGLES);
  10.     [b]...[/b]
  11.   glEnd;
  12.  
  13.   glFlush();
  14.  
  15. end;
  16.  


und Term:

Code:
  1.  
  2. procedure TOGLThread.Term;
  3. begin
  4.   if not init then exit;
  5.   wGlMakecurrent(0,0);
  6.   wGlDeletecontext(h_RC);
  7.   ReleaseDC(PParent^.handle,h_DC);
  8.   init := false;
  9. end;
  10.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 06:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das ist ein Fehler den ich auch schon öfters gemacht habe. ;-)

Wo rufst du eigentlich dein SwapBuffers auf???

Noch eine kleine Anmerkung zum Thema Thread. Die Executemethode würde ich ein wenig anders gestalten.
In etwa so.
Code:
  1. procedure TOGLThread.Execute;
  2. begin
  3.   try
  4.     Initialize;
  5.     while (not Terminated) do begin
  6.       Render;
  7.       SwapBuffers(h_DC);
  8.     end;
  9.     Term;
  10.   except on e: exception do
  11.     begin
  12.     ShowMessage(e.Message);
  13.     break;
  14.     end;
  15.   end;
  16. end;


Das Init und Term muss deswegen noch mit in den try except block, da dort ja auch exceptions auftreten können. Und außerhalb von Delphi würde Windows deine komplette Anwendung abschießen. Das wglMakecurrent kannst du dir sparen, da der aktive Renderkontext an dem Thread gekoppelt wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 09:55 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Mir ist auch was aufgefallen, das wglMakeCurrent, sollte man nicht jedes mal aktivieren und deaktivieren, sondern nur einmal beim OpenGL Initialisieren aktivieren, und bei OnResize aktivieren.
Ansonsten erst deaktivieren wenns deaktiviert werden muss, zweiter renderkontext oder so.

Das zieh erheblich an der performance sofern man das nicht beachtet.

Was mri noch auffällt, wo setzt du deine Standard OpenGL Befehle beim Initialisieren ?
glClearColor(), glClear(); usw. ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 10:02 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Eventuell kannst du das Zeichnen ins OnIdle Event verlegen und dann auf den Thread verzichten. Dann wird auch ständig neu gezeichnet und man kann trotzdem noch die restliche Anwendunge bedienen, aber man geht den Schwierigkeiten bei Threads aus dem Weg.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 13:15 
Offline
DGL Member

Registriert: So Aug 15, 2004 17:51
Beiträge: 13
okay, danke schonmal für die mühe die ihr euch gemacht habt :)

Zitat:
Wo rufst du eigentlich dein SwapBuffers auf???


Tja, was SwapBuffers angeht, stand es 2:1 - in den Tutorials von Phoebus und Hanns Tappeiner wurde es mit keinem sterbenswörtchen erwähnt (bin ich mir zumindest ziemlich sicher), in dem von Mr_T wird es erwähnt - da Mr_T aber in der Minderheit war hab ichs weggelassen ^^

Das wglMakeCurrent werd ich wohl drinlassen müssen, da ich mir den Aufwand mit den Threads aus genau dem Grund gemacht habe, dass ich in der fertigen Software wohl 4 solcher panels haben werde :)

Zitat:
glClearColor(), glClear();

glClear: siehe Render-Prozedur
glClearColor: uuups, das hab ich in Phoebus' Tutorial glatt übersehen :(

Code:
  1. Phoebus, falls du das hier liest:
  2.  
  3. Bitte splitte dein Tut doch mal in zwei kleine auf, du vermischst da so oft API und OpenGL-Init, dass man da gerne mal was übersieht wenn man es wie ich mit ner andern Technik machen möchte. Ansonstn - spitzen-Tuts :)


OnIdle: das wird nur ausgelöst, wenn sich die Maus bewegt oder sonstwas (schon getestet), kommt deshalb weniger in Frage... und es würde wohl Verwirrung wegen mehrer Panels geben


Zuletzt geändert von Phryneas am Mo Aug 16, 2004 13:33, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 13:18 
Offline
DGL Member

Registriert: So Aug 15, 2004 17:51
Beiträge: 13
Anhang: tatsächlich, auch in Phoebus' Tut war SwapBuffers - nur halt leider wieder in der API drinne :(

Anhang2: hab jetzt nochmal Phoebus' API-Code durchwühlt und nochmals ein paar befehle gefunden, mit denen tuts es jetzt

:) :) :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 13:23 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Ich denke kaum, dass ich da etwas mit VCL vermische, da ich VCl gar nicht verwende ;)
Aber ist Dir schon aufgefallen, dass wir bei unseren Download komplett lauffähige Templates für API, VCL, SDL, mehre Kontexte etc haben? ;)

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 13:28 
Offline
DGL Member

Registriert: So Aug 15, 2004 17:51
Beiträge: 13
äh ich meinte mit API *ggg*

(man bist du schnell ^^)

naja, die benutzen dann aber schon wieder andere units als die openGL von Delphi, von denen ich dann schon nicht mehr wusste ob das jetzt einfach nur neuere Versionen davon sind oder völlig neue Komponenten ect. - und vor denen warnst du ja selber ;)

Zitat:
Eines sei noch beim Einsatz von Hilfs-Projekten gesagt: Man macht sich von anderen abhängig, da sich neue Header-Dateien meistens nicht direkt einbinden lassen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 14:10 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Das ist wahr. Einige unserer alten Beispiele verwenden die OpenGL1.2-Header von Lischke. Inzwischen bieten wir eigene Header an, die voll kompatibel sein sollte zu den "alten". In jedem Fall sei Dir drigend davon abgeraten die alten Borland-Header einzusetzen. Nimm am besten gleich die DGL-Header, damit solltest Du am wenigsten sorgen haben und es gibt auch gleich ne guten Support ;)
@schnell: nur die ersten zwei Mal, danach dauerts dann ne Ewigkeit ;)

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 15:53 
Offline
DGL Member

Registriert: So Aug 15, 2004 17:51
Beiträge: 13
d.h. die dglOpenGL statt der OpenGL nutzen?? (*ist verwirrt weil die irgendwie ... unvollständig ... ist - glTranslate ect.???*)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 16:33 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Nein, die ist gerade nicht unvollständig, sondern die von Borland sind schlichtweg falsch ;)
Schau mal einen Blick ins Wiki: http://wiki.delphigl.com/index.php/GlTranslate
dort siehst Du dann auch, dass der korrekte Funktionsname nach den Manpages "gltranslatef" ist. Borland hat das "f" einfach unterschlagen. Spätestens bei Texturen wirst Du dann feststellen, dass Du funktionen nachimplementieren musst, weil diese erst gar nicht in den Headern drinne sind oder das an einzigen Stellen Pointer erwartet werden, wo sie gar nicht hin sollen.
Zu der Thematik auch bitte den FAQ-Eintrag beachten und das Kommenatar in den Headern ansehen ;)
http://www.delphigl.com/forum/viewtopic.php?t=336

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 19:41 
Offline
DGL Member

Registriert: So Aug 15, 2004 17:51
Beiträge: 13
so, jetzt hab ich statt dem von Borland mal eure genommen aber das ergebnis überzeugt nicht so ganz - system crasht, anwendung lässt sich nur mit grossen mühen per taskmanager abschiessen (1 Mausklick hat ne Reaktionszeit von 30 sec)

Ansonsten is der Code 100% der selbe... - mir OpenGL statt dglOpenGL funktionierts problemlos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 20:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich hoffe du hast dir die mitkommende Readme durchgelesen, da steht drin was man beachten muss... (scheint so als würde da keiner reinschauen)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 20:31 
Offline
DGL Member

Registriert: So Aug 15, 2004 17:51
Beiträge: 13
naja, man installiert die SDK, klickt auf tutorials und hofft dann das alles was da drin steht so auch funktioniert ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 20:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dann schätze ich auch mal, dass du direkt nach dem Start deiner Anwendung auch kein InitOpenGL aufrufst, oder? Wenn dem so ist, dann sind deine Funktionspointer nämlich nicht initialisiert, und der erste Zugriff auf eine GL-Funktion endet mit einem Absturz.

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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.008s | 15 Queries | GZIP : On ]