Material verändern je nach Level Workflow

  • Schönen guten Tag,


    Ich habe mir Steine und Foliage erstellt, die ich via material collections at runtime verändern kann um Eigenschaften wie die Farbe anzupassen.


    Aber ich frage mich, wie genau ich das im Spiel umsetzen soll.

    Wenn ich Stein A an 3 verschiedenen Stellen benutze, und er immer anders aussehen soll, dann komme ich mit collection nicht weit, da sie ja alle Steine gleichzeitig verändert.


    Es gibt ja die Möglichkeit den Bewuchs von Steinen zu ändern, ob Grass, Sand oder gar nichts.

    Kann mir jemand sagen wie man das in Spielen realisieren kann? Oder muss ich für jede Gegebenheit eine neue Material Instance erstellen?

  • Bin mir zwar nicht ganz sicher, ob ich dich da richtig verstanden habe, aber ich glaube das, was du meinst, ist ein Basematerial mit diversen Parametern, du kannst dann mit Lerp und einem Parameter im Alphakanal verschiedene Eigenschaften und Aussehen des Basematerials ändern.


    Jetzt kommt es natürlich darauf an, was genau du machen willst. Das, was ich oben beschrieben habe, könnte Sinn ergeben, wenn du zum Beispiel verschiedene Metalle verwenden willst, wobei Silber halt in Silber glänzt, Gold gelb, Kupfer in grünlich usw.


    Wo es aber schnell nicht mehr funktioniert ist, wenn du Stein, Gras, Erde, diverse Metalle usw. in ein Material packen willst. Da solltest du dann schon jedes Mal ein eigenes Material erstellen, mit entsprechenden Eigenschaften und Aussehen etc.

  • Bin mir zwar nicht ganz sicher, ob ich dich da richtig verstanden habe, aber ich glaube das, was du meinst, ist ein Basematerial mit diversen Parametern, du kannst dann mit Lerp und einem Parameter im Alphakanal verschiedene Eigenschaften und Aussehen des Basematerials ändern.


    Jetzt kommt es natürlich darauf an, was genau du machen willst. Das, was ich oben beschrieben habe, könnte Sinn ergeben, wenn du zum Beispiel verschiedene Metalle verwenden willst, wobei Silber halt in Silber glänzt, Gold gelb, Kupfer in grünlich usw.


    Wo es aber schnell nicht mehr funktioniert ist, wenn du Stein, Gras, Erde, diverse Metalle usw. in ein Material packen willst. Da solltest du dann schon jedes Mal ein eigenes Material erstellen, mit entsprechenden Eigenschaften und Aussehen etc.

    Erstmal vielen Dank für die Antwort.

    Ich meinte viel mehr den Workflow.
    Mal angenommen ich habe einen Stein, den ich über Parameter jederzeit farblich ändern kann. (Das wird ja über Material Collections ermöglicht.)
    Und ich möchte ihn in meinem Wald grün einfärben und den gleichen Stein in meiner Höhle gerne Braun einfärben.
    Aber wenn ich das über material collections mache, dann färbe ich alle steine immer in der gleichen Farbe ein. Aber ich möchte ja unterschiedliche haben.

    Es wird im Marketplace ja immer damit geworben, dass die Steine Moos oder Sand haben können. Deswegen kam mir die Frage wie man das mit handhabt.

    Wahrscheinlich für jede Möglichkeit ein Material Instance anfertigen und anpassen...
    Ich dachte es gäbe halt eine clevere Variante.
    Ich habe halt Steine, die alle eine andere Textur haben, somit müsste ich jeden Stein mit einer neuen Instance erstellen etc.
    das wirkt für mich nicht sehr gut gelöst.

    • Offizieller Beitrag

    So wird das nicht funktionieren. Alles was du in Unreal Importierst und im Content Browser auftaucht ist eine Instanz. Sobald du das Mesh in den Viewport ziehst, ist dieses Mesh im Viewport im grunde ein Child Objekt von dem Mesh im Contentbrowser.

    Überschreibst du die FBX durch ein anderes Mesh, werden alle Meshes im Viewport ersetzt.

    Das selbe gilt auch für Texturen die du importierst und ersetzen tust.

    Das Material ist sozusagen der Container wo alle Texturen zusammenlaufen.

    Soll jeder Stein eine andere Textur haben, musst du im grunde von deinem Steinmaterial weitere Instanzen erstellen. Was ziemlich schnell in die Performance geht.

    Du hast vermutlich nicht nur einen Stein sondern zb 5 Steine mit jeweils 4 unterschiedlichen Farben. Das alleine wären 20 Materials mit mindestens 20 Drawcalls. Und das bei nur 4 Steine.


    Aber es gibt Tricks:


    Viele erstellen Ihre Textur zb im Substance Painter und erstellen für jedes Mesh eine spezielle Textur. In großen Games, würde man dies so nicht machen und die Texturen in einem Atlas verstecken.


    Bei star citizen zb wird mit sog. Meshcalls gearbeitet. Das heißt ein Gitter hat vier Schrauben, die Schraube sind im Mesh aber nur 4 Planes. Kostenpunkt der 4 Schrauben wären 2 * 4 Tris = 8 Tris pro Gitter. Kostet quasi nichts.

    Jetzt hat man den Vorteil, das eine Textur erstellt, auf der es zb10 Verschiedene Schraubenarten gibt. Bei einer 1k Textur wären dies ca 102 Pixel pro Schraube. Was ebenfalls locker möglich wäre und eine sehr hohe Textur Auflösung ermöglichen wurde.


    Bei deinen felsen, ich benutze einfach mal das Plural könnte ich mir das so vorstellen:

    1. Du hast 10 Verschiedene Steine: Jeder Stein kostet dich ein Mesh drawcall (10 insgesamt)

    2. Du hast ein Material mit einer 1k Textur (1024 px) das du für alle Steine verwendest, dieses Material beinhaltet viereckige Quadrate die in deinen Steinfarben eingefärbt sind. Über diese Farbe, definierst die Farbe von jedem Stein.

    Das schöne: DIeses Material kostet dich 1 Drawcall und du hast die Möglichkeit die Farbe alle Felsen einzufärben. Für jeden Felsen, kannst du eine andere der 10 Farben wählen.


    Ich weiß genau was du jetzt denkst: Na Toll dann habe ich verschiedene Steine die hässlich eingefärbt sind. Deswegen brauchst du noch sog. Decals dazu:

    Ein Decal ist ein weiteres Material das zb nur eine Normal, Roughness, Metallic enthält. Es sorgt für dieses felsige aussehen.

    Dieses Decals kannst du jetzt für alle Steine verwenden egal ob groß oder klein.

    Du kannst natürlich dazu auch mehre Decals erstellen die andere Normals enthalten damit entsteht jeweils nur 1 weiterer Drawcall.


    Dieses Decals könntest du dann auch für andere dinge verwenden beispielsweise einer Mauer.


    Mesh decals sind zwar unscheinbar werden aber im grunde in allen AAA Spielen verwendet.

    Bei einer Steintreppe, sieht jede Stufe bzw die Kante häufig anderst aus. Das liegt daran das jede Stufe über eine Mesh decal verfügt und jedes Meshdecal im grunde ein Teil eines Textur Atlanten (Schreibt man das so?) ist.


    Hier gibts ein Beispiel dazu: https://blog.gametextures.com/…s-and-skirts-bc5afe389689




    Das ist definitv sehr viel Arbeit :)


    PS.: In deinem Fall würdest du normale Decals und keine Mesh Decalls verwenden.

  • Vielen vielen dank für die ausführliche Erklärung.


    Wahrscheinlich schon etwas zu tiefgründig :D


    Dennoch weiß ich immernoch nicht so wirklich was ich tun soll. Okay decals, das kenn ich.


    Mir gehts nur darum, dass ich einen einzigen Stein in verschiedenen Ausführungen im Level haben möchte. Diese Einstellungen, die man via material instance wählen kann.

    Wie im Anhangbild gezeigt.

    Sorry, wenn ich das nicht richtig verstanden habe, denn das ist mir ein Buch mit 7 Siegeln.