Jump to content
Unity Insider Forum

Custom Leaf Shader


MustafGames

Recommended Posts

Grüße,

Wie funktionieren die Nature Shader, so das dass Objekt mit der Windzone interagiert?

Bin mit Shadern nicht so gut vertraut und bräuchte mal Fachkunde, welche Werte im Shader den Wind machen, habe gelesen das hängt mit einer 2ten UV Map zusammen, stimmt das?

Mein Ziel ist es:

1. Shader, welcher grundsätzlich ein Texture-Atlas nutzt und einige Funktionen hat:

Ich möchte das der Shader erstmal der einzigste ist welcher in der Szene aktiv ist, er soll für Bäume (die mit den Unity Tree Creator erstellt wurden) benutzt werden, also für Blätter und Stamm gleichzeitig, man soll ihn aber auch als normalen Shader für z.b. Felsen nutzen können ohne das da dann der Wind den Felsen bewegt.

Er soll die ganzen Standart-Werte für Normal-Texture, Emmision auch haben. Praktisch wie der Nature/Tree Creator Leaves Shader nur mit Instanzing und das bei allen Variablen von Color bis zu den Normal Texturen.

Ich würde erstmal anfangen mir einen Shader zu schreiben, welcher einen Texture Atlas nutzt und eine Color Variable, beides soll per GPU gestützt werden, so das die Batch-Calls reduziert werden.

 

Mfg Mustaf

PS: Hab mir zwei Finger bei meiner Schreibhand gebrochen, daher können einige Tippfehler drin sein.

 

Zusatzfrage:

Wie kann man den RenderMode in einem Shader einbinden und diesen während der RunTime ändern per Script?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hatte mir die Tree Creator Shader ja mal angeschaut und sie gehen (soweit ich gesehen habe) nicht über die 2. UV Map (die nutzt Unity ja für Lightmaps) sondern sie gehen über die Vertexfarben. Die Vertexfarbe bestimmt dabei, ob der entsprechende Vertex (im Shader) bewegt wird oder nicht. Bei einem Blatt würden sich beispielsweise die beiden Vertices die nicht am Ast anliegen eine Farbwert bekommen, die eine maximale Beweglichkeit definiert (hoher Farbwert). Ich denke die Vertexfarben für die Äste werden entsprechend gesetzt. Vertices die sich nah am Hauptstamm befinden bekommen einen niedrigen Farbwert (=geringe Beweglichkeit),  mit zunehmendem Abstand vom Hauptstamm (bzw. Teilast) nimmt die Beweglichkeit der Vertices zu (höhere Farbwerte). Ob nun der R / G oder B Channel der Vertexfarbe verwendet wird um die Intensität der Windbewegung zu setzen wird dabei im Shader definiert.

Felsen würden bei deinem Shader dann die "0" Entsprechung der Vertexfarbe (R / G / B = 0) bekommen.

RenderMode:
Man definiert einen entsprechenden (Light)Pass für den jeweiligen Rendermode. Der eingestellte Rendermode wählt dann den entsprechenden Pass den Shaders. Für einen spezifischen Rendermode muss also ein eigener Codeabschnitt im Shader erstellt werden. Der Rendermode wird allerdings über die Kamera definiert (d.h. hier müsste man den Mode per Skript umsetzen)
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke das Tree-Script schreibt Vertexfarben direkt in dem Baummesh ... Ein eigener Shader müsste dann diese Vertexfarben auslesen und könnte damit "Wind" simulieren.

Die Vertexfarben definieren dabei aber nur, wie stark der jeweilige Vertex von Wind verändert werden kann ...

Der Shader selbst benötigt noch die Daten der (Unity)Windzone (die man aber leider nicht selbst auslesen kann). Ansonsten berechnet der Shader nun anhand der Winddaten und einer Zeitfunktion über Sinus und Cosinus die jeweiligen Positionen der Vertices der Blätter und der Baumäste (ganz grob erklärt)....

Eventuell kann man die Unity-WIndzone auch anzapfen, wenn man seine Schnittstelle des Shader so wie die Shader des Tree Creators definiert, aber ob dies funktioniert, da bin ich auch überfragt. Zudem kann es sein, daß man Windzonendaten nur bekommt, wenn man den Baummesh über das Terrain (Paint) setzt. Frei stehende Bäume haben dann also überhaupt keine Chance an die Unity-WInddaten zu kommen .. 
Laut meinen Versuchen braucht man aber eigentlich die Unity-Winddaten nicht unbedingt, man kann eine WIndrichtung und Stärke auch selber im Shader definieren ...

Hier ein sehr simpler Shader der die Vertexfarben darstellt. Wenn du den Tree-Creator-Baummesh mal damit darstellst solltest du die Vertexfarben sehen (habs aber noch nicht getestet):

Shader "Example/Diffuse Vertexcolor" {
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert
      struct Input {
          float4 color : COLOR;
      };
      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = color.rgb;
          // ggf. rausnehmen wenn man nix sieht
          o.Alpha = color.a;
      }
      ENDCG
    }
    Fallback "Diffuse"
  }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...