Implementierung des Abziehbilds

11

Ich hatte Probleme, Informationen zu Abziehbildern zu finden. Vielleicht hilft diese Frage anderen. Die Implementierung ist für einen Forward-Renderer.

Könnte jemand bestätigen, ob ich die Implementierung des Abziehbilds richtig gemacht habe?

  • Sie definieren einen Würfel mit einer beliebigen Dimension, die das Projektionsvolumen im gemeinsamen Raum definiert. Sie suchen nach Dreiecksschnittpunkten mit dem definierten Würfel, um Dreiecke zu erhalten, auf die sich die Projektion auswirkt.
  • Sie schneiden diese Dreiecke ab und speichern sie.
  • Anschließend verwenden Sie Matrixtricks, um die UV-Koordinaten für die gespeicherten Dreiecke zu berechnen, die auf die projizierte Textur verweisen.
  • Dazu nehmen Sie die Vektoren, die Höhe, Breite und Tiefe des Würfels im gemeinsamen Raum darstellen, so dass z. B. die untere linke Ecke der Ursprung ist.
  • Sie setzen das in eine Matrix als i, j, k Einheitsvektoren, setzen die Translation für den Würfel und invertieren dann diese Matrix.
  • Sie multiplizieren die Eckpunkte der gespeicherten Dreiecke mit dieser Matrix. Auf diese Weise erhalten Sie ihre Koordinaten innerhalb eines Würfels der Größe 0 bis 1, den Sie als UV-Koordinaten verwenden.
  • Auf diese Weise haben Sie die ursprünglichen Dreiecke, auf die Sie projizieren, und Sie haben UV-Koordinaten für diese (die UV-Koordinaten beziehen sich auf die Textur, die Sie projizieren).
  • Dann rendern Sie die gespeicherten Dreiecke erneut auf die Szene und sie überschreiben den Projektionsbereich mit dem projizierten Bild.

Nun die Fragen, auf die ich keine Antworten finden konnte. Ist der letzte Punkt richtig? Ich habe noch nie Software-Clipping durchgeführt, aber es scheint aufgrund der begrenzten Genauigkeit fehleranfällig genug zu sein, dass es zu einigen z-Kämpfen für die projizierte Textur kommt. Ist die Art und Weise, UV-Koordinaten zu erhalten, auch korrekt?

Dreta
quelle
Hier ist ein Link mit Links: gamedev.stackexchange.com/questions/24653/…
Luis Estrada

Antworten:

5

Schauen Sie sich diesen Artikel an:

http://blog.wolfire.com/2009/06/how-to-project-decals/

Es scheint, dass er genau den gleichen Ansatz verwendet, den Sie verwenden. Er spricht nicht über Z-Fighting, aber es könnte definitiv ein Problem in größeren Entfernungen werden.

Mein Vorschlag wäre, Abziehbilder nach einer bestimmten Entfernung zu deaktivieren, wenn der Z-Kampf sehr sichtbar wird.

Ritter666
quelle
Ich habe diesen Artikel mehrmals gesehen. Die Sache ist, dass er überhaupt nicht darüber spricht, worüber ich frage, wie Sie erwähnt haben. Die Z-Kämpfe sind nicht wirklich eine Frage der Distanz, sondern nur Sie Wenn Sie versuchen, direkt auf der vorhandenen Geometrie zu rendern, können Sie aufgrund der begrenzten Genauigkeit nicht sicher sein, ob Sie sich oben oder genau an derselben Stelle befinden
dreta
1
Beim Zeichnen von Abziehbildern können Sie die Tiefenpuffer-Vergleichsfunktion immer auf weniger als oder gleich anstatt auf weniger als so einstellen. Abziehbilder werden immer nur über der Oberfläche gezeichnet, auf die sie sich auswirken.
Jmegaffin
1

Was ich getan habe, um die Z-Kämpfe zu lösen, war, den Z-Wert des Scheitelpunkts in meinem Abziehbild-Shader um einen kleinen Betrag zu erhöhen, nachdem er in Bildschirmkoordinaten angegeben ist.

OK ..... Ich benutze angepasste Mesh-Aufkleber. Ich erstelle ein Netz nxn mit Y auf dem Gelände. Ich benutze Code, um das Y auf dem Terrain-Polygonnetz zu finden. Nach all den Transfromen zeichne ich in Bildschirmkoordinaten über die vorhandene Geometrie. Der Tiefenpuffer ist in Bildschirmkoordinaten angegeben. Wenn Sie also das Z der Abziehbildpolygone ein wenig in Richtung Bildschirm bewegen, wird der Z-Kampf gestoppt. Auf diese Weise reduzierte ich die Anzahl der Polygone, aus denen meine angepassten Abziehbilder bestehen, um die Hälfte. Dies ist alter 120-Code

 vec4 v = gl_ModelViewProjectionMatrix * gl_Vertex;
 v.z -= .03;
 gl_Position = v;

Hoffe das erklärt es besser .. (wie gewünscht)

Alle Drahtrahmen.

Nur Drahtgelände.

Mike O.
quelle
1
Diese Antwort erscheint besonders kurz und unspezifisch. Könnten Sie Ihre Antwort klarstellen?
Gnemlock
1
Es ist nicht schwer zu verstehen. Ich bewege den Scheitelpunkt nur ein wenig in der Z-Richtung im Bildschirmbereich. Da Sie in OpenGL immer im positiven Z im Bildschirmbereich suchen, wird der Z-Kampf durch Verschieben des Z-Negativs um einen kleinen Betrag behoben. Es gibt jedoch ein Problem damit. Wenn Sie herauszoomen, kann das z den Aufkleber viel mehr als nötig bewegen. Eine Lösung besteht darin, den Verschiebungsbetrag vom Auge zum Scheitelpunktabstand zu skalieren.
Mike O.