Splatter Decals auf Mesh
Verfasst: 28.10.2021, 22:51
'nabend
Ich arbeite gerade an einem kleinen Zombieumballerspiel, und das braucht natürlich entsprechend Effekte. Blutfontänen kriegt man mit Partikelsystemen ganz gut hin, aber wie würde das Zeug mit der Umgebung interagieren? Sprich, wie mache ich Blutlachen? Und das am besten innerhalb eines Abends?
Das Level ist prinzipiell erst einmal ein Mesh. Bzw. eine Ansammlung von Meshs, die unterschiedliche Materialien und so haben können. Das einfachste Verfahren wäre wohl, ein Decal an der entsprechenden Stelle zu platzieren, d.h. man sucht sich die Normale der Oberfläche, richtet ein Quad entsprechend aus, und rendert es minimal über dem Boden. Das ist leicht. Aber solange der Boden keine Ebene ist, steht das Quad dann irgendwo über oder ragt in den Boden hinein und es sieht gleich doof aus. Bei Hügeligen Terrain würde das quasi permanent passieren.
Mein zweiter Gedanke war, das Quad zu unterteilen und jeden Vertex auf das Gelände zu projizieren (die Flugrichtung wäre ja prinzipiell bekannt). Man will aber natürlich für einen einzelnen Fleck nicht hunderte Vertices haben, also gibt es immer noch super viele Situationen in denen das ganz schlecht funktionieren würde. Etwa, wenn man eine 90 Grad Ecke hat, und die Mitte des Sprites dann einfach diagonal verläuft, weil halt kein Vertex zufällig genau in der Kante gelandet ist.
Die nächst bessere Option wäre, sich tatsächlich die Geometrie des Levels anzusehen. Ich projiziere nur die 4 Eckpunkte, schau mir dann aber an, welche Leveldreiecke ich damit treffe und ob man Quad über die Kanten davon hinausgeht und würde dann entsprechend dynamisch neue Vertices erzeugen. Mit etwas Gefummel sollte ich dann die optimale Auflösung bekommen, aber die Implementierung hört sich kniffelig und langwierig an. Das geht irgendwie ganz stark in Richtung von Boolschen-Operationen und von denen hab ich bisher nur nerviges gehört.
Dann könnte ich auch noch einfach einen Render-To-Texture Ansatz wählen. Ich brauche überhaupt keine Extrageometrie sondern editiere einfach die Leveltexturen. Da man aber verschiedene Submeshes mit verschiedenen Materialien treffen kann und Texturen natürlich wiederverwendet werden können und natürlich auch getiled sein können, ist auch das irgendwie kniffelig. Und letztenendes könnte es einfach dazu führen, dass man eine Menge Texture-Memory verschwendet (letztendlich braucht man ja auf irgendeine Art eine Textur die genau einmal über das gesamte Level geht und entsprechend groß ist).
Insgesamt sind die Lösungen alle nicht toll. Entweder würde man garantiert ständig sehr hässliche Artefakte bekommen, oder es ist ziemlich aufwändig zu entwickeln und selbst dann vielleicht ineffizient.
Eine letzte Idee wäre es vielleicht noch, diese Flecken oder Lachen nicht als eine große Textur darzustellen, sondern quasi auch als Partikel. Die wären deutlich kleiner und würden individuell ins Level projiziert und könnten dann einfache Quads sein, so dass man die Artefakte nicht sieht, solange man nicht zu genau hinschaut. Das Problem wäre natürlich, entsprechend die passende Struktur darein zu bekommen. Es würde dann halt immer irgendwie wie eine Sammlung an kleinen Flecken aussehen und nicht wie ein zusammenhängendes Ganzes.
Tjo, habt ihr noch gute Ideen? Wie gesagt, ich suche insbesondere nach so einer 80/20 Lösung (80 % des Ergebnis mit 20% der Arbeit).
Ich arbeite gerade an einem kleinen Zombieumballerspiel, und das braucht natürlich entsprechend Effekte. Blutfontänen kriegt man mit Partikelsystemen ganz gut hin, aber wie würde das Zeug mit der Umgebung interagieren? Sprich, wie mache ich Blutlachen? Und das am besten innerhalb eines Abends?
Das Level ist prinzipiell erst einmal ein Mesh. Bzw. eine Ansammlung von Meshs, die unterschiedliche Materialien und so haben können. Das einfachste Verfahren wäre wohl, ein Decal an der entsprechenden Stelle zu platzieren, d.h. man sucht sich die Normale der Oberfläche, richtet ein Quad entsprechend aus, und rendert es minimal über dem Boden. Das ist leicht. Aber solange der Boden keine Ebene ist, steht das Quad dann irgendwo über oder ragt in den Boden hinein und es sieht gleich doof aus. Bei Hügeligen Terrain würde das quasi permanent passieren.
Mein zweiter Gedanke war, das Quad zu unterteilen und jeden Vertex auf das Gelände zu projizieren (die Flugrichtung wäre ja prinzipiell bekannt). Man will aber natürlich für einen einzelnen Fleck nicht hunderte Vertices haben, also gibt es immer noch super viele Situationen in denen das ganz schlecht funktionieren würde. Etwa, wenn man eine 90 Grad Ecke hat, und die Mitte des Sprites dann einfach diagonal verläuft, weil halt kein Vertex zufällig genau in der Kante gelandet ist.
Die nächst bessere Option wäre, sich tatsächlich die Geometrie des Levels anzusehen. Ich projiziere nur die 4 Eckpunkte, schau mir dann aber an, welche Leveldreiecke ich damit treffe und ob man Quad über die Kanten davon hinausgeht und würde dann entsprechend dynamisch neue Vertices erzeugen. Mit etwas Gefummel sollte ich dann die optimale Auflösung bekommen, aber die Implementierung hört sich kniffelig und langwierig an. Das geht irgendwie ganz stark in Richtung von Boolschen-Operationen und von denen hab ich bisher nur nerviges gehört.
Dann könnte ich auch noch einfach einen Render-To-Texture Ansatz wählen. Ich brauche überhaupt keine Extrageometrie sondern editiere einfach die Leveltexturen. Da man aber verschiedene Submeshes mit verschiedenen Materialien treffen kann und Texturen natürlich wiederverwendet werden können und natürlich auch getiled sein können, ist auch das irgendwie kniffelig. Und letztenendes könnte es einfach dazu führen, dass man eine Menge Texture-Memory verschwendet (letztendlich braucht man ja auf irgendeine Art eine Textur die genau einmal über das gesamte Level geht und entsprechend groß ist).
Insgesamt sind die Lösungen alle nicht toll. Entweder würde man garantiert ständig sehr hässliche Artefakte bekommen, oder es ist ziemlich aufwändig zu entwickeln und selbst dann vielleicht ineffizient.
Eine letzte Idee wäre es vielleicht noch, diese Flecken oder Lachen nicht als eine große Textur darzustellen, sondern quasi auch als Partikel. Die wären deutlich kleiner und würden individuell ins Level projiziert und könnten dann einfache Quads sein, so dass man die Artefakte nicht sieht, solange man nicht zu genau hinschaut. Das Problem wäre natürlich, entsprechend die passende Struktur darein zu bekommen. Es würde dann halt immer irgendwie wie eine Sammlung an kleinen Flecken aussehen und nicht wie ein zusammenhängendes Ganzes.
Tjo, habt ihr noch gute Ideen? Wie gesagt, ich suche insbesondere nach so einer 80/20 Lösung (80 % des Ergebnis mit 20% der Arbeit).