Unity3D - Wie werden 2D-Sprites tesselliert?

8

Ich verwende dynamische Scheitelpunktbeleuchtung für 2D-Sprites. Bei größeren Sprites ist die Beleuchtung hässlicher als bei kleineren. Dies liegt daran, dass jedes Sprite nur ein Quad aus zwei Dreiecken ist. Es gibt dort nicht genügend Eckpunkte für die Beleuchtung größerer Flächen.

Gibt es eine Möglichkeit, mehr Dreiecke für ein Sprite zu verwenden? Vielleicht sogar abhängig davon, wie viel Bildschirmfläche sie abdecken?

aggsol
quelle
1
Klingt es so, als ob Sie Ihr Quad unterteilen möchten? Wenn das der Fall ist, gibt es einige gute Beispiele im Pseudocode, um dies zu erreichen. Mit Afaik Unity können Sie auf ein Netz von Spielobjekten (und seine Dreiecke / Eckpunkte) zugreifen, mit dem Sie das erreichen können, was Sie möchten. Hier ist ein solches Beispiel hier auf gamedev für die Unterteilung von Quads: Wie kann man ein Quad unterteilen? . Entspricht dies dem, wonach Sie gesucht haben?
Logham
Ja, ein Quad zu unterteilen ist der Ansatz, den ich suche. Dies schließt Wicklungen und UVs ein, denke ich. Auf diese Weise hätte ich mehr Dreiecke.
Aggsol
Haben Sie versucht, beim Zeichnen Ihres Sprites einen Tessellation-Shader zu verwenden? docs.unity3d.com/Manual/SL-SurfaceShaderTessellation.html answers.unity3d.com/questions/583960/…
ClassicThunder
2
Wenn Sie das Quad tessellieren, werden die Beleuchtungswerte für die Eckpunkte nur interpoliert. Das Quad ist flach, sodass bei mehr Eckpunkten die Interpolation über das gesamte Quad nur linear ist. Wie wird das Hinzufügen weiterer Dreiecke dieses Problem beheben? Das klingt nach etwas, das mit einem Pixel-Shader gelöst werden sollte.
Arun R
@ArunR Guter Punkt, aber wenn z. B. das Quad größer als der Bereich eines Punktlichts ist, verwendet das Dreieck Licht, wenn der Vertext nicht mehr leuchtet. Die Verwendung des Pixel-Shaders ist leider nicht auf allen Geräten möglich.
Aggsol

Antworten:

2

Klingt so, als müssten Sie Ihr eigenes Spielobjekt erstellen und ein benutzerdefiniertes Triangulationsalgo verwenden, um die Details basierend auf einer größenbezogenen Mathematik zu verarbeiten.

Vielleicht könnte so etwas helfen ...

http://forum.unity3d.com/threads/tessellation-algorithms-for-polygons.228051/

Andere Optionen könnten darin bestehen, einen intelligenteren Shader und eine Bump-Map mit Ihren Sprite-Vertex-Verschiebungsansätzen zu verwenden.

Es ist schwer zu sagen, ohne genau zu wissen, was Sie erreichen wollen, um herauszufinden, was am besten passt. Hoffentlich hilft einer davon.

Krieg
quelle
Die Idee ist, Scheitelpunktlicht für Sprites zu verwenden, da es viel schneller als Pixellichter ist. Insbesondere einige mobile Plattformen verfügen über Grafikchips mit niedrigen Spezifikationen.
Aggsol
Sie sagen also, Sie haben ein großes Quad, das Sie teilen möchten, und dann pro Scheitelpunkt das Ergebnis? Sie könnten ein viel besseres und schnelleres Ergebnis erzielen, wenn Sie die Beleuchtung mit Pixel pro Pixel auf der vorhandenen Quad-IMO mit niedriger Auflösung verwenden. Wenn Sie dies jedoch möchten, entscheiden Sie sich dafür. Ein Quad zu teilen sollte nicht zu schwer sein, oder?
Krieg
Denken Sie daran, dass das, was Sie durch Beleuchtung pro Pixel sparen, durch größere Scheitelpunktpuffer effektiv verloren gehen würde. Die andere Option besteht natürlich darin, im Scheitelpunkt-Shader etwas Mathematik zu haben, um eine Lichtstufe basierend auf einem Teil an den Pixel-Shader zu übergeben vom Scheitelpunkt, so dass Sie immer noch eine kleine VB erhalten und nicht pro Pixel Licht.
Krieg
Schrott diese Idee ... das wird nicht funktionieren ... hmmmm
Krieg
1
Wenn Sie eine Klärung der Frage benötigen, geben Sie einen Kommentar zu der Frage ab.
MichaelHouse