Написать простой шейдер воды в Godot 4 с волнами и прозрачностью
Рейтинг: 57.8% · 13 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
- oleg_linux
- Сообщения: 9
- Зарегистрирован: Вт май 12, 2026 12:32 am
Написать простой шейдер воды в Godot 4 с волнами и прозрачностью
Делаю игру с видом сверху, нужна вода — волны, лёгкая прозрачность, блики. В Godot 4 попробовал Visual Shader но там запутался с нодами. Можно ли написать это на GDShading Language текстом? Примеры которые нашёл либо для Godot 3 (не работают), либо слишком сложные с кучей непонятных uniform. Покажите базовый рабочий вариант для 3D MeshInstance с PlaneMesh.
✔ Лучший ответ выбран автором и совпадает с автоматическим подбором — dmitry4381
Вот рабочий базовый шейдер воды для Godot 4 (проверял на 4.2). Создай новый ShaderMaterial на своём PlaneMesh и вставь это: shader_type spatial; render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_burley, specular_schlick_ggx; uniform vec4 water_color : source_color = vec4(0.1, 0.4, 0.8, 0.6); uniform float wave_speed = 1.0; uniform float wave_height = 0.1; uniform sampler2D noise_textur…
Re: Написать простой шейдер воды в Godot 4 с волнами и прозрачностью
GDShading Language в Godot 4 — это по сути GLSL с небольшими отличиями, так что примеры из интернета переносятся несложно. Главное отличие от Godot 3: теперь spatial шейдер, а не просто shader type spatial. И built-in переменные немного поменялись.
- dmitry4381
- Сообщения: 4
- Зарегистрирован: Вт май 19, 2026 12:41 pm
Re: Написать простой шейдер воды в Godot 4 с волнами и прозрачностью
✔ Лучший ответ — выбран автором и совпадает с авто-подбором
Вот рабочий базовый шейдер воды для Godot 4 (проверял на 4.2). Создай новый ShaderMaterial на своём PlaneMesh и вставь это:
shader_type spatial;
render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_burley, specular_schlick_ggx;
uniform vec4 water_color : source_color = vec4(0.1, 0.4, 0.8, 0.6);
uniform float wave_speed = 1.0;
uniform float wave_height = 0.1;
uniform sampler2D noise_texture : hint_default_white;
void vertex() {
vec2 uv_offset = UV + vec2(TIME * wave_speed * 0.1);
float noise = texture(noise_texture, uv_offset).r;
VERTEX.y += sin(VERTEX.x * 3.0 + TIME * wave_speed) * wave_height;
VERTEX.y += cos(VERTEX.z * 2.5 + TIME * wave_speed * 0.7) * wave_height * 0.5;
VERTEX.y += (noise - 0.5) * wave_height * 0.3;
}
void fragment() {
vec2 uv1 = UV + vec2(TIME * 0.05, TIME * 0.03);
vec2 uv2 = UV - vec2(TIME * 0.03, TIME * 0.07);
float n1 = texture(noise_texture, uv1 * 2.0).r;
float n2 = texture(noise_texture, uv2 * 3.0).r;
vec3 normal_offset = vec3(n1 - 0.5, 1.0, n2 - 0.5) * 0.3;
NORMAL = normalize(NORMAL + normal_offset);
ALBEDO = water_color.rgb;
ALPHA = water_color.a;
METALLIC = 0.0;
ROUGHNESS = 0.05;
SPECULAR = 0.9;
}
Для noise_texture подключи любую Noise Texture из ресурсов Godot (NoiseTexture2D с FastNoiseLite). Параметры wave_height и wave_speed крути по вкусу через инспектор.
shader_type spatial;
render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_burley, specular_schlick_ggx;
uniform vec4 water_color : source_color = vec4(0.1, 0.4, 0.8, 0.6);
uniform float wave_speed = 1.0;
uniform float wave_height = 0.1;
uniform sampler2D noise_texture : hint_default_white;
void vertex() {
vec2 uv_offset = UV + vec2(TIME * wave_speed * 0.1);
float noise = texture(noise_texture, uv_offset).r;
VERTEX.y += sin(VERTEX.x * 3.0 + TIME * wave_speed) * wave_height;
VERTEX.y += cos(VERTEX.z * 2.5 + TIME * wave_speed * 0.7) * wave_height * 0.5;
VERTEX.y += (noise - 0.5) * wave_height * 0.3;
}
void fragment() {
vec2 uv1 = UV + vec2(TIME * 0.05, TIME * 0.03);
vec2 uv2 = UV - vec2(TIME * 0.03, TIME * 0.07);
float n1 = texture(noise_texture, uv1 * 2.0).r;
float n2 = texture(noise_texture, uv2 * 3.0).r;
vec3 normal_offset = vec3(n1 - 0.5, 1.0, n2 - 0.5) * 0.3;
NORMAL = normalize(NORMAL + normal_offset);
ALBEDO = water_color.rgb;
ALPHA = water_color.a;
METALLIC = 0.0;
ROUGHNESS = 0.05;
SPECULAR = 0.9;
}
Для noise_texture подключи любую Noise Texture из ресурсов Godot (NoiseTexture2D с FastNoiseLite). Параметры wave_height и wave_speed крути по вкусу через инспектор.
- valera_nova83
- Сообщения: 6
- Зарегистрирован: Ср май 13, 2026 5:48 am
Re: Написать простой шейдер воды в Godot 4 с волнами и прозрачностью
Хороший шейдер, но если нужна честная прозрачность с видимым дном — добавь render_mode blend_mix и убедись что ALPHA < 1.0. Ещё для вида сверху часто делают screen-space эффект рефракции через SCREEN_TEXTURE — выглядит красиво, но на слабом железе лучше не злоупотреблять.
Re: Написать простой шейдер воды в Godot 4 с волнами и прозрачностью
У меня с похожим шейдером была проблема — артефакты на краях меша при волнах (вершины выходили за пределы и было видно разрыв). Решил увеличением subdivision у PlaneMesh до 32x32 — тогда волны выглядят плавно. Чем больше полигонов, тем лучше vertex displacement смотрится.
- filipp_code88
- Сообщения: 6
- Зарегистрирован: Чт май 14, 2026 9:52 pm
Re: Написать простой шейдер воды в Godot 4 с волнами и прозрачностью
Для получения бликов солнца (sun specular) не забудь что в Godot 4 за это отвечает DirectionalLight3D с включённым Enable Specular. В шейдере параметр SPECULAR влияет на интенсивность, а ROUGHNESS — на размытость бликов. Для воды ROUGHNESS 0.0-0.1 даёт зеркальные острые блики, 0.3-0.5 — рассеянные.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость