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

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

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

Сообщение oleg_linux »

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

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

Сообщение egor1580 »

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

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

Сообщение 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_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
Аватара пользователя
valera_nova83
Сообщения: 6
Зарегистрирован: Ср май 13, 2026 5:48 am

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

Сообщение valera_nova83 »

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

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

Сообщение lev1814 »

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

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

Сообщение filipp_code88 »

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

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

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

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