Jump to content
Unity Insider Forum
Sign in to follow this  
MustafGames

Custom Leaf Shader

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?

Share this post


Link to post
Share on other sites

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)
 

Share this post


Link to post
Share on other sites

Mir ist auch aufgefallen das der Tree Script meine Materialien umwandelt und dann reagieren sie auf Wind (Optimized Material), könnte man das auch auf eigene Shader anpassen so das z.b. ein normaler einfacher Surf-Shader umgewandelt wird?

Share this post


Link to post
Share on other sites

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"
  }

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×