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.
Checking the stable version of the documentation...
Виготовлення дерев
Це короткий посібник про те, як створити дерева та інші види рослинності з нуля.
Мета полягає не в тому, щоб зосередитися на техніках моделювання (про це є багато посібників), а в тому, як зробити так, щоб вони добре виглядали в Godot.
Початкові дані дерева
Я взяв це дерево зі SketchFab:
https://sketchfab.com/models/ea5e6ed7f9d6445ba69589d503e8cebf
і відкрив його в Blender.
Розфарбуйте кольорами вершин
Перше, що ви можете зробити, це використати кольори вершин, щоб позначити, наскільки дерево буде коливатися під час вітру. Просто скористайтеся інструментом малювання кольором вершин вашої улюбленої програми 3D-моделювання та намалюйте щось на зразок цього:
Це трохи перебільшено, але ідея полягає в тому, що колір вказує на те, наскільки сильно коливання впливає на кожну частину дерева. Ось ця шкала представляє це краще:
Напишіть спеціальний шейдер для листя
Це приклад шейдера для листя:
shader_type spatial;
render_mode depth_prepass_alpha, cull_disabled, world_vertex_coords;
Це просторовий шейдер. Немає переднього/заднього вибракування (так що листя можна побачити з обох сторін), і використовується альфа-пропуск, тому є менше артефактів глибини, які є результатом використання прозорості (і листя відкидає тінь). Нарешті, для ефекту коливання рекомендовано світові координати, тому дерево можна дублювати, переміщувати тощо, і воно все одно працюватиме разом з іншими деревами.
uniform sampler2D texture_albedo : source_color;
uniform vec4 transmission : source_color;
Тут зчитується текстура, а також колір передачі, який використовується для додавання заднього освітлення до листя, імітуючи розсіювання під поверхнею.
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;
}
Це код для створення коливання листя. Це простий (просто використовує синусоїду, яка множиться на час і положення осі, але працює добре). Зауважте, що сила помножена на колір. Кожна вісь використовує різний малий коефіцієнт множення близько 1,0, тому осі не відображаються синхронно.
Нарешті, все, що залишилося, це фрагментний шейдер:
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;
}
І це майже все.
Магістральний шейдер схожий, за винятком того, що він не записує в альфа-канал (тому не потрібен попередній проход альфа-каналу) і не потребує передачі для роботи. Обидва шейдери можна покращити, додавши нормальне відображення, AO та інші карти.
Покращення шейдера
Є багато інших ресурсів про те, як це зробити, які ви можете прочитати. Тепер, коли ви знаєте основи, рекомендуємо прочитати розділ із GPU Gems3 про те, як це робить Crysis (здебільшого зосередьтеся на коді sway, оскільки багато інших показаних там методів застаріли):
https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch16.html