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

Aktuelle Zeit: So Jul 13, 2025 18:59

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Jan 17, 2009 14:27 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
Hallo, ich habe mal wiedereine Frage (was auch sonst :wink: )

Wie der Titel schon sagt habe ich ein Problem mit zwei Quads, die genau den selben Z wert haben (aber unterschiedliche Größe)

Es flimmert immer weil irgendwie beide Quads gleichzeitig sichtbar sind, was natürlich nicht klappen kann...

Das eine ist der Untergrund und das andere ain Quad der auf dem Untergrund ein Hindernis darstellen soll. Das Hindernis ist natürlich normalerweise 3D, aber ich wollte aben auch noch einen 2D Modus haben.
Beim Rendern mache ich nichts anderes als um die Y Achse zu drehen und die Quads zu rendern. Den Boden zuerst.
Initialisierung:
Code:
  1.  
  2.   glShadeModel(GL_SMOOTH);
  3.   glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  4.   glClearDepth(1.0f);
  5.   glEnable(GL_DEPTH_TEST);
  6.   glDepthFunc(GL_LEQUAL);
  7.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  8.  

Das Problem habe ich bestimmt nicht als erster, aber bei der Suche im Forum habe ich noch keine andere Lösung gefunden außer die Quads nicht aufeinander zu zeichnen sondern einen kleinen Spalt dazwischen frei zu lassen. Geht das auch anders?

Ich nehme mal an, es liegt irgendwie am Tiefenpuffer, da z.B. im Blending Tutorial steht, dass man immer nur das zuletzt gezeichnete sieht. Cullling geht in dem Fall leider nicht, da man an den Stellen ohne Hindernis den Boden sehen soll.

glmatt

PS: Natürlich könnte man auch einfach statt einem Boden an den Feldern ohne Hindernis jeweils einen kleinen Boden zeichnen, aber ich dachte immer das müsste so auch gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 17, 2009 14:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Evtl hiermit:
http://wiki.delphigl.com/index.php/glPolygonOffset


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 17, 2009 14:54 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
Danke für die Hilfe,
ich habe jetzt festgestellt, dass es sich bei mir um Z-Fighting handelt, das auch wirklich nur auftritt, wenn ich alles drehe, sonst gibt es kein Probleme.
Im Artikel zu Z_Fighting standen noch ein paar tricks um das Flimmern zu verhindern, die aber ale nicht geholfen haben, da meine Objekte genau aufeinander liegen.

Muss man denn auch ein glBegin() ausführen, bevor man glPolygonOffset() benutzen kann?
Und welche parameter sind da sinnvoll? Ich habe mit den Werten schon mal rumgespielt, es hat sich auch geringfügig etwas verändert, aber klappen tuts immer noch nicht :(

Ich kann das drehen aber auch einfach abstellen, das brauche ich für den 2D-Modus in meinem Spiel nicht unbedingt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 17, 2009 15:32 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hast du es mal versucht mit GL_LEQUAL als Tiefentestfunktion? Das sollte dafür sorgen, dass das später gezeichnete Quad sich durchsetzt. (Die Testfunktion lässt alle Fragmente durch durch die näher sind (wie beim standard) oder gleichweit entfernt sind wie die bisherigen).

Außerdem solltest du deinen Z-Buffer besser auslasten.
Und wenn du im 2D (also Orthomodus) unterwegs bist, dann kannst du die Objekte auch auf mehrere Z-Ebenen verteilen, so dass die nicht mehr auf einander liegen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 17, 2009 16:12 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
Flash hat geschrieben:
Hast du es mal versucht mit GL_LEQUAL als Tiefentestfunktion?

Habe ich schon, siehe Code oben. Ich benutzt die eigentlich immer, sind andere normalerweise besser?

Flash hat geschrieben:
Außerdem solltest du deinen Z-Buffer besser auslasten.

Meinst du damit in der Resize Funktion die Werte für gluPerspective anpassen? (also die Near und Far parameter) Das wäre bei mir schwierig, da mein Spiel (Snake, zumindest sollte es das mal werden :wink:), bzw. die "Welt" aus Feldern besteht und davon kann es unbegrenzt viele geben (je nach level), das wird über Listen geregelt. Und da das Objekt zumindest im 3D Modus auch noch gedreht wird, kann es sehr groß werden, der Far-Wert bei gluPerspective wird dann (in Zukunft) auch noch angepasst.

Flash hat geschrieben:
Und wenn du im 2D (also Orthomodus) unterwegs bist, dann kannst du die Objekte auch auf mehrere Z-Ebenen verteilen, so dass die nicht mehr auf einander liegen.

Ups, den Orthomodus hatte ich ganz vergessen :D Damit sollte es dann auch gehen, macht man (abgesehen vom Autor dieser Nachrticht :wink:) bei 2D ja meistens so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 17, 2009 17:21 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
zu glOrtho:

Wann rufe ich das denn auf? In der Modelview oder der Projektionsmatrix?
Muss ich dann glViewport weglassen oder/und gluPerspective?

ansonsten danke für die Hilfe!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 17, 2009 18:03 
Offline
DGL Member

Registriert: Sa Aug 09, 2008 09:07
Beiträge: 112
1. In dem Projektionsmatrix-Block, gleich als 1. nach dem setzten der Indentitätsmatrix
2. glViewport brauchst du natürlich noch


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 17, 2009 21:17 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
Jetzt habe ich folgendes Problem mit glOrtho:

Ich zeichne x * y Quads, alle quadratisch sind und 1*1 Einheiten groß sind. (wobei x und y nicht gleich sein müssen) also Felder, die mittels x und y auch in einem Array gespeichert sind.
Die insgesamt gezeichnete Fläche ist demnach ein Rechteck mit den Maßen x * y, wobei der Mittelpunkt genau 0,0 ist.

Mit gluPerspective wird das ganze auch dem Fenster angepasst.
Aber wie mache ich das mit glOrtho?

Was ich erreichen möchte ist, dass der Platz möglichst optimal ausgenutzt ist und man immer alles sieht und dass die Felder weiterhin quadratisch (!) bleiben. Also z.B. so (Natürlich kann die Höhe auch größer als die Breite des Fensters sein, das ist nur ein einziger möglicher Fall)

Fenster= - Rechteck aus Quadraten = + Ungenutzer Platz=o
- - - - - - - - - - - - - - - -
- o o o + + + + o o o -
- o o o + + + + o o o -
- o o o + + + + o o o -
- - - - - - - - - - - - - - - -

Frage: Wie bekomme ich aus dem Verhältnis Höhe/Breite oder auch Breite/Höhe und den Werten x und y (Felder = 1*1 Einheit) heraus, was ich bei glOrtho als left,right,bottom und top angeben muss? mit glOrtho(-x/2,x/2,-y/2,y/2); würde das gesamte Rehteck auf die Größe des Fensters skaliert, dabei aber leider auch verzerrt werden, sodass die Felder nicht mehr quadratisch sind.

Wenn man die richtige Formel hat, wäre es sicher ganz einfach. Dass die Formel irgendwo das Verhältnis von Höhe und Breite enthalten muss, ist auch klar. Weiter bin ich dann leider auch nicht gekommen :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 17, 2009 22:07 
Offline
DGL Member

Registriert: Do Dez 18, 2008 21:38
Beiträge: 60
Habe das Problem jetzt mit ein bisschen Nachhilfe gelöst. Oder besser gesagt: Das Problem wurde mit ein bisschen Nachhilfe von mir gelöst :wink:

Folgende Gleichung gilt hierbei:

FensterX / FensterY = (FlächeX / FlächeY) * Ausgleichsfaktor

<=> (FensterX / FensterY) * (FlächeY / FlächeX) = Ausgleichsfaktor

Ist der Ausgleichsfaktor > 1 ist die Höhe der Fläche (FlächeX) das eintscheidende Maß und wird an die Fenstergröße angepasst.
Ansonsten (<= 1) wird die Breite an die Fenstergröße angepasst.

In jedem Fall kennt man dann das Verhälnis von a OGL Einheiten zu b Pixeln und kann mit einem Dreisatz ausrechnen, wie viele OGL Einheiten dann für die andere Größe (Breite oder Höhe) einzusetzen sind.

Dann hat man final den Aufruf von glOrtho:
Code:
  1. glOrtho( -breite/2, breite/2, -höhe/2, höhe/2, near, far);


So, das sollte klappen, habs aber noch nicht getestet.


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


Wer ist online?

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