ViralVox & ShaderShade
ViralVox ViralVox
Привет, я тут кое-что замутил – лёгкий хак, который превращает любой ТикТок в визуальный взрыв. Представь: динамические тени в такт музыке и эффект глитча, который выстреливает прямо во время танца. Хочешь посмотреть, как мы вместе сможем это в тренды вывести?
ShaderShade ShaderShade
Звучит захватывающе, но сначала надо довести до ума шейдер затенения. Скажи, где самые сильные моменты, а потом добавим глитч в нужной точке. Не усложняй шейдер, просто следи за маршрутом света. Готов считать?
ViralVox ViralVox
Конечно, давай сделаем это чисто. Выбери BPM – скажем, 120, чтобы каждый удар был 0.5 секунды. Используй массив для отметки времени каждого полусекундного тика. В шейдере просто смещай направление тени синусоидой, соответствующей ритму этих ударов – без каких-то каскадов, только один источник света. Сигнал глитча может запускаться на четвертом ударе, быстрая мерцание буфера глубины. Просто, лаконично и готово взорваться.
ShaderShade ShaderShade
Отлично, 120 BPM даёт период в 0.5 секунды – чистый сигнал. Синус на направление света даст этот импульс, просто синхронизируй фазу с массивом ритма. По глюку – читай глубину, инвертируй небольшой срез, потом сбрасывай – так будет остро. Вершинный шейдер оставим минимальным, только трансформацию UV. Дай знать, как выгрузишь шейдер, быстро гляну как выглядит.
ViralVox ViralVox
Понял—зафиксировал сигнал, инверсия глубины по команде, только УФ. Шейдер отправлю в пакете по таймингу, превью дам сейчас же. Жди визуального всплеска!
ShaderShade ShaderShade
Ладно, отправляй. Давай посмотрим, что там за всплеск. Я тут буду, как сова на мышь, присматриваюсь к буферу глубины.
ViralVox ViralVox
Вот кусок GLSL-кода – делай покомпактнее: ```glsl // Vertex in vec2 vUV; out vec2 fUV; void main(){ fUV=vUV; gl_Position=vec4(0,0,0,1); } // Fragment uniform float time; uniform float beatTime; // 0.5s per beat at 120 BPM in vec2 fUV; out vec4 fragColor; float pulse(float t){ return sin(2.0*3.14159*t/beatTime); } void main(){ float dir = pulse(time); vec3 lightDir = normalize(vec3(dir, 0.0, 1.0)); float depth = texture(depthTex, fUV).r; // glitch on cue if (int(time/beatTime)==4) depth = 1.0 - depth; // invert a slice float shadow = max(dot(lightDir, vec3(0,0,1)), 0.0); fragColor = vec4(vec3(shadow)*depth, 1.0); } ``` Вставляй и запускай, скажи, как выглядит этот пик!