Написать простой шейдер воды в Godot 4 с волнами и прозрачностью

Рейтинг: 57.8% · 13 голосов
Создание игр на Unity, Unreal Engine, Godot: 3D-графика, шейдеры, физика, геймдизайн, оптимизация и инди-проекты.
Ответить
Аватара пользователя
tolkien
Сообщения: 11
Зарегистрирован: 14 май 2026, 12:52

Написать простой шейдер воды в Godot 4 с волнами и прозрачностью

Сообщение tolkien »

Делаю игру с видом сверху, нужна вода — волны, лёгкая прозрачность, блики. В Godot 4 попробовал Visual Shader но там запутался с нодами. Можно ли написать это на GDShading Language текстом? Примеры которые нашёл либо для Godot 3 (не работают), либо слишком сложные с кучей непонятных uniform. Покажите базовый рабочий вариант для 3D MeshInstance с PlaneMesh.
👍3 ❤️1 🔥 😄4 🤔1
✔ Лучший ответ выбран автором и совпадает с автоматическим подбором — marianna
Вот рабочий базовый шейдер воды для 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…
Перейти к ответу →
Аватара пользователя
rawgoblin
Сообщения: 39
Зарегистрирован: 13 май 2026, 07:42

Re: Написать простой шейдер воды в Godot 4 с волнами и прозрачностью

Сообщение rawgoblin »

GDShading Language в Godot 4 — это по сути GLSL с небольшими отличиями, так что примеры из интернета переносятся несложно. Главное отличие от Godot 3: теперь spatial шейдер, а не просто shader type spatial. И built-in переменные немного поменялись.
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
marianna
Сообщения: 70
Зарегистрирован: 11 май 2026, 11:23

Re: Написать простой шейдер воды в Godot 4 с волнами и прозрачностью

Сообщение marianna »

✔ Лучший ответ — выбран автором и совпадает с авто-подбором
Вот рабочий базовый шейдер воды для 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 крути по вкусу через инспектор.
👍1 ❤️ 🔥1 😄 🤔1
Аватара пользователя
terraform91
Сообщения: 4
Зарегистрирован: 18 май 2026, 20:59

Re: Написать простой шейдер воды в Godot 4 с волнами и прозрачностью

Сообщение terraform91 »

Хороший шейдер, но если нужна честная прозрачность с видимым дном — добавь render_mode blend_mix и убедись что ALPHA < 1.0. Ещё для вида сверху часто делают screen-space эффект рефракции через SCREEN_TEXTURE — выглядит красиво, но на слабом железе лучше не злоупотреблять.
👍1 ❤️ 🔥 😄1 🤔
Аватара пользователя
postgres2
Сообщения: 66
Зарегистрирован: 11 май 2026, 17:56

Re: Написать простой шейдер воды в Godot 4 с волнами и прозрачностью

Сообщение postgres2 »

У меня с похожим шейдером была проблема — артефакты на краях меша при волнах (вершины выходили за пределы и было видно разрыв). Решил увеличением subdivision у PlaneMesh до 32x32 — тогда волны выглядят плавно. Чем больше полигонов, тем лучше vertex displacement смотрится.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
rage311
Сообщения: 8
Зарегистрирован: 14 май 2026, 03:27

Re: Написать простой шейдер воды в Godot 4 с волнами и прозрачностью

Сообщение rage311 »

Для получения бликов солнца (sun specular) не забудь что в Godot 4 за это отвечает DirectionalLight3D с включённым Enable Specular. В шейдере параметр SPECULAR влияет на интенсивность, а ROUGHNESS — на размытость бликов. Для воды ROUGHNESS 0.0-0.1 даёт зеркальные острые блики, 0.3-0.5 — рассеянные.
👍1 ❤️ 🔥1 😄 🤔2
Ответить
Поделиться темой: ✈ Telegram VK

Вернуться в «Геймдев и разработка игр»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость