Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Erstellen von Bäumen

Dies ist ein kurzes Tutorial, wie man Bäume und andere Arten von Vegetation von Grund auf erstellt.

Das Ziel ist nicht, sich auf die Modellierungstechniken zu konzentrieren (dazu gibt es viele Tutorials), sondern darauf, wie man sie in Godot gut aussehen lässt.

../../_images/tree_sway.gif

Beginnen Sie mit einem Baum

Ich habe diesen bei SketchFab heruntergeladen:

../../_images/tree_base.png

https://sketchfab.com/models/ea5e6ed7f9d6445ba69589d503e8cebf

und in Blender geöffnet.

Malen mit Vertex-Farben

Als erstes können Sie mit den Vertex-Farben malen, wie stark der Baum bei Wind schwanken wird. Verwenden Sie einfach das Werkzeug zum Malen von Vertexfarben in Ihrem bevorzugten 3D-Modellierungsprogramm und malen Sie etwas wie das hier:

../../_images/tree_vertex_paint.png

Dies ist hier ein wenig übertrieben dargestellt, aber die Idee ist, dass die Farbe anzeigt, wie beweglich jeder Teil des Baumes ist. Diese Skala hier stellt es besser dar:

../../_images/tree_gradient.png

Schreiben Sie einen eigenen Shader für die Blätter

Dies ist ein Beispiel eines Shaders für Blätter:

shader_type spatial;
render_mode depth_prepass_alpha, cull_disabled, world_vertex_coords;

Dies ist ein Spatial Shader. Es gibt kein Front-/Back-Culling (so dass die Blätter von beiden Seiten gesehen werden können), und es wird ein Alpha-Vorldurchlauf verwendet, so dass es weniger Tiefenartefakte gibt, die durch die Verwendung von Transparenz entstehen (und die Blätter werfen Schatten). Schließlich werden für den Schwankungseffekt Weltkoordinaten empfohlen, damit der Baum dupliziert, verschoben etc. werden kann und trotzdem mit anderen Bäumen zusammenarbeitet.

uniform sampler2D texture_albedo : source_color;
uniform vec4 transmission : source_color;

Hier wird die Textur sowie eine Transmissionsfarbe ausgelesen, die dazu dient, die Blätter etwas hinterleuchtet darzustellen, um so das Subsurface Scattering zu simulieren.

uniform float sway_speed = 1.0;
uniform float sway_strength = 0.05;
uniform float sway_phase_len = 8.0;

void vertex() {
    float strength = COLOR.r * sway_strength;
    VERTEX.x += sin(VERTEX.x * sway_phase_len * 1.123 + TIME * sway_speed) * strength;
    VERTEX.y += sin(VERTEX.y * sway_phase_len + TIME * sway_speed * 1.12412) * strength;
    VERTEX.z += sin(VERTEX.z * sway_phase_len * 0.9123 + TIME * sway_speed * 1.3123) * strength;
}

Dies ist der Code, um die Bewegung der Blätter zu erzeugen. Es ist einfach (verwendet wird nur eine Sinuswelle, die mit der Zeit und der Achsenposition multipliziert wird, funktioniert aber gut). Beachten Sie, dass die Stärke mit der Farbe multipliziert wird. Jede Achse verwendet einen anderen kleinen Multiplikationsfaktor nahe 1.0, so dass Achsen nicht synchron erscheinen.

Zum Schluss bleibt nur noch der Fragment-Shader:

void fragment() {
    vec4 albedo_tex = texture(texture_albedo, UV);
    ALBEDO = albedo_tex.rgb;
    ALPHA = albedo_tex.a;
    METALLIC = 0.0;
    ROUGHNESS = 1.0;
    TRANSMISSION = transmission.rgb;
}

Und das ist so ziemlich alles.

Der Stamm-Shader ist ähnlich, außer das er nicht in den Alphakanal schreibt (daher ist kein Alpha-Vordurchlauf erforderlich) und erfordert keine Transmission, um zu funktionieren. Beide Shader können durch Hinzufügen von Normal Maps, AO und anderen Maps verbessert werden.

Verbessern des Shaders

Es gibt viele weitere Ressourcen, die Sie lesen können. Da Sie nun die Grundlagen kennen, ist es empfehlenswert, das Kapitel von GPU Gems3 zu lesen, wie dies in Crysis umgesetzt wurde (konzentrieren Sie sich hauptsächlich auf den Code, der die Bewegungen beschreibt, da viele andere Techniken dort veraltet sind):

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch16.html