Jump to content
Unity Insider Forum

Per-Vertex Texture Blending


Tiwaz

Recommended Posts

Moin,

 

also ich hab ja hier meine Voxel Engine, die ich gern texturieren möchte. Das mach ich über einen Triplanar Surface Shader.

Mein Problem ist jetzt der Multimaterial-Fall also Materialien im Sinne der Voxelmaterialien (Gras, Sand, Stein, etc)

 

Jetzt ist es ja so, dass bei einem Dual Extraktionsansatz jedes Voxel (das das Surface enthält) 1 Vertex ausspuckt und somit jeder Vertex ein eigenes Material und eine spezielle Textur hat.

 

Provisorisch hab ich jetzt mal 2 Materialien mit 2 Texturen eingeführt, die auch "richtig" geshaded werden, allerdings hab ich zwischen den Materialien harte Übergänge, was unschön aussieht..

Später sollen die Texturen über die Material ID (die ich über TEXCOORD0 oder vertexColor in den Shader bringe) aus einem Texture Array ausgewählt werden.

 

Das Problem:

Ich kann nicht zwischen den umliegenden Texturen interpolieren, da im Fragment/Surface Shader ja nur die Daten von 1 Vertex verfügbar sind, somit weiß ich nicht welche Materialien die anderen Vertices haben und folglich mit welchen Texturen konkret interpoliert werden soll.

 

Meine Frage:

Kann ich irgendwie meine "Vertex Textur" mit allen umliegenden Texturen interpolieren (ähnlich zu dem gradiellen Verhalten von Vertex Colors) ohne die anderen Texturen konkret zu kennen?

Meine Befürchtetungen sind, dass es im Fragment/Surface Shader schon zu spät ist, um sowas vom Shader machen zu lassen.. Der Rasterizer hat dann ja schon alles interpoliert.. Kann man dann eventuell im Geometry Shader schon reingrätschen und da Texturen verteilen?

 

Hoffe ich hab mich halbwegs klar ausgedrückt, falls nicht bitte einfach nochmal nachfragen, dann versuch ichs besser zu erklären, evtl mit Bilder, bin grade am Handy, da ist das ein bisschen umständlich ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab nochmal ein bisschen drüber nachgedacht und da ist mir eingefallen, dass man ja auch einfach die Material IDs aller 3 Vertices reinstecken kann, die für das Triangle interessant sind.. Die sind ja beim Meshing bekannt. Dann wären auch alle 3 Texturen im Shader bekannt und man könnte wieder normal interpolieren.

 

Dann stellt sich allerdings die Frage nach dem t, also wie stark (pro Fragment) interpoliert werden soll, da müssten ja dann wieder die relativen Positionen der Vertices bzw. die Kantenlängen/Distanzen zwischen denen bekannt sein, um die Werte für die Fragments berechnen zu können..

Ich bezweifle mal, dass solche Infos bis zum Fragment Shader kommen?

Man könnte das ja im Zweifelsfall auch wiederum über TexCoords oder so reinspeisen, aber ich befürchte irgendwie, dass bei so viel Daten (3 TexCoords? Texcoord0 für Material IDs, Texcoord1 und 2 für relative Positionen) der Shader langsam wird :o

Die Daten müssen ja dauernd in die GPU geschaufelt werden..

Oder geht das noch klar?

Hab noch keine Erfahrungen mit Shadern, kann das nicht so abschätzen ^^

 

Finde die Voxel Engine halt sehr Performance-kritisch, da wird ja "nur" das Terrain berechnet. Das sollte dann ohne übermäßig großen Overhead/Rechenaufwand von statten gehen, sonst bleibt ja nix mehr für das eigentliche Spiel übrig ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin Tiwaz!

 

Deinen Beitrag finde ich echt sehr interessant, beschäftige ich mich ja auch zur Zeit mit der Optimierung des Terrains (Das Ziel: Erhöhung der FPS, um mehr Platz für Animationen etc schaffen zu können) . Zumal ich dort auch sehr anspruchsvoll bin, was die Terrain-Darstellung anbelangt, zwingt mich nun doch, mehr in die Tiefe dieser Thematik zu gehen. Ehrlich gesagt, Deine obigen Beiträge sind auf einem sehr hohen Niveau, und ich tue mich da echt schwer, Dir folgen zu können, zumal ich da so ziemlich am Anfang der Optimierung stehe.

 

Also, ich habe da schon viele Terrain-Engines getestet, wie ErosionBrush, TerrainComposer in Verbindung mit WorldComposer,Gaia, Voxeland, MapMagic und World Creator Professional. Das Relief Terrain Pack habe ich da noch nicht getestet, weil ich die Befürchtung habe, das die FPS-Rate dann noch weiter in die Knie geht. Zugegeben, ich war es selber Schuld, wenn ich die vorhandenen Texturen, so wie sie waren, ohne eine jegliche Änderung in meinem Terrain übernommen habe. Hauptsache, dass Terrain sah super aus. Was da an FPS, Tris und Verts heraus gekommen ist, darf ich Dir gar nicht berichten. :-) Kurzerhand habe ich die Texturen in der Max Size geändert und habe somit in in den Tris und Verts ein besseres Ergebnis erzielt, wenn auch noch nach meiner Meinung immer noch zu hoch (Verts: 394.6k, Tris 389.6k).

 

Deiner Schlussfolgerung, dass eine Voxel-Engine sehr performance-kritisch ist, kann ich da nur zustimmen! Aber Moment mal, ist man denn nicht selbst die Ursache? Jede Engine, die man mit den vorhanden Texturen füttert, kann aus diesem Grunde auch nur derartige Ergebnisse liefern. Dies heißt auch im Umkehrschluss, das ich die Texturen entsprechend bearbeiten sollte. Verts and Tris sind ja nichts anderes als Polygone, die auf ein erträgliches Maß (für das Auge akzeptabel) reduziert werden müssen. Zwangsläufig wird man dann bei der optimalen Findung zur Darstellung der Texturen zu einem Kompromiss kommen müssen, weil wo sollen die Prioritäten gelegt werden (bei einer ansehnlichen Darstellung, oder zugunsten der Frame-Rate)? Soweit ich es (nach meinem heutigen Kenntnisstand) in Erfahrung bringen konnte, liegt eine Problematik in dem Tessalations-Prozess. Demnach (mit Sicherheit ist Dir das schon geläufig), das N-Gon's schwierig zu handeln sind, gefolgt von Tris und Quads. Ehrlich gesagt, ich habe keine Ahnung im Moment, mit welcher Software hier eine Manipulation vorgenommen werden kann. Selbstverständlich hat auch eine Textur weitere Attribute, die man verändern kann, um die Tris und Vertrs auf ein erträgliches Maß zu reduzieren. Das ist ein echt heisses und ergiebiges Thema. Deshalb hier auch ein paar hilfreiche Links:

 

https://books.google.de/books?id=ik6gCgAAQBAJ&pg=PT153&lpg=PT153&dq=unity+was+sind+Tris&source=bl&ots=ouKzNH-XGw&sig=aVgr3vVP2GIkb0Wq4lhbmq1UNgk&hl=en&sa=X&ved=0ahUKEwiHmoj35Y7QAhXE1SwKHS0dBr8Q6AEIKTAC#v=onepage&q=unity%20was%20sind%20Tris&f=false

 

https://docs.unity3d.com/Manual/SL-SurfaceShaderTessellation.html

 

https://books.google.de/books?id=ik6gCgAAQBAJ&pg=PT180&lpg=PT180&dq=unity+was+ist+der+Aniso-Level+bei+texturen&source=bl&ots=ouKzNH-1Lz&sig=j1fXy6VgHC058IKlPILpRiXjrd0&hl=en&sa=X&ved=0ahUKEwi-3rKu6I7QAhUIdCwKHZ9XAhoQ6AEIIzAB#v=onepage&q=unity%20was%20ist%20der%20Aniso-Level%20bei%20texturen&f=false

 

Leider besitze ich noch keinen Triplanar Surface Shader. Wenn ich es so richtig kapiert habe, ist das eine Software, die Dir die Texturen aufarbeitet. Diese Texturen verarbeitest Du zur Auswahl in einem Array, sagen wir kleinen Datenbank. Wenn dem so ist, (weiß ich nicht, reisse mir nicht gleich den Kopf ab) solltest Du schon in einer Vorabbearbeitung der Texturen diese entsprechend Tri-und Verts-freundlich verarbeitet haben. Dies bedeutet aber auch, nach vielen austesten der Attribute der Texturen, nur die optimalen Texturen in dieser Software einzustellen. So würde ich jedenfalls vorgehen. Zu Deiner Frage, ob man damit die umliegenden Texturen interpolieren kann, ohne die anderen Texturen konkret kennen zu müssen, würde ich nach meinem jetzigen Kenntnisstand mit einem jaein beantworten. Das Nein deshalb, weil ich befürchte, das bei etwaigen hochauflösenden Texturen die Verts und Tris in die Knie gehen. Alleine aus diesem Grund solltest Du schon genau wissen, nach meiner Meinung, was da so alles zur Auswahl in Deinem Array zur Auswahl kommen sollte.

 

Ich hoffe doch, dass ich Dir mit meinen anfänglichen Vermutungen etwas helfen konnte. Aber jetzt habe ich schon für mich durch Deinen Beitrag einen echten Vorteil für mich gewonnen: Ich habe hier ganz schon dazugelernt.

 

Have a nice weekend.

<div> </div>

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 weeks later...

Hallo SpaceMarder,

sry, dass ich mich so spät rückmelde, ich war jetzt etwas länger nicht mehr in Unity unterwegs.

 

Also ich glaube du hast da ein paar Fehlinformationen.

Die Texturen haben in erster Linie nichts mit den Vertices und Triangles zu tun (bei Tessellation mit Displacement Maps schon, sofern man Displacement Maps als Textur versteht aber ich benutze keine Tesselierung)

Eine hochauflösende Textur ändert den Vertex/Triangle Count nicht.

 

Auch sind Triplanar Shader keine Programme die die Texturen aufarbeiten, es ist einfach ein Shader mit dem es möglich ist Texturen ohne "feste lokale" UV Koordinaten auf die Objekte zu projizieren.

Wie das genau funktioniert ist z.B. hier sehr gut beschrieben, falls du dich dafür interessierst

gamedevelopment.tutsplus.com/articles/use-tri-planar-texture-mapping-for-better-terrain--gamedev-13821

 

Also wie gesagt ich benutze da keine Tessellation in dem Sinn. Im Prinzip ahme ich Tessellierung nach indem ich mein Terrain in sog. Chunks aufteile und je nach Entfernung zum Spieler mehr oder weniger detaillierte Meshes erzeuge, aber das mache ich alles "per Hand" (natürlich per Code aber das habe ich alles selber geschrieben und hab dadurch auch volle Kontrolle und vor allem unabhängig von Texturen/Maps)

Auch generiere ich ausschließlich Triangle out-of-the-box (wie gesagt, ich hab das alles selber geschrieben, ich hab da volle Kontrolle ^^) und hab das Problem nicht N-Gone triangulieren zu müssen. (das N-Gon Problem liegt eher beim Import von Nicht-Unity Tools in Unity, da Unity nur mit Triangles arbeitet und dort ein Triangulierer beim Import läuft und es dann zu unerwünschten Effekten kommen könnte, grade bei Animationen)

 

Die Performance ist für mich übrigens nicht wegen großen Texturen oder ähnliches relevant (zu dem Zeitpunkt gibt es bereits ein "optimiertes" Mesh, das nicht mehr tesselliert wird oder ähnlich bearbeitet), sondern weil ich vermeiden möchte mehrere Passes zu haben um die Texturen verblenden zu können (also, dass sie ineinander über gehen und keine harte Kanten dazwischen sind)

 

hm joa.. ich bin seit dem nicht mehr weiter gekommen, weil ich, wie eingangs schon erwähnt, schon eine Weile nicht mehr in Unity war und jetzt versuche ich erst mal alles nach Unreal (bzw. C++) zu portieren ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich kann zu der Voxelengine nicht viel sagen, aber deine geschilderten Probleme klingen ähnlich, wie die die es auch durch den Terrainshader von Unity zu lösen gilt. Eine Oberfläche, verschiedene Materialien und die Übergänge zwischen diesen. Vielleicht kannst du dir da beim Builtinshader einiges abschauen oder es ähnlich lösen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...