Ich versuche, den Vertex-Shader-Code zu implementieren, um das "Billboard" -Verhalten für ein bestimmtes Vertex-Mesh zu erreichen. Ich möchte das Gitter normalerweise (wie ein 3D-Objekt) definieren und es dann immer der Kamera zugewandt haben. Ich brauche es auch, um immer die gleiche Größe (Bildschirm-weise) zu haben. Diese beiden „Effekte“ passieren sollte:So transformieren Sie Vertices im Vertex-Shader, um ein 3D-Billboard zu erhalten
Der einzige Unterschied in meinem Fall ist, dass anstelle einer 2-D-Bar, ich ein 3D-Objekt haben wollen.
Um dies zu tun, versuche ich, die Alternative 3 in this tutorial (das gleiche, wo die Bilder stammen) zu folgen, aber ich kann nicht viele der Annahmen, die sie gemacht (wahrscheinlich aufgrund meines Mangels an Erfahrung in Grafik und OpenGL).
Mein Shader wendet die gemeinsame Transformation Stapel Ecken, d.h .:
gl_Position = project * view * model * position;
Wo position
ist das Eingangs Attribut mit dem Scheitelpunkt Lage in Welt-Raum. Ich möchte in der Lage sein, Modelltransformationen (wie Translation, Skalierung und Drehung) anzuwenden, um die Ausrichtung des Objekts in Bezug auf die Kamera zu ändern. Ich verstehe die im Tutorial erklärten Konzepte, aber ich kann nicht verstehen, dass ich sie in meinem Fall anwenden kann.
Was ich versucht habe, ist die folgende (aus dieser answer extrahiert und ähnlich dem Tutorial):
uniform vec4 billbrd_pos;
...
gl_Position = project * (view * model * billbrd_pos + vec4(position.xy, 0, 0));
Aber was ich bekommen, ist eine Form, deren Größe größer ist, wenn näher an das ist Kamera und ansonsten kleiner. Habe ich etwas vergessen?
Ist es möglich, dies im Vertex-Shader zu tun?
Was ich tun würde, ist die Modellmatrix um '(view * center) .z' zu skalieren, so dass die Größe auf dem Bildschirm immer gleich ist. Für die tatsächliche Orientierungsmatrix sollte es die Transponierte der Ansichtsmatrix sein (also beide ausgleichen). – pleluron