In openGL, wie können Sie Einzelteile erhalten nach vorne zu ziehen zurück?

StackOverflow https://stackoverflow.com/questions/185536

  •  06-07-2019
  •  | 
  •  

Frage

Standardmäßig scheint es, dass Objekte vorne gezogen werden, zu unterstützen. Ich zeichne ein 2-D-UI-Objekt und möchte es hinten nach vorne schaffen. Zum Beispiel eine schwarze Scheibe mit einem weißen Rand zu schaffen, ich könnte ein weißes Quadrat erstellen Sie zunächst einen etwas kleineren schwarzen Quadrat auf es so dann erstellen. Dieser Beitrag auf es einige Diskussionen hatte und beschrieben diesen Auftrag als „Maler Algorithm“, aber letztlich das Beispiel gab sie einfach die Objekte in umgekehrter Reihenfolge wiedergegeben um die gewünschte Wirkung zu erzielen. Ich stelle dar, von hinten nach vorn (erste Objekte gehen in zurück, erhalten nachfolgende Gegenstände auf ziehen) Rendering kann über irgendeine Transformation (gOrtho?) Erreicht werden?

Ich werde auch erwähnen, dass ich bin nicht daran interessiert, eine Lösung, die eine Wrapper-Bibliothek wie GLUT verwenden.

Ich habe auch festgestellt, dass das Standardverhalten auf dem Mac die Cocoa NSOpenGLView Verwendung erscheint nach vorne ziehen zurück, wo, wie in den Fenstern ich dieses Verhalten nicht bekommen kann. Der Setup-Code in Windows ich verwende, ist dies:

glViewport (0, 0, wd, ht);
glMatrixMode(GL_PROJECTION);           
glLoadIdentity();                      
glOrtho (0.0f, wd, ht, 0.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);             
glLoadIdentity();                       
War es hilfreich?

Lösung

Der folgende Aufruf schaltet sich eine gründlichere Prüfung verursachenden Objekten in der Reihenfolge erstellt gezogen werden. Dies wird in der Tat Ursache Objekte nach vorne ziehen zurück.

glDepthFunc(GL_NEVER);      // Ignore depth values (Z) to cause drawing bottom to top

Seien Sie sicher, dass Sie dies nicht nennen:

glEnable (GL_DEPTH_TEST);   // Enables Depth Testing

Andere Tipps

Für Ihre spezielle Frage, keine gibt es keine standardisierte Art und Weise Tiefe Bestellung angeben, in OpenGL. Einige Implementierungen können vorne tun Tiefe Bestellung standardmäßig zurück, weil es in der Regel schneller, aber das ist nicht garantiert (wie Sie entdeckt).

Aber ich weiß nicht wirklich sehen, wie es Ihnen in Ihrem Szenario helfen. Wenn Sie ein schwarzes Quadrat vor einem weißen Quadrat das schwarze Quadrat ziehen sollte unabhängig von vor dem weißen Quadrat gezeichnet werden in welcher Reihenfolge sie in gezeichnet sind, solange Sie Tiefenpufferung aktiviert. Wenn sie tatsächlich koplanar sind, dann ist weder das eine wirklich vor dem anderen und jeder Tiefe Sortieralgorithmus würde unberechenbar sein.

Das Tutorial, das Sie einen Link gepostet nur darüber gesprochen, weil Tiefensortierung relevant ist, wenn Sie Transparenz verwenden. Aber es klingt nicht für mich wie das ist, was Sie nach.

Aber wenn Sie wirklich, dass es so zu tun haben, dann haben Sie es selbst zu tun. Zuerst Ihr weißes Quadrat auf die Rendering-Pipeline senden, zwingen die machen, und dann schwarzes Quadrat senden. Wenn Sie es auf diese Weise tun, und deaktivieren Tiefenpufferung, dann können die Quadrate koplanar und Sie werden nach wie vor gewährleistet sein, dass das schwarze Quadrat über das weiße Quadrat gezeichnet wird.

Zeichnung Ordnung ist hart. Es gibt keine einfache Lösung. Die alogorithm des Malers (sortieren Objekte durch ihren Abstand in Bezug auf Ihre Kamera-Ansicht) ist die einfachste, aber wie Sie entdeckt haben, es nicht alle Fälle lösen.

Ich würde eine Kombination der algroithm und Schichten des Malers vor. Sie bauen Schichten für bestimmte Elemente auf dem Programm. So haben Sie eine Hintergrundebene bekommen, Objekte Schichten, Spezialeffektschichten und GUI-Schicht.

Mit dem Algorithmus des Malers gegenseitig auf die Elementen der Ebene. In einigen speziellen Schichten (wie Ihre GUI-Schicht), sortierte nicht mit dem Algorithmus des Malers, sondern durch Ihren Anruf um. Das nennst du weißes Quadrat zuerst so es zuerst gezeichnet wird.

Zeichnen Sie Elemente, die Sie auf der Rückseite leicht hinter den Elementen sein wollen, dass Sie in der Front sein wollen. Das heißt, im Moment den Z-Wert geändert werden (z Annahme, daß die senkrecht zu der Bildschirmebene). Sie müssen es nicht viel ändern sich die Einzelteile zu erhalten vor einander zu ziehen. Und wenn Sie nur den Wert leicht z ändern, sollten Sie nicht viel von einem aus ihrer gewünschten Position versetzt bemerken. Man könnte sogar wirklich Lust gehen, und berechnen Sie die richtigen x, y-Position auf der geänderten z-Position basiert, so dass das Element angezeigt wird, wo es sein soll.

Ihre Bestellung wird in der genauen Reihenfolge rufen Sie die in glBegin / glEnd Funktionen gezogen werden. Sie können Tiefen Pufferung mit dem Z-Puffer erhalten, und wenn Sie Ihre 2D-Objekte unterschiedliche z-Werte haben, können Sie den gewünschten Effekt erhalten dieser Weg. Die einzige Möglichkeit, das Verhalten sehen Sie auf dem Mac zu beschreiben ist, wenn das Programm in Sachen Back-to-Front, um manuell zeichnen oder mit dem Z-Puffer, dies zu erreichen. OpenGL hat sonst keine Funktionalität automatisch, wie Sie beschreiben.

Wie AlanKley wies darauf hin, die Art und Weise, dies zu tun ist, um die Tiefenpuffer zu deaktivieren. Der Algorithmus des Malers ist wirklich eine 2D-Technik Scan-Konvertierung verwendet Polygone in der richtigen Reihenfolge zu machen, wenn Sie so etwas wie ein Z-Puffer nicht haben. Aber Sie würden es auf 3D-Polygone nicht anwendbar. Sie würden normalerweise verwandeln und sie (Umgang mit Kreuzungen mit anderen Polygonen) projizieren und dann sortieren die resultierende Liste von 2D Polygone projiziert durch ihre projizierten z-Koordinaten, so dass sie dann in umgekehrter z-Reihenfolge ziehen.

Ich habe immer gedacht, der Algorithmus des Malers als alternative Technik zur Entfernung verdeckter Flächen, wenn Sie können nicht (oder wollen nicht) verwenden, um einen Z-Puffer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top