Создание деревьев
Это краткое руководство о том, как создавать деревья и другие виды растительности с нуля.
Цель — сосредоточиться не на методах моделирования (есть множество обучающих программ на эту тему), а на том, как сделать так, чтобы они хорошо смотрелись в 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;
}
И это практически все.
Шейдер trunk похож, за исключением того, что он не записывается в альфа-канал (поэтому не требуется предварительный альфа-пасс) и не требует передачи для работы. Оба шейдера можно улучшить, добавив нормальное отображение, AO и другие карты.
Улучшение шейдера
Есть много других ресурсов о том, как это сделать, которые вы можете прочитать. Теперь, когда вы знаете основы, рекомендуем прочитать главу из GPU Gems3 о том, как Crysis делает это (сосредоточьтесь в основном на коде sway, так как многие другие методы, показанные там, устарели):
https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch16.html