Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Creare alberi

Questo è un breve tutorial su come creare alberi e altri tipi di vegetazione partendo da zero.

L'intenzione non è concentrarsi sulle tecniche di modellazione (esistono molti tutorial a riguardo), ma su come abbellirle in Godot.

../../_images/tree_sway.gif

Comincia con un albero

Abbiamo preso quest'albero da SketchFab:

../../_images/tree_base.png

https://sketchfab.com/models/ea5e6ed7f9d6445ba69589d503e8cebf

e la abbiamo aperta in Blender.

Dipingere con colori di vertice

La prima cosa che si potrebbe fare è usare i colori dei vertici per disegnare quanto l'albero oscillerà quando c'è vento. Nel programma di modellazione 3D scelto, tramite lo strumento di pittura dei colori di vertice, dipingere qualcosa del genere:

../../_images/tree_vertex_paint.png

È un po' esagerato, ma l'idea è che il colore indichi l'ampiezza dell'oscillazione che influisce su ogni parte dell'albero. Questa scala la rappresenta meglio:

../../_images/tree_gradient.png

Scrivere uno shader personalizzato per le foglie

Questo è un esempio di shader per le foglie:

shader_type spatial;
render_mode depth_prepass_alpha, cull_disabled, world_vertex_coords;

Questo è uno shader spatial. Non c'è un culling sul fronte/retro (quindi le foglie sono visibili da entrambi i lati) e viene utilizzato il pre-passaggio alfa, quindi ci sono meno artefatti di profondità derivanti dall'uso della trasparenza (e le foglie proiettano ombre). Infine, per l'effetto di oscillazione, si consigliano le coordinate globali, in modo che l'albero possa essere duplicato, spostato, ecc. e continui a funzionare insieme ad altri alberi.

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

Qui viene letta la texture, nonché il colore di trasmissione, il quale viene utilizzato per aggiungere un po' di retroilluminazione alle foglie, simulando l'effetto subsurface scattering.

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

Questo è il codice per creare l'oscillazione delle foglie. È semplice (usa solo un'onda sinusoidale moltiplicata per il tempo e la posizione dell'asse, però funziona bene). Nota che l'intensità è moltiplicata per il colore. Ogni asse usa un piccolo, diverso fattore di moltiplicazione di circa 1,0 affinché gli assi non appaiano sincronizzati.

Infine, tutto quello che rimane è lo shader di frammenti:

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

E questo è praticamente tutto.

Lo shader del tronco è simile, tranne che non scrive sul canale alfa (quindi non è necessario alcun pre-passaggio alfa) e non richiede trasmissione per funzionare. Entrambi gli shader si possono migliorare aggiungendo mappe normali, AO e altre mappe.

Migliorare lo shader

Esistono molte altre risorse su come procedere da poter consultare. Ora che si conoscono le basi, si consiglia di leggere il capitolo di GPU Gems3 su come Crysis fa questo (concentrarsi principalmente sul codice di oscillazione, in quanto molte delle altre tecniche mostrate sono obsolete):

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