Seite 1 von 1

Problem mit Überzeichnung bei OpenGL und QGLWidget

Verfasst: 18. Mai 2008 18:54
von Djon
Hallo!

Ich habe ein kleines Widget erstellt, welches ich von QGLWidget abgeleitet habe. Ich möchte zum Anfang nur zwei Quadrate zeichnen, die hintereinander liegen. Beide Quadrate haben unterschiedliche Farben (grün / grau). Soweit so gut, aber es gibt wie immer ein Problem. Und zwar wird das Quadrat, welches als erster gezeichnen wurde, von dem anderen zweiten übergezeichnet. Woran könnte das liegen?

Ich füge meine Source-Dateien hinzu, vielleicht kann man so besser nachvollziehen wo das Problem liegen könnte.


Mfg Djon

Re: Problem mit Überzeichnung bei OpenGL und QGLWidget

Verfasst: 19. Mai 2008 07:31
von macman
Djon hat geschrieben:Und zwar wird das Quadrat, welches als erster gezeichnen wurde, von dem anderen zweiten übergezeichnet. Woran könnte das liegen?
Hab mir die Sourcen nicht angeschaut, aber wenn ich erst etwas zeichne und dann noch was, dann ist das zweite nunmal über dem ersten.

Verfasst: 19. Mai 2008 15:46
von Djon
Hallo!

Es geht ja nicht um das normale Zeichen, sondern um das Zeichnen von geometrischen Figuren mit Hilfe von OpenGL. Und da ist es eigentlich egal in welcher Reihenfolge diese Figuren gezeichnet werden, es kommt ja nur auf die Darstellungsreihenfolge an, die von der jeweiligen Perspektive abhängig ist. Vielleicht kennt jemand ein kleines Beispiel, oder kann eins erstellen, wo ein Quader im Raum sich befindet und den man von allen Seiten durch veränderung der Perspektive betrachten kann.

Vielen Dank im Voraus!

Mfg Djon

Verfasst: 19. Mai 2008 16:05
von macman
Also ich habe schon einiges mit OpenGL gemacht, unter anderem auch ein Programm, welches ein TreeWidget enthält, in dem die zu zeichnenden Objekte aufgelistet sind. Gezeichnet wird in der Reihenfolge, in der sie in der Liste stehen und durch umsortieren der Items, kommt mal das eine nach vorne, mal das andere. Ohne das die View oder die Position im Raum geändert wurde. Es hängt also schon von der Reihenfolge ab.

Bei den Examples findet sich einiges zum Thema OpenGL und das Demo sollte man dabei auch nicht vergessen.

Verfasst: 19. Mai 2008 17:08
von ObeliX
das die reihenfolge dafür verantwortlich ist, halte ich für totalen quatsch. das würde ja bedeuten, daß ich mir jedesmal selber gedanken machen müßte wie die objekte gezeichnet werden müssen, daß die perspektive stimmt. wenn ich die szene zB. drehe, müßte ich die reihenfolge der zu zeichnenden objekte umstellen, weil dann das hintere zuerst zu sehen wäre. das ist doch aber basis-funktionalität von openGl.

hab nur mal kurz drüber geschaut und kann auf die schnelle keinen fehler sehen. hast du mal versucht die fläche von -0,1 auf +0,1 zu setzen bzw. den abstand zu vergrößern ... ist die reihenfolge dann korrekt ? mal versuchsweise das LineWidth weggelassen oder experimentiert ob sich mit glEnable(GL_DEPTH_TEST); und/oder glDisable(GL_CULL_FACE); was ändert ?

Gruß Obel

Verfasst: 19. Mai 2008 19:32
von Djon
Hallo!

Nachdem ich glDisable(GL_CULL_FACE) eingefügt hatte, ist das Überzeichnungsproblem nicht mehr gegeben :D , doch jetzt ist leider wieder ein neues Problem da :( Ich versuche durch das Hinzufügen von zusätzlichen 4 Rechtecken die beiden Quadrate zu einem Quader zusammenzuführen. Das obere und das untere Seitenteil werden problemlos gezeichnet, die seitlichen (rechts und links) jedoch nicht. Woran könnte das jetzt liegen?

Mfg Djon

Verfasst: 19. Mai 2008 20:45
von ObeliX
hmm ... also ich hätt ja eher vermutet, daß es am glEnable(GL_DEPTH_TEST); gelegen hat.

dein neues problem hört sich ein wenig danach an, daß die ensprechenden seiten nicht gezeichnet werden, weil die innenseite der fläche nach außen zeigt. allerdings dürfte genau das bei glDisable(GL_CULL_FACE); nicht passieren. setz die eckpunkte der beiden betroffenen seiten mal andersrum (dh. reihenfolge andersrum). dann sollte der flächennormalenvector in die andere richtung zeigen. wenn die dann immer noch nicht zu sehen sind, ist es was anderes.

und sicherheitshalber auch mal explizit glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); setzen. da wird die seite dann auch gezeichnet, wenn der vector andersrum ist. allerdings sollte das sowieso die standardeinstellung sein.

gruß Obel