Frage

Soweit ich weiß, können wir nicht Lesen Sie die Z-Achse(Tiefe) Wert in OpenGL ES 2.0.Also ich Frage mich, wie können wir erhalten die 3D-Welt-Koordinaten von einem beliebigen Punkt auf dem 2D-Bildschirm?

Eigentlich habe ich ein paar zufällige Gedanken funktionieren könnte.Da Lesen wir den RGBA-Wert mit glReadPixels, wie wir über die doppelte Tiefe Puffer und speichern Sie es in einer Farbe-Puffer(sagen ColorforDepth).Natürlich gibt es einige schöne Messe, so dass wir nicht verlieren, alle Informationen, die Tiefe Puffer.Und dann, wenn wir noch einen Punkt, die Welt, Koordinaten , legen wir diese ColorforDepth Farbe Puffer, um den framebuffer und dann machen Sie es.Also, wenn wir verwenden glReadPixels zu Lesen, die ausführliche Informationen zu diesem frame.

Jedoch führt dies zu einem 1 frame flash seit der colorbuffer ist eine seltsame Puffer übersetzt aus der Tiefe Puffer.Ich Frage mich heute noch, wenn es gibt einige standard-Weg, um die Tiefe in OpenGL es 2.0?

Thx im Voraus!:)

War es hilfreich?

Lösung

Mit einem FBO, die Sie machen können, ohne die Ergebnisse anzuzeigen.Wenn Sie sind in ES 2.0, Ihrem fragment-shader können auf die aktuellen fragments Tiefe (in-Fenster Koordinaten) als Teil gl_FragCoord, so können Sie schreiben, dass die Farbe Puffer, verwenden glReadPixels, um das Ergebnis zu erhalten Sie zurück und fahren Sie Fort.Alternativ können Sie die load-Welt-Raum-z als eine abwechslungsreiche und schreiben, die von Ihrem fragment-shader, in Fall, dass Sie ein einfacher Weg um.

Überzeugen Sie sich selbst, schreiben Sie eine kurze shader, stellt gl_FragCoord.z out hastig in niedrigen Präzision, z.B.nur

gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0);

Sollten Sie ein Graustufen-mit der Intensität der Farbe repräsentiert die Tiefe.Weil Sie-in-Fenster von Koordinaten, die Intensität reicht von 0,0 (möglichst nicht abgeschnittene fragment) 1.0 (entferntesten möglich, nicht abgeschnittene fragment).Um nicht zu verlieren eine ganze Menge von Präzision, ist es wahrscheinlich hilfreicher split der Wert zwischen den Komponenten, als Ihrem Anbieter fast gar keine Unterstützung für floating-point-target-Puffer.

Andere Tipps

Ich verwende einen Grund ray zum Gießen eines 3D-Objekts aus einem Touch-Screen Kommissionierung. Eigentlich berechnen I den Schnittpunkt zwischen dem Schirm Normalen am Berührungspunkt und eine Kugel meines Objekt enthält. Für eine sehr präzise Kommissionierung oder komplizierte Form haben Sie mehrere Kugel verwenden.

Sie können auch einige wichtige Punkte projizieren von Ihnen im 2D-Raum-Objekt von Ihnen Bildschirm (mein Multiplizieren Sie Ihre 3D-Punkt für Ihre Transformations-Matrix) und dann einige 2D-Vergleich machen (Abstand) mit Ihnen Punkt berühren.

Ich möchte auch in der Lage sein, Werte in den Tiefenpuffer zu lesen, aber die Forschung anzeigt, es kann nicht getan werden.

als vincent schon sagt, wenn Sie einfache Formen wie Kugeln haben, Ray-Casting ist wahrscheinlich besser.

für komplexere Formen tho, Ich denke, das Objekt zu einem des Rendering (potentiell kleinen) Offscreen-Puffer, manuell eine der Farbkomponenten jedes Eckpunkts Zuweisen der Tiefe dieser Scheitel zu sein, und dann liest die Farbwerte. das ist etwas unelegant und ärgerlich tho, und erfordert, dass Sie Objektraum in den Schirmraum in der Lage sein zu konvertieren (Ich bin meine eigene quaternions mit den Matrizen zu fahren, so dass nimmt diese Aufgabe). kann es eine Art und Weise mit Shadern, die Tiefeninformation in die Farbe oder Schablonenpuffer zu schreiben (nicht GL ES sogar einen Stencilbuffer hat?)

, wenn jemand einen sauberere Ansatz hat ich würde gerne hören.

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