Jump to content
Unity Insider Forum

Gras auf nicht-Unity-Terrain erzeugen - Wie?


Tiwaz

Recommended Posts

Moin,

bin auch mal wieder hier unterwegs ^^
Mich würde mal interessieren was ihr so denkt wie man am besten Gras auf Meshes generieren kann die keine Unity-Terrains sind.

Also so richtige Grasbüschel quasi. Einfach normale Quads oder mit Shadern oder was ganz anderes?
"Am besten" wäre dabei ein Vorgehen, wodurch es gut aussieht und das viele Grasbüschel handeln kann.

Habt ihr sowas schon mal entwickelt oder ein Package oder so dazu gesehen? 

Tiwaz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es gibt mehrere Möglichkeiten.
a- Vegetationsshader (ist im Prinzip ein Shader für Vegetation der zuätzlich auf Windzones reagiert), Nachteil nur für Einzelmeshes geeignet.
(siehe "WavingDoublePass" und "BillboardWavingDoublePass" Shader von Unity)
b- spezieller Grasshader bzw. Asset (ist meist ein Shader + Tools über welche man Grass wie auf einem Terrain platzieren kann und der Shader bzw. das System sorgt dann auch fürs Batching oder Instanzing). Vorteil, man kann überall drauf malen, Nachteil nicht kostenlos und Qualität fraglich.
c- Terrainmesh + Unityterrain (das Unityterrain dient dabei nur als Untergrund für die Grasdetails, der Mesh selbst wird ausgeblendet). Vorteil .. man kann die Features vom Unityterrain für Gras(&Details) verwenden wie Instanzing und Windzones.
d- Vegetation System des Adam Demo's - Nachteil keine Doku - System nicht supported
https://forum.unity.com/threads/blacksmith-demo-q-a-paint-job-vegetation-etc.358004/
(hab ich mir noch nicht im Detail angeschaut, aber interessantes System, evtl. muss man hier noch ein paar Anpassungen für Unity 2017 machen)

Wenn du "kein" Unityterrain verwenden möchtest für den Terrainmesh, dann würde ich persönlich c) und a) verwenden.
Über c) werden große Flächen abgedeckt, Details und Feinheiten werden über a) modelliert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Stunden schrieb Zer0Cool:

Wenn du "kein" Unityterrain verwenden möchtest für den Terrainmesh, dann würde ich persönlich c) und a) verwenden.
Über c) werden große Flächen abgedeckt, Details und Feinheiten werden über a) modelliert.

Okay danke :)
Ja ich will kein Unityterrain benutzen weil ich Gras in meiner VoxelEngine generieren will, daher ist das Terrain ein generiertes Mesh ^^ (Voxel, nicht Boxel btw)

Werd mich mal bisschen in solche Shader einlesen bei Zeiten.

Bin nach wie vor für Voschläge offen (v.a. da jetzt auch der genaue Nutzen bekannt ist)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah ok die Oberfläche des Unity-Terrain an das Terrainmesh der VoxelEngine anzupassen wird denke ich eher schwierig und damit kannst du wohl nicht ein Unityterrain verwenden, um Gras darzustellen. Unmöglich wäre es nicht, man kann aus deinem VoxelTerrain auch eine Highmap erstellen und daraus ein Unityterrain erzeugen, aber nicht sehr dynamisch.

Also ich beschäftige mich gerade sehr viel mit dem Unityterrain, da ich ein komplettes Unityterrain in ein LowPolyterrain umwandeln möchte. Terrainmesh und Bäume habe ich bereits erzeugt. Das Original Unityterrain hatte 360k Triangles, das daraus generierte LowPoly-Terrain hat nur noch 11k Triangles (inklusive Bäume).
Ich habe mir mal die (Gras&Büsche)-Detailshader von Unity angeschaut, den Shader für ein Mesh habe ich zum Laufen bekommen (also beispielsweise für einen kleinen Busch). Die Blätter werden damit "im Wind" bewegt. Wobei man den "Wind" über ein Skript einspeisen muss.
Der "Billboard"-Detailshader funktioniert zwar, aber er reagiert nicht auf die Windparameter des Shaders. Ich vermute da werden intern noch irgendwo Vertex-Farben ausgelesen (die mein Quadmesh nicht hat), die die Verformung des Billboards bestimmen, aber hier habe ich dann aufgehört.
Den DetailMesh-Shader kann man zwar verwenden, der sieht nur gut aus, wenn das Objekt aus mehreren Faces besteht, für Gras also eher ungeeignet.
Aber selbst wenn man den "Billboard"-Detailshader (Gras) dazu bekommt sich zu bewegen, dann braucht man immer noch ein Tools zum Auftragen der Billboards auf eine Oberfläche und ggf. noch eine Methode um alle Meshes zu batchen (als 1 Mesh oder Instanced Meshes).

Ich bin bei der Erstellung meiner LowPoly-Terrain-Bäume auf eine interessante Komponente gestoßen, die könnte man denke ich auch gut für Gras verwenden, leider sehr schlecht dokumentiert und supported, da sie das Teil vermutlich nur wegen SpeedTree eingebaut haben.
https://docs.unity3d.com/Manual/class-BillboardRenderer.html

Ich habe sie für meine Billboardbäume bereits verwendet. Allerdings bewegen sich die Billboards von Haus aus ebenfalls nicht, dies muss wiederum der Shader erledigen, der im Billboard-SO-Asset hinterlegt ist. Der Billboard-SpeedTree-Shader sollte es eigentlich können (zumindest sieht der Shadercode danach aus), aber die Billboards bewegen sich selbst im Unityterrain nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe mir gerade noch einmal d) angeschaut. Es ist auch im Blacksmith Demo enthalten und nennt sich "PaintJob".
Wenn ich das richtig verstehe, dann erstellt man in der Szene sogenannte "PaintJobs". Über diese Paintjobs kann man nun auf den zuvor ausgewählten Meshes "malen" (ähnlich wie auf einem Unityterrain). Wenn man fertig, dann kann man die Vegetation "baken", hier werden dann Texturen und Detailmeshes für die Vegetation erzeugt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 34 Minuten schrieb Zer0Cool:

Ich habe mir gerade noch einmal d) angeschaut. Es ist auch im Blacksmith Demo enthalten und nennt sich "PaintJob".
Wenn ich das richtig verstehe, dann erstellt man in der Szene sogenannte "PaintJobs". Über diese Paintjobs kann man nun auf den zuvor ausgewählten Meshes "malen" (ähnlich wie auf einem Unityterrain). Wenn man fertig, dann kann man die Vegetation "baken", hier werden dann Texturen und Detailmeshes für die Vegetation erzeugt.

Mh ja das geht leider überhaupt nicht.
Das Terrain wird on the fly generiert wie in Minecraft (nur nicht blockig) und soll auch (theoretisch) unendlich groß werden können.
Daher muss das Gras effizient prozedural generiert werden können. Hab jetzt mal eingefügt, dass ich die Positionen des Gras generiere und jetzt schaue ich grad wie ich das performant hinkriege.
Ich hab mal eine Lösung gefunden wo dafür Unity Trees benutzt werden nur mit 2 Blättern als Grasblades (bzw. gekreuzte Quads für die Blades), werde da mal reinschauen, dann hätte ich nämlich auch direkt drinnen, dass das Gras vom Wind beeinflusst wird.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mhh naja dynamisch würde theoretisch auch gehen aber "PaintJob" ist schon manuell schwer zu bedienen und ich fürchte die Runtime-Api ist noch schlechter.
Die Idee mit dem Baum ist gut, du musst dann nur noch schauen, ob du die Bäume gebatched bekommst, weil das Unityterrain macht es in deinem Fall dann ja nicht. Mit "Glück" batched Unity die Bäume automatisch, aber da bin ich mir nicht sicher, wenn da Hilfe brauchst, sag bescheid, hab mich damit nun eh schon beschäftigt. Ich denke spätestens wenn du jeden Baum noch nachfärben möchtet, batched Unity es nicht mehr von alleine.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...