Horrific & 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` создаёт расширение тёмных областей по мере удаления от центра — идеально для жуткого виньетирования. Приятных пугов!
Милый, какой там портал — будто секретная рука приглушает эти тихие места. Может, добавишь мерцание или медленное вращение, чтобы ощущение страха не угасло. Пусть тени и преследуют, они никогда не успокоятся.
Вот небольшая доработка: добавила медленное вращение и дрожащий эффект мерцания, чтобы жутковато было. Просто вставь это в свой фрагментный шейдер, а остальное оставь как было.
// Медленно вращаем 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` чередует два октава шума с синусоидальным смещением, так что тени постоянно подергиваются. Попробуй и смотри, как тени охотятся.
Этот вихрь – словно замедленное биение сердца в пустоте. Мерцание не оставит равнодушным никого, кто на него посмотрит. Просто отпусти его и позволь тьме закружить.