Category: технологии

Category was added automatically. Read all entries about "технологии".

Барахолка идей

Однажды наступает такое время, когда понимаешь, что все идеи которые приходили в голову и пробуждали энтузиазм вот-вот окажутся навсегда в забвении, погребенные под грузом повседневности и скуки. И этот чемодан идей и бросить жалко, и открывать уже не хочется...
Может быть стоило воспользоваться хотя бы одной искрой из тех многих, что проскакивали в мгновения озарений, ухватиться, бережно раздуть пламя творческого задора. Но душа не зажглась. Отсырела, промозгла...

Все что остается - это вытряхнуть заметки из форточки своего фейсбука, авось кому-нибудь пригодятся.

Вот например сценарии.

Этот пришел мне в голову очень давно, еще в школьные годы, когда я играл в одну из тех компьютерных игр, где приходилось часто сохраняться и загружаться, пытаясь выполнить задачу. Были ли это Проклятые Земли, где я раз по десять загружался, пытаясь убить гораздо более сильного противника одним ударом "со спины в голову"? Или ранняя колда, в которой запоминал, куда с упреждением бросить гранату чтобы убить пачку только что народившихся фашистов?.. Все это наталкивало меня на мысль - ведь герой, получается, своего рода провидец! Или путешественник меж параллельных миров, умирающий тысячи раз на разных вероятностных рельсах, но умеющий найти наконец ту невероятную линию, на которой он чудесным образом всегда достигает успеха, увернувшись от мириады опасностей. Он делает, порой, необъяснимые и чудаковатые вещи со стороны гипотетического наблюдателя, но парадоксальным образом побеждает. К счастью, совсем недавно эту идею воплотили в сценарии фильма Грань Будущего. Но я вижу в ней и больший потенциал, в первую очередь, разумеется, в компьютерных играх. Что если сама возможность сохранения и загрузки станет частью мира игры и его сеттинга, а не мета-игровым инструментом?.. Так родился концепт Пророка.

А вот другая идея, тоже о путешествиях во времени и линиях истории. Я, вообще-то, не очень люблю этот жанр, но почему-то привиделось следующее: фальшивые времена.

Опять же в развитие первой идеи, более конкретный сценарий для сетевой компьютерной игры, вдохновленный просмотром трилогии Властелина Колец и Хоббита: Пробуждение героев.

Это только начало, дальше постараюсь привести в читаемый вид еще около дюжины различных концептов. Stay tunned, как говорится.

Маловато будет!

Гигантомания и тяга к непреодолимому это либо какая-то психологическая защита от реальной работы, либо следствие заражения восприятия мегапроектами крупнейших студий, заполнивших медиапространство до горизонта своей продукцией. Не тянет делать что-то малое. Невозможно на это найти вдохновение. Испытываю прямо тошноту и головную боль когда заставляю себя делать что-то одноразовое и ограниченное. Тянет на подвиги. Если уж делать что-то,  то обязательно универсальное, масштабное, новаторское. Если делать игру, то уж если не ммо, то как минимум онлайновый мир. Мультиплатформенный. С изменяемым процедурным ландшафтом планетарных масштабов. И графикой ААА-класса. Самому смешно, а все же "маловато будет! Маловато!". Такие мечты конечно заставляют учиться, копаться в самых мудреных технических трюках, разбираться в том, как устроены флагманские проекты компаний с мировыми именами; не сидеть годами за рутинными делами; расти.
Но стоит разобраться как же устроены brdf функции в physically based шейдинге и как нужно правильно делать для него материалы, тут же становится скучно. Ведь дальше начинается рутина. Принцип ясен - шаблон в руки и копай от забора и до обеда... Лень и неусидчивость тут же толкают на преследование какой-нибудь новой цели: непонятной, загадочной, манящей сказочными перспективами. Все мысли в конечном итоге устремляются туда, и погоня за несбыточным начинается снова. Процедурная геометрия, физическая анимация, сетевые трюкачества, реймаршинг и волюметрик эффекты, адаптивный искусственный интеллект,  кроссплатформенные технологии! Вокруг целая вселенная для изучения. И пока копаешься в чем-то, приходит конференция siggraph и обрушивает на голову тонны новых невероятно заманчивых технологий при постижения которых можно ненароком получить пару phd по математике и computer science. И что же делать? Все еще храню надежду, что увлекусь какой-то ограниченной задачей и кропотливо и с любовью доведу ее до конца. Но нужен прочный задор, подкрепляемый чьим-то еще интересом или собственной верой в правильность выбора задачи. Или просто драйв. А его все нет и нет.

GPU Marching Cubes в Unity

Я давно искал способ повысить интерактивность виртуального мира при помощи изменяемого ландшафта. Воронки в ландшафте от взрывов в Worms3D и тоннели в марсианской почве Red Faction впечатляли еще много лет назад, но я всегда хотел видеть подобное и в других играх и в более крупном масштабе. Но увы, антураж игр по сей день остается все таким же застывшим и декоративным, хоть и прибавил пикселей в разрешении.

Существует очевидная возможность изменять геометрию ландшафта путем модификации карты высот по которой он построен. Но такой метод имеет очевидные топологические ограничения так как заперт лишь в одном изменении и поэтому годится лишь для небольших ям и насыпей. Вот когда я обнаружил в одном блоге демонстрацию геометрического шейдера, строящего сложную поверхность из поля по алгоритму marching cubes, я  почувствовал, что реализовать подобное теперь и в моих силах. Как я потом выяснил, существует фантастически крутой проект Voxel Farm который реализует именно эту технологию, создавая бесконечный процедурный измеряемый мир с фотореалистичной графикой. Но несмотря на это, попыток применения такой технологии в играх до сих пор еще нет. Первая серьезная попытка, насколько мне известно, это очень любопытный проект SOE: Everquest Next. В нем некоторые участки воксельного мира будут доступны игрокам для изменения. Однако я предчувствую, что ничего кроме декоративных изменений в игру он не привнесет, хотя и это уже большой шаг навстречу физически достоверному миру.

Но, несмотря на некоторое разочарование и упущенную перспективу новаторства, я все же решил догнать флагманов индустрии и сделать свой воксельный мир. Перед глазами возникла картина целой вселенной, созданной подобной технологией с масштабными уровнями детализации, позволяющими подгружать только актуальные элементы.

Принцип марширующих кубиков довольно прост: делим трехмерное поле плотности (где каждое значение характеризует расстояние до поверхности) на кубики, и проверяем для каждого из них, не принимает ли поле внутри кубика значение, соответствующее уровню поверхности. Для этого проверяются значения плотности во всех вершинах куба, и если значения на вершинах какого-то ребра оказываются по обе стороны от уровня поверхности, значит она пересекает данное ребро куба. Далее по заранее вычисленному трафарету (в котором записаны все 256 возможных случаев пересечения ребер) выбирается конфигурация поверхности, проходящей через данный воксель. Это создает до пяти полигонов внутри него, которые и выводятся как результат.

Спасибо NVIDIA за бесценные уроки и примеры реализации этого алгоритма на GPU. Оставалось его реализовать в Unity, используя Compute Shader'ы. Это потребовалось мне для того, чтобы вывести информацию о вершинах в область памяти, доступную центральному процессору, рассчитывающему коллизии и физику тел. Обычный геометрический шейдер, реализацию которого я встретил в сети, для такого трюка годился плохо. Затем я добавил разбиение пространства на мега воксели, «чанки», чтобы создавать поле в любом объеме, и написал модификаторы поля для воздействия на него. Получилось вот так:

Однако что меня сейчас беспокоит, так это существование гораздо более оптимальных вариантов данного алгоритма. Я уже воспользовался советом из статьи от NVIDIA и избавил алгоритм от генерации повторных вершин для соседствующих треугольников. Однако само построение поверхности на монотонных участках поля (плоскости) создает множество ненужных треугольников. В сети я обнаружил информацию об улучшенных вариантах алгоритма: macet, повышающий качество репрезентации объекта путем трансформации граней воксельной сетки перед проходом mc, и dual marching cubes, создающий адаптивную сетку для деталей поля разных масштабов. Мои попытки понять до конца их принцип пока не увенчались успехом, но мне страстно хочется добиться сходных результатов. Потому что сейчас поверхность хоть и выглядит сносно, имеет огромное количество лишних полигонов и "тощих треугольников", создающих ступеньки и уродливые тени... Особенно интересен двойной marching cubes который подразумевает рекурсивное построение октодерева, адаптивно разделяющегося на участках с высокой неоднородностью поля, и подобное стандартному мс применение трафарета к построенным ячейкам, топологически идентичным кубу...

В качестве бонуса осилившим этот текст до конца, выкладываю проект Unity для построения поверхности из поля по алгоритму марширующих кубов, использующего GPU: https://dl.dropboxusercontent.com/u/4986831/Unity/GPUVOX.rar (требуется поддержка SM5.0 то есть DX10.1 и выше). Буду рад если кто-то сочтёт это полезным и пойдет вместе со мной по проторенной теоретиками, но еще не освоенной практиками дороге.