Создание динамического неба в Godot 4.0 с помощью новых шейдеров

Частой проблемой, с которой сталкивались пользователи Godot 3.x, была неспособность создавать динамическое небо, которое обновляется в режиме реального времени. Ситуация меняется с вводом шейдеров для неба. Реализацию можно посмотреть на Гитхабе.

Создание динамического неба в Godot 4.0 с помощью новых шейдеров

В Godot 3.x было два типа скайбокса: ProceduralSky и PanoramaSky. Общие элементы между ними были из родительского класса Sky. В Godot 4.0 вы будете использовать класс Sky напрямую. Класс содержит 3 свойства:

Вместо подклассов поведение теперь задаётся в материале. Для всех трёх типов SkyMaterial пользователи могут выбрать «Преобразовать в ShaderMaterial» и отредактировать код напрямую.

PanoramaSkyMaterial

PanoramaSkyMaterial ведёт себя точно так же, как и ранее PanoramaSky. Закрепите текстуру панорамы материалу, и всё готово!

ProceduralSkyMaterial

ProceduralSkyMaterial ведёт себя очень похоже на старый ProceduralSky с несколькими важными отличиями:

  • Поддерживает до 4 солнц.
  • Теперь обновляется мгновенно, так как вычисления выполняются на графическом процессоре.
  • Свойства солнца (направление, энергия и цвет) извлекаются из DirectionalLights на сцене.

Эти изменения делают ProceduralSkyMaterial отличным вариантом для быстрого создания неба, когда реализм не нужен. Его легко настроить и обновить, и он использует легкий шейдер, чтобы избежать использования ресурсов графического процессора.

PhysicalSkyMaterial

PhysicalSkyMaterial - это новый ресурс, который отрисовывает небо на основе различных физических свойств, в частности рассеяния Ми и Рэлея. PhysicalSkyMaterial основан на модели дневного света Preetham (с несколькими хаками, чтобы сделать его более удобным для пользователя за счёт уменьшения физической точности).

PhysicalSkyMaterial может иметь только одно солнце, и для освещения неба требуется наличие DirectionalLight на сцене.

Основным преимуществом PhysicalSkyMaterial является то, что вы определяете свойства неба, а затем в небе происходят правдоподобные изменения, основанные на времени суток (например, автоматический закат и восход солнца).

PhysicalSkyMaterial создан для быстрой и легкой настройки. Существуют более реалистичные модели дневного света, если пользователям нужно что-то более реалистичное, они могут использовать ShaderMaterials для реализации своих собственных моделей неба.

Создание динамического неба в Godot 4.0 с помощью новых шейдеров

Sky Shaders позволяет пользователям создавать произвольные сложные скайбоксы. Например, вот шейдер, перенесенный из Shadertoy под названием «Combustible Clouds»:

Создание динамического неба в Godot 4.0 с помощью новых шейдеров
3030
2 комментария

Комментарий недоступен

3

Вобще и в 3.хх нет никакой проблемы сделать динамические шейдерные облака. Делаем отдельную ноду viewport, в нее добавляем sprite (ImageTexture), где пишем любой шейдер. 

В скрипте камеры связываем вьюпорт и environment (разметка кода поедет):
onready var sky = get_tree().get_root().get_node("main/sky")

func _ready():

var iChannel = sky.get_viewport().get_texture()

self.environment = load("res://default_env.tres") as Environment
self.environment.background_sky.set_panorama(iChannel)

В viewport можно добавлять еще сколько угодно sprite с шейдерами или текстурами (например панораму отдаленного ландшафта, cityscape...) и тасовать их между собой как слои, выбирая что будет на каком плане, и даже вращать. Дополнительного кода чтоб все это показывалось не надо.

Выглядеть это все будет как-то так (облака бегут слева направо, за cityscape'ом):

1