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
Problem mit Überzeichnung bei OpenGL und QGLWidget
Problem mit Überzeichnung bei OpenGL und QGLWidget
- Dateianhänge
-
- glwidget.cpp
- (4.84 KiB) 228-mal heruntergeladen
-
- glwidget.h
- (1.27 KiB) 202-mal heruntergeladen
Re: Problem mit Überzeichnung bei OpenGL und QGLWidget
Hab mir die Sourcen nicht angeschaut, aber wenn ich erst etwas zeichne und dann noch was, dann ist das zweite nunmal über dem ersten.Djon hat geschrieben:Und zwar wird das Quadrat, welches als erster gezeichnen wurde, von dem anderen zweiten übergezeichnet. Woran könnte das liegen?
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
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
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
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.
Bei den Examples findet sich einiges zum Thema OpenGL und das Demo sollte man dabei auch nicht vergessen.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
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
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
Hallo!
Nachdem ich glDisable(GL_CULL_FACE) eingefügt hatte, ist das Überzeichnungsproblem nicht mehr gegeben
, 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
Nachdem ich glDisable(GL_CULL_FACE) eingefügt hatte, ist das Überzeichnungsproblem nicht mehr gegeben
Mfg Djon
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
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