So machen Sie 3D-Auswahl / Kommissionierung mit OpenGL

9

Ich habe einige Objekte in der Szene, manche können andere verdecken. Wenn ich mit der Maus klicke oder ziehe, um ein Auswahlrechteck zu erhalten, möchte ich nur die Objekte auswählen / auswählen, die ich aus dieser Perspektive sehen kann. Die Anwendung verwendet derzeit den GL_SELECT-Rendermodus, aber wie wir wissen, werden damit auch verdeckte Objekte ausgewählt. Außerdem habe ich gelesen, dass dies in OpenGL 3 veraltet ist.

Es gibt zwei Methoden, die mich derzeit ansprechen. Die erste ist die Objektauswahl unter Verwendung des Rückseitenpuffers (rotes Buch, Kapitel 14): Einstellen der Farbe jedes Objekts auf seine Objekt-ID und Lesen der Farbe der Pixel aus dem Hintergrundpuffer. Die zweite ist Okklusionsabfragen (superbible, 4. Auflage, Kap. 13).

Andere Ansätze, die ich ausgeschlossen habe, sind die min / max z-Werte im Auswahlpuffer und die benutzerdefinierte Ray / Object-Erkennung außerhalb von GL.

Ich habe ein paar Fragen: 1) Wenn GL_SELECT in der letzten OpenGL-Version veraltet ist, welche Alternativen sollen dann von Entwicklern verwendet werden? 2) Ich habe immer nur über Okklusionsabfragen gelesen, die verwendet werden, um das Rendern zu beschleunigen. Können sie für die Auswahl / Kommissionierung verwendet werden, und gibt es Nachteile? 3) Die bestehende Anwendung hat eine Handvoll glColorXXX-Aufrufe. Wenn ich die Back-Buffer-Route gegangen bin und glColorMask (FALSE, FALSE, FALSE, FALSE) benutzt habe, werden die glColourXXX-Aufrufe effektiv in Aufrufe umgewandelt, die keine Wirkung haben. Dadurch kann ich die Farbe an einem einzigen Ort steuern, wenn im Auswahlmodus gerendert wird ? 4) Welcher Weg ist der beste / kanonisch?

    
PeteUK 22.08.2011, 17:23
quelle

1 Antwort

3

Ich entschied mich, die Auswahl mit dem Backbuffer zu implementieren. Hier ist mein Versuch, meine Fragen zu beantworten:

Wenn GL_SELECT in der aktuellen OpenGL-Version veraltet ist, welche Alternativen sollen dann von Entwicklern verwendet werden?
Ich denke, es ist am besten, OpenGL nicht für diese Aufgabe zu verwenden, sondern Raumbeschleunigungs- strukturen zu verwenden, wie sie in Kommentaren zur ursprünglichen Frage vorgeschlagen wurden.

Ich habe immer nur über Okklusionsabfragen gelesen, die verwendet werden, um das Rendern zu beschleunigen. Können sie für die Auswahl / Kommissionierung verwendet werden, und gibt es Nachteile?
Ich bin mir sicher, dass sie es könnten, aber man müsste alle Objekte kennen, die sie vor der Verlosung auf Okklusion untersuchen wollen. Mit dem Backbuffer und der Farbauswahl kann man einfach sehen, was sich unter dem Cursor oder innerhalb einer rechteckigen Region befindet und von dort filtern.

Die vorhandene Anwendung enthält eine Handvoll glColorXXX-Aufrufe. Wenn ich den Back-Buffer-Pfad gegangen bin und glColorMask (FALSE, FALSE, FALSE, FALSE) benutzt habe, werden die glColorXXX-Aufrufe effektiv in Anrufe umgewandelt, die keine Wirkung haben. Dadurch kann ich die Farbe an einem einzigen Ort steuern, wenn im Auswahlmodus gerendert wird ?
Die Antwort ist nein. Der Aufruf von glColorMask () mit allen GL_FALSE-Parametern bedeutet nicht , dass glColor3ub () -Aufrufe (zum Beispiel) nicht berücksichtigt werden. Es spezifiziert einfach einen Filter / eine Maske für Farben, unmittelbar bevor sie in den Farbpuffer geschrieben werden. Der ursprüngliche Gedanke war, die Farbe auf die Objekt-ID zu setzen und dann glColorMask () aufzurufen, um alle nachfolgenden glColorXXX () - Aufrufe zu ignorieren. Diese Strategie ist zum Scheitern verurteilt, da die Farbe, die die Objekt-ID darstellt, ebenfalls ausgeblendet würde.

4) Welcher Weg ist der beste / kanonisch? Ich würde sagen, dass die Auswahlfarbe für den Rückpuffer am besten ist , da die Okklusionsabfragen vor / während der Zeichnung nicht eingerichtet werden müssen.

    
PeteUK 31.08.2011, 15:42
quelle

Tags und Links