Bambuk & ShaderNova
Привет, Бамбук. Я тут ковырялась с шейдером биолюминесценции, застряла на том, как сделать, чтобы свечение выглядело как у настоящих растений ночью. Ты видел когда-нибудь такие растения, которые светятся? Хотела бы услышать твое мнение, как это передать кодом, и может, обменяемся советами по экологичному освещению.
Привет, это Бамбук. Настоящее свечение растения ощущается как мягкий импульс, а не резкий луч. Начни с базового, слабого, зеленовато-синего оттенка и добавь легкую мерцание – небольшая, всего несколько процентов, вариация яркости со временем. Карту свечения сделай с небольшой полигональностью, чтобы не перегружала видеокарту. Используй радиальный градиент, чтобы свет распространялся мягко, как на листе под лунным светом. Для экологичности используй глобальное освещение в пределах экрана, вместо множества точечных источников, и, если получится, запеки свечение в карту освещения. И попробуй добавить в комментарии к шейдеру какие-нибудь упоминания о запахе зеленого чая или эвкалипта – просто для шутливого намека на природу. Попробуй смешать свечение с затенением, чтобы растение выглядело живым и в тени. Надеюсь, это поможет, говори, если нужны еще какие-нибудь хитрости с освещением!
Бамбук, мне очень нравится эта подсветка, как у растения, но насчет "зелёный чай" я не уверена — если только это не шейдерный трюк. Мне нужны детали: как ты добиваешься такой низкой полигональности карты свечения, и при этом такой естественной пульсации? Радиальный градиент звучит неплохо, но как ты его эффективно семплируешь? И еще, ты запекаешь в лайтмап или используешь свой собственный узел? Буду рада увидеть коротенький кусочек кода, чтобы сравнить подходы.
Конечно. Для карты свечения в low-poly стиле используй один UV-квад и текстуру плавного градиента размером 2 пикселя. В шейдере бери отсчет градиента от радиального расстояния до центра:
```
float d = length(uv - 0.5);
float pulse = 0.3 + 0.2 * sin(_Time * 2.0 + d * 10.0);
float glow = smoothstep(0.45, 0.5, 0.0 - d) * pulse;
```
Это даст мягкое кольцо, которое плавно пульсирует. Держи размер текстуры 16x16, чтобы это было не затратно, и просто добавь свечение к albedo: `color += glow * vec3(0.0, 0.8, 0.5);`.
Если хочешь запечь это, отрендери сцену в lightmap с тем же шейдером, но установи время на 0, чтобы получить статичную яркую область. Затем используй эту lightmap в основном проходе рендеринга. Если предпочитаешь нодовый подход, используй узел “Radial Gradient”, подай его на узел “Sine” для пульсации и умножь на базовый цвет. Держи граф неглубоким – всего несколько нод – и это останется эффективным. Надеюсь, это поможет!
Привет, выглядит неплохо, вполне достаточно, чтобы не тормозило. Но градиент, наверное, стоит сделать ещё более плавным. 16 на 16 – нормально, но эта сглаживание в два пикселя… как-то грубовато. Попробуй сглаживание в четыре пикселя на текстуре 8 на 8 – математика та же, зато затраты на подгрузку текстуры снизишь. И этот пульс `0.3 + 0.2 * sin(...)` – отличная идея для тонкостей, но если хочешь настоящий, живой переливающийся эффект, увеличь амплитуду до 0.4 или добавь вторую синусоиду с чуть другой частотой. Держи график неглубоким, но не бойся добавить небольшое `mix()`, чтобы смешать карту затенения – чтобы свечение учитывало тени. И не забудь ограничить выходные значения свечения, чтобы не было этого эффекта “пересвета” на самых ярких участках. Удачи с кодингом!
Отлично получилось с правкой – текстура 8 на 8 с границей в 4 пикселя будет выглядеть гораздо мягче. Насчёт дрожания, попробуй что-то вроде этого:
```
float pulse = 0.3 + 0.4 * sin(_Time * 2.0 + d * 10.0) + 0.2 * sin(_Time * 3.5 + d * 12.0);
```
Затем ограничь диапазон:
```
pulse = clamp(pulse, 0.0, 1.0);
```
Добавь немного карты AO, чтобы тени приглушали свечение, используя `mix()`. Постарайся удержать граф узлов в пределах трёх-четырёх: градиент → два синуса → смешивание с AO → ограничение диапазона → вывод. Так оно и останется довольно лёгким и придаст ощущение естественного биолюминесцентного свечения. Удачи в кодировании!
Выглядит потрясающе – просто встраивай это в материал, и смотри, как оно оживает, как живой лист. Если хочешь, чтобы свечение чуть больше уходило в тень, попробуй немного увеличить значение `max` на маске AO перед смешиванием, чтобы самые тёмные уголки оставались матовыми. Удачи в поисках!
Отлично, спасибо за совет! Попробую, и подсвечу мягко, чтобы цветочек не выглядел вялым. И тебе удачи в поисках!