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

Aktuelle Zeit: Fr Jul 25, 2025 04:58

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:
BeitragVerfasst: Fr Apr 18, 2003 17:59 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Hi,

ich zeige in einem Panel die Ausgaben von OpenGL an. Beim starten des Programmes wird dieses Panel komplett von der OpenGL - Ausgabe gefüllt. Nach einer Maximierung des Programmes wird es wie folgt dargestellt:

Bild

Ich habe zuerst gedacht, das ich ein Resize des Viewports vergessen habe, die Funktion wird aber aufgerufen.

Die Funktion ist wie folgt implementiert:

Code:
  1.  
  2. procedure TOGLWindow.ResizeWindow(Width, Height : Integer);
  3. begin
  4.   if (Height = 0) then begin           // prevent divide by zero exception
  5.     Height := 1;
  6.   end;
  7.  
  8.   fWidth  := Width;
  9.   fHeight := Height;
  10.  
  11.   glViewport(0, 0, Width, Height);   // Set the viewport for the OpenGL window
  12.   glMatrixMode(GL_PROJECTION);       // Change Matrix Mode to Projection
  13.   glLoadIdentity();                  // Reset View
  14.  
  15.   // Do the perspective calculations. Last value = max clipping depth
  16.   gluPerspective(fFovy, Width / Height, fZNear, fZFar);
  17.  
  18.   glMatrixMode(GL_MODELVIEW);        // Return to the modelview matrix
  19.   glLoadIdentity();                  // Reset View
  20. end;
  21.  


Eigentlich nichts besonders, habe es aus einem Tut entnommen. In den Übergabeparamter steht die neue Größe, trotzdem wird die OpenGL Ausgabe auf die alte Größe ausgegeben. Hat jemand eine Ahnung, was ich noch versuchen könnte?

Gruß
KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 18:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Die Funktion zur Größenänderung deines Viewports ist vollkommen in Ordnung (vorausgesetzt du übergibts auch die Richtigen Parameter), und sollte auf jeden Fall funktionieren.Vielleicht machst du einen Fehler bei der Größenzuordnung des Panels?Hast du Align auch auf alClient stehen, oder passt du die Größe manuell an?

Lass dir einfach mal im Resizeevent die Dimensionen deines Panels per Dialogbox ausgeben, dann kannste ganz einfach nachprüfen ob dein Problem beim Resizen des Viewports oder des Panels auftritt.

Achte auch drauf das dein Rendercontext aktiv ist bevor du ihn mit glViewPort in der Größe festlegst!

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 18:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

benutzt du evtl mehrere OpenGL Fenster??? dann fehlt nämlich ein wglMakeCurrent in deiner Resize Procedure ;)

Ansonsten.. wo rufst du denn ResizeWindow auf??? Im OnResize vom Form?

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 18:23 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
@SoS:
Der schwarze Rahmen kommt von der OpenGL - Ausgabe. Bei einem roten Hintergrund wird der Rahmen rot und somit erfolgt das Resize des Panels korrekt.

Ich habes gerade noch einmal geprüft, die Paramter Width und Height werden korrekt mit den neuen Groessen gesetzt.

@Aya:
Nein, nur ein Fenster mit OpenGL. Ausserdem rufe ich vor jedem Zeichen ActivateRenderingContext und nach dem Zeichnen DeactivateRenderingContext. Das Zeichen passiert in der OnIdle der Applikation.

Ich habe auch die Ausgabe der Grafik überprüft. Dort wird aber weder die aktuelle Breiter oder Hoehe mit einbezogen.

Muss ich eigentlich nach eine Resize ChangeDisplaySettings(dmScreenSettings, 0) erneut aufrufen?

KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 18:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Setz mal deinen glViewport-Aufruf in deinen Renderloop, so daß diese Funktion vor jedem Renderdurchlauf aufgerufen wird.Wenns dann geht, stimmt etwas mit deinem ReSize-Event nicht.

Zitat:
Muss ich eigentlich nach eine Resize ChangeDisplaySettings(dmScreenSettings, 0) erneut aufrufen?

Nein, ChangeDisplaySettings muss man nur einmal aufrufen.Beim Resize reicht eigentlich das neue Setzen des Viewports.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 18:53 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Macht leider keinen Unterschied. Was ich nicht verstehe ist, das die Ausgabe mit der Hintergrundfarbe, hier Schwarz, korrekt gefüllt wird, aber der rest zu klein ausgegeben wird.

KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 18:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
KidPaddle hat geschrieben:
Macht leider keinen Unterschied. Was ich nicht verstehe ist, das die Ausgabe mit der Hintergrundfarbe, hier Schwarz, korrekt gefüllt wird, aber der rest zu klein ausgegeben wird.

KidPaddle

Wenn der Rest des Panels korrekt gelöscht wird, aber der Rest deiner Szene "abgeschnitten" wird (so siehts auf dem Screenshot zumindest aus), dann kann das natürlich nicht mehr am falschen Viewport liegen.

Spontan fallen mir da nur der StencilPuffer ein, den man nutzen kann um nur in bestimmte Bereiche zeichnen zu lassen, und eine versenhentlich gesetzte ClippingPlane, die deinen Bildbereich beschneiden tut...ansonsten fällt ne Ferndiagnose schwer.

Wenn du den Source hochlädst, kuck ich mir die Sache mal an...dann dürfte es weitaus leichter sein den Fehler zu finden.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 19:16 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Hallo SoS,

hier liegt der <a href='http://www.seban.de/download/mideditor3.zip' target='_blank'>Source</a> - Code. Einen Stencilbuffer oder ClippingPlane setzte ich nicht ein. Soweit bin ich noch nicht.

Danke für deine Bemühungen.

KidPaddle

PS.:
Die CAD-Komponenten habe ich entfernt, damit Du leichter kompilieren kannst.

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 19:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Sorry, kann deinen Quellcode leider nicht kompilieren...bei mir hagelt es Fehlermeldungen, da dein fOGLOutput-Objekt gar nicht erstellt wurde.Scheint wohl als hättest du da ein wenig zu viel entfernt.

Korrigier das mal bitte, damit ich mich in deinen Quellcode stürzen kann :ph34r:

EDIT : Habs selber zusammengeschraubt und hab jetzt ne OpenGL-Ausgabe...werd mich jetzt also ums Problem kümmern, aber beim nächsten Mal bitte sichergehen das der Quellcode sich auch kompilieren lässt!

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 19:44 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Ups, sorry.

Habe aus versehen in FormCreate diese Zeilen gelöscht. :(

Code:
  1.  
  2.  &nbsp;fOGLOutput := TOGLOutput.Create(panOGLView);
  3.  &nbsp;fOGLOutput.CreateOpenGLDC(panOGLView.Handle);
  4.  


Peinlich, peinlich

KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 20:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hmpfff...auch wenns dir nicht gefällt : Dein Quelltext ist nicht der schönste, und könnte glatt aus der Feder eines C'lers stammen :P

Hab den Fehler nach langem Suchen allerdings trotzdem gefunden...irgendwas machst du bei der Übergabe der Dimensionen für deinen Viewport falsch, denn wenn du folgendes in den OnResize-Event deines GL-Panels schreibts :

Code:
  1. if (fOGLOutput.DC <> 0) and (fOGLOutput.RC <> 0) then
  2.  begin
  3.  ActivateRenderingContext(fOGLOutput.DC, fOGLOutput.RC);
  4.  glViewport(0, 0, panOGLView.ClientWidth, panOGLView.ClientHeight);
  5.  DeactivateRenderingContext;
  6.  end;

(Und entferne noch die glViewPort-Anweisung aus OGLWindow.ResetViewport!)

Dann sollte die Sache mit dem Viewport einwandfrei funktionieren.Ich hab jetzt noch nicht genau geschaut wo und wann der Fehler bei der Übergabe der Viewport-Dimensionen gemacht wird, aber da du ja jetzt weißt wo ungefähr der Fehler liegt solltest du das selbst hinkriegen, denn es ist immer etwas problematisch und anstrengend sich in den Quellcode anderer Leute reinzudenken, deshalb überlass ich die genaue Fehlersuche dir...hoffe aber dir zumindest bei der Ortung des Fehlers geholfen zu haben.
Wenn ich heute noch etwas Zeit finde, dann werd ich vielleicht auch noch suchen...allerdings wirst du dich wohl etwas besser in deinem Quellcode auskennen...

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 20:21 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Danke, werde ich gleich ausprobieren.

Also, das der Quellcode eines CL'ers gleichen soll, verstehe ich nicht. Ich habe keine kryptischen Anweisungen, rücke sehr viel ein, und die Methoden gehen nicht über 3 Seiten.

Was mach ich also falsch? :unsure:

KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 20:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
OK, ich geb zu das der Quellcode zum einen nicht ganz so schlimm ist, und das meine Sichtweise natürlich auch von meinem persönlichen Programmierstil abhängt, bei dem ich mich durchweg an das von Borland herausgegebene Dokument zur Formatierung von Object Pascal halte.
Das Dokument gibts unter folgender URL : <a href='http://community.borland.com/soapbox/techvoyage/article/1,1795,10280,00.htm' target='_blank'>http://community.borland.com/soapbox/techv...95,10280,00.htm</a>

Einige Dinge die mich gestört haben :
Zuerst wie sie bei dir aussehen, und dann wie ichs machen würde (ohne Behaupten zu wollen das meine Methode das Non-Plus-Ultra wäre) :
Code:
  1. procedure TMIDEditorMain.panOGLViewMouseUp(Sender : TObject;
  2.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Button : TMouseButton;
  3.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Shift &nbsp;: TShiftState;
  4.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;X, Y &nbsp; : Integer);
  5.  

Code:
  1. procedure TMIDEditorMain.panOGLViewMouseUp(Sender : TObject; Button : TMouseButton; Shift &nbsp;: TShiftState;X, Y &nbsp; : Integer);


Code:
  1. if not fEnabled then begin
  2.  &nbsp; Exit;
  3.  end;
  4.  

Code:
  1. if not fEnabled then
  2.  &nbsp; &nbsp;begin
  3.  &nbsp; &nbsp;Exit;
  4.  &nbsp; &nbsp;end;
  5.  

Davon abgesehen lässt sich obiges noch wie folgt abkürzen :
Code:
  1. if not fEnabled then
  2.  &nbsp;Exit;
  3.  


Nur mal ein paar Beispiele, die den Quellcode in meinen Augen ein wenig übersichtlicher machen.Will damit natürlich nicht deinen persönlichen Programmierstil beleidigen, der ja jedem selbst überlassen ist.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 20:57 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Bei mir geht es hauptsächlich darum, in kürzester Zeit soviel Code von der Strucktur her zu verstehen. Daher sind lange Anweisungszeilen, z. B. in der Methodendeklaration, wenig gut geeignet, da ich hier immer genau hinsehen muss, was ist der Variablenname und was ist der Typ. Häufig vergessen die Leute noch Leerzeichen reinzumachen und schon ist die Lesbarkeit im Eimer.

Ich war noch nie ein Freund eine Zeile Code für ein Begin zu verschwenden. Noch schlimmer finde ich:

if ..
begin
end
else
begin
end;

Mache ich das einige Mal hintereinander, so habe ich von den ca. 50 Zeilen die ich auf dem Bildschirm sehe, 15 Zeilen verschwendet, was bedeutet daß ich mehr scrollen muss, um einen Algo zu entschlüsseln.

Aber wie gesagt Du gesagt hast, eine persöhnliche Vorliebe. :P

Aber Danke für den Hinweis, es funktioniert. Keine Ahnung wieso, aber es geht und Du brauchst Dich nicht weiter mit meinem Code zu quälen. :lol:

KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 18, 2003 21:29 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
kleiner tipp am rande: viele entwickler haben ihre eigenen formatierungsvorstellungen. ich z.b. kann es überhaupt nicht haben, wenn jemand die strichpunkte in pascal an den anfang einer zeile schreibt.
Code:
  1.  
  2. begin
  3.  &nbsp;a := b
  4.  ;c := d + a
  5.  ;WriteLn(c)
  6.  

das problem läst sich aber an sich recht einfach lösen. jeder der den code mag, wie er im borland styleguide steht(so wie ich), der benutze am besten den jedi code formater. das ding ist praktisch und code sieht schnell wie gewohnt aus. wem dieser nicht gefällt schreibe sich seinen eigenen - ist nicht sonderlich schwer, erleichtert einem persönlich aber die lesbarkeit ungemein. und wenn mal wieder der neuling in der firma seinen eigenen stil reingezwickt hat, dann wird einfach der codeformatter drübergejagt und alles ist wieder wies sein soll.


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 6 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.010s | 16 Queries | GZIP : On ]