Horrific & Deniska
Deniska Deniska
Ну, короче, я тут скрипт написал, который превращает обычную зомби-игру в жуткий сервер. НПС начинают шептать твоё имя, всё в какой-то сломанной типографике, а карта перестраивается в лабиринт из помех. Сам-то когда-нибудь модифицировал ИИ, чтобы он выдавал жуткие истории?
Horrific Horrific
Звучит как неплохое начало. Я бы углубил это, заставив ИИ запоминать страх игрока – чтобы каждый шёпот становился громче с каждым новым уровнем погружения. Тогда сервер не просто будет глючить, он будет пугать по-настоящему. Ты думал о том, чтобы заставить неигровых персонажей читать детские стишки задом наперед? Это идеальная порция жути.
Deniska Deniska
Да, ну да, алгоритм "эхо-страха" – это, по сути, мой следующий важный этап, всего пара строк на Lua и немного безумной нейросети. Перевернуть детские стишки? Легко! "Ханна, Ханна, кто же это… э… ну, понял, о чём я." ИИ начнёт читать стихи задом наперёд, но помехи в звуке сделают так, будто это передача из глубин космоса. Уверен, каждый персонаж превратится в мини-фильм ужасов. Что ещё забагаем?
Horrific Horrific
Слушай, давай сделаем такой финт ушами, играющий на восприятии. Каждый раз, когда игрок замирает, прямо перед камерой появляется небольшой серый блик, как будто мертвый пиксель. Он ненадолго отстает от обзора, потом резко смазывается и расширяется во что-то вроде тусклого, мерцающего портала, который на мгновение затягивает тебя в короткий скрин-переход в пустую темную комнату. Когда ты возвращаешься, этот блик все еще там, ждет, чтобы снова тебя напугать. Простой прием, но он держит игрока на грани реальности.
Deniska Deniska
Вот это безумие – прямо цифровая галлюцинация, зацикленная. Я бы мог написать шейдер, который плавно выводит блок из девяти текстурных пикселей, синхронизировать это с таймером бездействия игрока, и одновременно увеличивать размытие, пока изменяется прозрачность. Дверь может быть просто плоским многоугольником с текстурой портала, которая мерцает; каждый резкий переход – это телепортация камеры в чёрную комнату. Когда игрок возвращается, пятно остаётся, как призрак из пиксельного мема. Идеально для моментов "реально ли это?". Готов писать шейдер? Нужен просто небольшой фрагментный шейдер, чтобы проверить скорость меньше эпсилон, создать глитч из одного пикселя, задержать на мгновение, а потом добавить фильтр размытия, пока экран не разорвётся. Портал может быть плоским многоугольником с текстурой шума, чтобы он ощущался как глитченая дверь. Каждый раз, когда игрок возвращается, глитч остаётся – как навязчивый баг, преследующий экран. Это дешёво, но эффективно, и всё это можно включить по нажатию клавиши для дополнительного мета-юмора. Хочешь небольшой кусочек кода?
Horrific Horrific
Всё, что я могу сказать - это не похоже на диалог. Это код на шейдере.
Deniska Deniska
Отличный кусочек, но кое-что можно доработать, чтобы было жутче. Во-первых, вычисляя glitchCoord, стоит выбирать случайный тексель внутри сетки 256х256, а не просто округлять, чтобы это выглядело менее предсказуемо. Можно использовать функцию шума: glitchCoord = fract(vTexCoord * 256.0 + vec2(fract(sin(time * 12.3) * 43758.5453))); Это будет давать разные пиксели каждый кадр. Еще, размытие можно сделать более заметным – увеличь вес центрального образца, чтобы переход к двери ощущался как резкий сдвиг фокуса. И, чтобы реально перенести игрока в эту пустую комнату, нужно инициировать телепорт камеры в коде игры, когда time > 5.0, а не только в шейдере. Тогда глитч действительно "втянет" игрока, а не просто создаст странный эффект на экране. Попробуй это и у тебя получится пиксельный цикл ужаса – дешевый, но эффективный.
Horrific Horrific
Вот более лаконичный вариант, который ты можешь вставить. Он случайным образом выбирает тексель на каждом бездействующем такте, придает больше веса центральному пикселю для более четкого размытия и при этом оставляет место для вызова прыжка камеры на стороне хоста. ``` uniform sampler2D tex; in vec2 vTexCoord; uniform float time; uniform vec2 velocity; void main(){ const float epsilon = 0.01; vec4 color = texture(tex, vTexCoord); // Случайный глитч: выбираем один пиксель внутри сетки 256x256 vec2 randOffset = fract(sin(vec3(time*12.3, time*7.1, time*21.5)) * 43758.5453) / 256.0; vec2 glitchCoord = floor(vTexCoord * 256.0 + randOffset) / 256.0; if(length(velocity) < epsilon){ color = texture(tex, glitchCoord); } // Взвешенное размытие: центру дается двойной вес vec4 blur = vec4(0.0); float total = 0.0; for(int i=-2;i<=2;i++) for(int j=-2;j<=2;j++){ float w = (i==0 && j==0) ? 2.0 : 1.0; blur += texture(tex, vTexCoord + vec2(i,j)/256.0) * w; total += w; } blur /= total; if(time > 5.0){ color = mix(color, blur, 0.8); // переходим к виду из дверного проема } gl_FragColor = color; } ``` На стороне движка подцепи `if (time > 5.0 && length(velocity) < epsilon)`, чтобы телепортировать камеру в твою черную комнату. Так глитч превратится в настоящий резкий переход, и квад портала останется тем низкополигональным дверью, скрытой шумом, как ты и хотел. Наслаждайся пиксельным ужасом.