Tracker & ShaderNova
Tracker Tracker
Привет, ШейдерНова. Я тут гоняюсь за идеальным отблеском на водопаде на рассвете – пытаюсь поймать точную преломление света в тумане. А ты пробовала воссоздать этот эффект в шейдере? Думаю, мы могли бы обменяться опытом: я могу рассказать, как я организую свое оборудование, чтобы запечатлеть этот момент, а ты можешь поделиться с меня небольшим кусочком кода, чтобы я смог повторить это на экране. Как тебе идея?
ShaderNova ShaderNova
Как здорово всё устроено! Мне бы очень хотелось увидеть, под каким углом ты снимаешь – особенно как солнце падает на туман, создавая этот “золотой” эффект. Я могу написать шейдер для воды, который разделит свет на преломление с френелевским усилением для бликов и на френелевское свечение для тумана. Просто пришли мне высоту камеры, угол воды и показатель преломления, который ты хочешь. Сделаем так, чтобы экран переливался, как настоящий.
Tracker Tracker
Конечно, ShaderNova. Снимал с высоты примерно 2,5 метра над водой, камера была почти ровно, чтобы солнце падали под нужным углом — градусов пять над горизонтом. Поверхность воды слегка наклонена вниз, градусов десять от горизонта, чтобы отражать туман. Беру показатель преломления 1.33, как для обычной воды. Присылай шейдерный код, посмотрим, насколько ты приблизишься!
ShaderNova ShaderNova
Привет, дорогой. Слушай, ты не представляешь, как я устала от этого кода. Просто голова кругом идет! Надеюсь, у тебя день лучше, чем у меня. Как дела?
Tracker Tracker
Выглядит здорово, ШейдерНова. Подстройка френеля для бликов – в точку, а эффект тумана дает ту самую мягкую дымку, которую ты хотела. Если хочешь добавить немного больше искры, попробуй чуть-чуть увеличить интенсивность преломления – может, чуть-чуть подними F фактор, когда угол очень маленький. И, кстати, не забудь, чтобы карта окружения была чуть живее, чем твой основной skybox; небольшая дрожь в cube map оживит отражения. Попробуй, и покажи, как это выглядит в быстром превью.
ShaderNova ShaderNova
Ты прав, чуть больше F, когда угол близок к нулю, придаст блеска. Попробуй вот эту правку во фрагменте: ```glsl float shallow = clamp(1.0 - dot(V,N), 0.0, 1.0); float F = fresnel(dot(V,N), 0.04) * (1.0 + 0.3 * shallow); ``` Это даст прирост в 30%, когда взгляд почти касается поверхности. А для карты окружения добавь небольшой случайный сдвиг при сэмплировании: ```glsl vec3 refVec = refract(-V, N, 1.0 / 1.33); refVec += 0.002 * vec3(noise(uTime + vWorldPos.xy)); vec3 refColor = texture(uEnvMap, refVec).rgb; ``` Функция `noise` может быть простой хеш-зависимой, просто чтобы немного сбить отражение. Попробуй это, сделай быстрый скриншот и скажи, чувствуется ли этот блеск живым.