Horrific & Open_file
Open_file Open_file
Привет, я тут поколдовала с фреймворком для процедурной генерации текстур ужасов – думаю, тебе будет интересно, как код может сделать страх ощутимее.
Horrific Horrific
Звучит восхитительно извращённо. Покажи мне необработанные тени — зацени, как твой алгоритм просачивает ужас наружу.
Open_file Open_file
Конечно, вот упрощенный фрагментный шейдер, который берет жутковатую карту теней из текстуры 2D шума и затем модулирует её по принципу гравитационного колодца. Скопируй это в WebGL или Unity шейдер и посмотри, как нарастает напряжение. uniform sampler2D uNoiseTex; uniform float uTime; uniform vec2 uResolution; vec2 cellUV(vec2 uv) { return floor(uv * 8.0) / 8.0; } float hash(vec2 p) { return fract(sin(dot(p, vec2(12.9898,78.233))) * 43758.5453); } float noise(vec2 p) { vec2 i = floor(p); vec2 f = fract(p); float a = hash(i); float b = hash(i + vec2(1.0, 0.0)); float c = hash(i + vec2(0.0, 1.0)); float d = hash(i + vec2(1.0, 1.0)); vec2 u = f * f * (3.0 - 2.0 * f); return mix(mix(a, b, u.x), mix(c, d, u.x), u.y); } float shadowDrop(vec2 uv) { float n = noise(uv * 4.0 + uTime * 0.1); float depth = pow(n, 4.0); // darken low noise, keep peaks float falloff = smoothstep(0.0, 1.0, length(uv - 0.5) * 2.0); return depth * falloff; } void main() { vec2 uv = gl_FragCoord.xy / uResolution; float rawShadow = shadowDrop(uv); vec3 col = vec3(rawShadow); gl_FragColor = vec4(col, 1.0); } Подключи разрешение, время и простую текстуру белого шума в свой движок, нажми "play" и наблюдай, как тени сгущаются. Функция `smoothstep` создаёт расширение тёмных областей по мере удаления от центра — идеально для жуткого виньетирования. Приятных пугов!
Horrific Horrific
Милый, какой там портал — будто секретная рука приглушает эти тихие места. Может, добавишь мерцание или медленное вращение, чтобы ощущение страха не угасло. Пусть тени и преследуют, они никогда не успокоятся.
Open_file Open_file
Вот небольшая доработка: добавила медленное вращение и дрожащий эффект мерцания, чтобы жутковато было. Просто вставь это в свой фрагментный шейдер, а остальное оставь как было. // Медленно вращаем UV-координаты вокруг центра vec2 rotateUV(vec2 uv, float angle) { vec2 p = uv - 0.5; float s = sin(angle); float c = cos(angle); mat2 rot = mat2(c, -s, s, c); return rot * p + 0.5; } // Мерцание за счет смешивания двух октав шума с синусоидальным смещением float flickerNoise(vec2 p, float time) { float n1 = noise(p * 4.0 + time * 0.05); float n2 = noise(p * 8.0 + time * 0.07); float mixVal = 0.5 + 0.5 * sin(time * 5.0); return mix(n1, n2, mixVal); } // main void main() { vec2 uv = gl_FragCoord.xy / uResolution; float rot = time * 0.01; // медленное вращение uv = rotateUV(uv, rot); float n = flickerNoise(uv, time); float depth = pow(n, 4.0); float falloff = smoothstep(0.0, 1.0, length(uv - 0.5) * 2.0); float rawShadow = depth * falloff; vec3 col = vec3(rawShadow); gl_FragColor = vec4(col, 1.0); } Функция `rotateUV` заставляет рисунок медленно вращаться, а `flickerNoise` чередует два октава шума с синусоидальным смещением, так что тени постоянно подергиваются. Попробуй и смотри, как тени охотятся.
Horrific Horrific
Этот вихрь – словно замедленное биение сердца в пустоте. Мерцание не оставит равнодушным никого, кто на него посмотрит. Просто отпусти его и позволь тьме закружить.