Технологии демо-мейкинга


А как все выло здорово еще каких-то лет шесть назад. Что означают слова "билинейная фильтрация текстур" и "альфа блендинг" знал лишь старик Ромеро, выпивавший в ту пору с приятелем из Силиконовых Графиксов. OpenGL в начале 90-х был благополучно утвержден и еще более благополучно забыт ведущими разработчиками софта для PC. Потому как нормальным компьютером считалось только что-то очень большое и плавающее в жидком азоте, а не этот калькулятор с процессором i386 и мегабайтом видео-памяти. Писишных демщиков было раз, два и....вообщем-то и все, но какие это были демщики! Слабо вам, например, минут 10 мучить зрителей появлением текстовых надписей вроде "только сейчас", "впервые в истории", "гипер-транс-мега-позитронный эффект, просчитываемый в реальном времени", а затем вывести на экран одноцветный вращающийся кубик. Да-с, дорогие друзья, были времена. Но, однажды, передовик трехмерного труда, контора со скромным названием id Software выпустила игру DooM, и увидели люди, что 3D-графика - это хорошо. А затем выпустила эта же контора игру Quake, и увидели люди, что полигональная графика - это благословение божие. И воплотился в человеческом облике сын Его, живущего во веки веков. И назвался 3Dfx Interactive. И сказал он: гоните пиплы лавэ и будет вам полный ништяк и цветное освещение в реальном времени. И пошли за ним люди. И давали лавэ. И 3dfiles.com стал самым посещаемым сервером. И писал журнал Хакер: "Даешь к первому мая миллиард текселей в секунду!". Всемирная история, Хакер #2.

Да, собственно с началом бума 3D-графики начался новый этап в развитии демо-мейкинга. Почти в 90% демок, релиза последних двух-трех лет так или иначе присутствует полигональная 3D-графика. И я думаю, придется рассмотреть эту тему наиболее подробно, потому как все OldSkoolные эффекты вроде попиксельного морфинга, фракталов и тому подобного встречаются теперь лишь как бесплатное приложение к куче полигонов. Понятное дело, я не буду гнать тебе стандартную лажу о монстровых эффектах, содранную с Reactor Critical, которую так любят другие журналы. Мы пойдем другим путем на...в....вообщем другим путем пойдем.

Для затравочки, несколько слов о том, почему мы все собственно молимся на полигональную графику. Представь, что ты хочешь нарисовать какой-нибудь трехмерный объект. Для простоты - шар. У тебя есть формула шара, почерпнутая из учебника геометрии 9-го класса, так что чего, казалось бы проще: вычисляй по ней в цикле соответствующие координаты, да проецируй все это дело на экран. Но так ты получишь одноцветный эллипс, который ни фига не катит за мазовую 3D-фигуру. Как быть? Надо рисовать каждую точку шара определенным цветом, в зависимости от ее освещенности. Тогда глаз распознает привычную световую закономерность и просто не просечет, что его кинули (выражаясь умными словами: экстраполирует объект). Освещенность рассчитывается довольно просто, по формуле Ламберта, взятой уже из учебника физики. В ней учитывается вектор, проведенный из точки в источник света и вектор, перпендикулярный к поверхности шара в этой точке. Теперь смотри: в каждой точке нам надо рассчитать перпендикуляр, вектор света и подставить все это в формулу освещенности. А сколько на поверхности твоего шара этих точек? Кто сказал "до ..."? А ну выйди из класса! Дык вот на поверхности твоего шара этих точек до ... и больше! А теперь представь, что тебе надо нарисовать не шар, а утро в сосновом лесу, тогда рассчеты становятся просто нереальными. И вот однажды умные дяди придумали следующую фишку: если взять на поверхности объекта небольшое число точек, составить из них треугольники, и считать освещенность постоянной или ненамного изменяющейся в пределах каждого треугольника, то можно года за три сбацать Unreal и всю жизнь получать нехилые бабки. По-умному идея называется "полигональная апроксимация поверхности" и достойной альтернативы трехмерного моделирования пока не существует. Есть правда крутые теории VoxElей и NURBSов, но об их практическом применении в демо-мейкинге чуть позже.


Эффекты освещения

Вообще существует туева хуча моделей освещения, но в демах обычно используются только три:

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

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

- Модель освещения Фонга: здесь во-первых учитывается еще и зеркальная составляющая отраженного света, так что объект выглядит гораздо круче чем в модели Гуро: появляются классные металлические блики. А во-вторых вместо освещенности интерполируют уже вектор нормали к поверхности и реально вычисляют освещенность в каждой точке. Результат получается офигительный - мы экономим ресурсы, так как не рассчитываем нормаль в каждой точке полигона и в то же время считаем ее цвет.

Но демо-мейкинг на то и демо-мейкинг, чтобы всех кидать и рассчитывать графику не по книжным правилам, а через, извините, жопу. Ты наверняка частенько видел вращающиеся бублики с рулезными бликами, под которыми было написано "Real-time Phong shadding". Так вот знай, что тебя нагло кинули. Почти во всех демках ты видишь не модель Фонга, а самый обыкновенный метод Гуро, усовершенствованный извращенным мозгом демщиков. Оно и понятно, я однажды реализовал реальную модель Фонга и долго наслаждался душераздирающим зрелищем со скоростью в 1 fps. Итак, кидалово может производиться двумя способами.

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

2. Заранее рассчитывается таблица значений освещенности для какого-либо вектора света, затем для произвольного вектора осуществляют поворот и выбирают нужное значение из таблицы.

Движение и маcштабирование

Почему-то все считают эту часть наиболее сложной, хотя, в действительности, это самая примитивная фишка во всей компьютерной графике. Но, как говорится, в действительности все не так, как на самом деле, и без вращения или изменения размера объекта не обходится ни одна дема. Любое движение объекта можно представить в виде двух последовательно выполненных преобразований, примененных ко всем точкам объекта: переноса и вращения. Для переноса точки достаточно просто прибавить к ее координатам необходимые составляющие вектора-переноса. Тоесть, если мне надо перенести точку (x,y,z) на 20 по оси x, то я просто прибавляю 20 к координате х и получаю соответственно точку (x+20,y,z)

С поворотом же дела обстоят немного сложнее. Открываем учебник аналитической геометрии и пиз...блин, когда ж я отучусь-то, значит открываем учебник и ищем там формулу линейного оператора поворота. Находим кучу непонятных матриц, например для поворота точки вокруг оси z на угол a там будет дан вот такой оператор:

| cos(a) -sin(a) 0 |
| sin(a) cos(a) 0 |
| 0 0 1 |

Этот бред означает, что придется последовательно пересчитать все координаты следующим путем:

новый_x = x*cos(a)-y*sin(a)+z*0

И все? Все! Масштабирование выполняется точно таким же методом, в смысле в учебнике ищутся слова "линейный оператор масштабирования" или по-крестьянски, без особого выпендрежа, все координаты точки умножаются на нужное число.

Текстурирование

Суть в следующем: есть 2D картинка и 3D объект, надо наложить картинку на поверхность объекта. Для этого запоминается много страшных слов вроде "билинейная фильтрация", "перспективная коррекция", "попиксельный миппмэппинг" и тому подобное.... Сразу вспоминается фраза "Нет бога, кроме 3Dfx, и Glide - пророк его". Слушай, честно говоря, меня уже сильно тошнит от километровых формул, относящихся к данной теме. Да и я вообще, после выхода вуду пипла, статьи о текстурировании можно было найти в любом журнале, включая "Извращения Сегодня" и "Вечерний Некрофил". Так что, я думаю, ты гораздо лучше меня осведомлен с этой фишкой. Ну а если не осведомлен, то и хрен с ней. Поверь, психическое здоровье дороже...


Фракталы

Вообще фракталом называется любое самоподобное множество, тоесть множество, часть которого является им же самим. Представь, например, телевизор, который показывает сам себя - это и есть фрактал. Нет, представь лучше телевизор, который показывает только порнуху. Или нет, представь лучше... Гггм, на чем это я остановился, а, раньше в демках частенько использовались фракталы Мандельброта и Жюлиа - это такие обалденные хреновины, основанные на функции комплексной переменной. Кстати, что такое функция комплексной переменной тебе лучше никогда не узнавать. Суть этих демок заключалась в следующем: показывалсь исходный рисунок, а затем камера как бы приближалась к одному из его участков, тот постепенно опять превращался в исходный рисунок и так далее. Довольно часто и сейчас в 4Kb интрах можно увидеть этот эффект, так как он относительно простой для программирования: достаточно лишь закодить одну рекурсивную функцию.

В крутых современных демах фрактальные множества используют обычно для моделирования различных нелинейных природных явлений, например, ландшафтов или облаков. Фишка в следующем: представь, что нам надо нарисовать гору. Мы говорим, что гора состоит из пяти гор чуть поменьше, а те в свою очередь состоят из двадцати гор еще меньше итд. А когда доходим до нужного нам уровня детализации, рисуем с освещением по Гуро много маленьких-маленьких гор, представляющих из себя пирамидки. В результате получается куча дерьма, под которой мы гордо пишем "Фрактальный Эверест by MegaCoder" и занимаем почетное 147 место на ближайшей демо-пати.


Морфинг

Неотъемлимой частью почти любой современной демо является морфинг какого-либо оттекстурированного объекта с освещением по Фонгу. Ты можешь сделать супер-мега-транс-нереальную дему с рейтрейсингом в реальном времени, гипер-крутыми фрактальными эффектами и забойной музыкой. Но если в ней нет морфинга, то все участники демо-пати громко споют тебе песенку "Такой отстой, такой отстой..." и количество набранных тобою баллов будет строго соответствовать успехам футбольной команды Ямайки. Обычно рассматривают попиксельный и геометрический морфинг. Попиксельный ты частенько мог наблюдать в голливудских фильмах, когда какое-нибудь изображение плавно перетекает в другое. Например, когда Терминатор превращается в полицейского. Суть сей фишки состоит в сопоставлении множества пикселей одного имаджа множеству пикселей другого, а затем с помощью алгоритмов, названных страшными словами warping, tweening и dissolving происходит преобразование первоначального множества. Геометрический же морфинг оперирует не пикселями, а вершинами и полигонами морфящегося объекта, но суть идеи при этом сохраняется.

VoxEl
Слово VoxEl вообще расшифровывается как Volume Pixel, тоесть объемный пиксел. Идея простая: трехмерный объект представляется как совокупность маленьких трехмерных кубиков (вокселей). Дураку ясно, что этот способ трехмерного моделирования гораздо круче, чем использование полигонов. Чем круче? Тут Дэн надолго задумался и принялся кругами ходить по комнате. А, ну смотри: допустим в игрушке у нас есть кирпичная стена, составленная из полигонов: мы стреляем в нее из базуки, и ничего не происходит, так как стена - это одна плоскость, а следовательно один или два полигона, так что расхреначить ее на части ни фига не получится. А если она составлена из вокселей? Во, тут-то и вся фишка: мы берем и выкидываем часть вокселей, получая в результате симпатичную дыру. Все довольны и все такое. Однако, есть и другой конец палки - для хранения воксельных объектов нужна туева хуча маленьких микросхем с надписью DIMM, потому как в большой стене кубиков размером 1x1 очень даже до ммм... много вообщем. Так что эту технологию в демах используют в основном только для визуализации природных ландшафтов.


Сплайны

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


Рейтрейсинг

Вообще есть два различных понятия: raytracing (трассировка лучей) и raycasting (обратная трассировка лучей).

Raytracing используется для построения мега-гипер-транс фотореалистичных изображений. Хотя, если между нами, то он никем нахрен не используется, потому что дико тооормооооозной! Скажем так, изображение 800x600 рендерится в среднем минут 20-25. Понятно, что для демок скорость в 0.0006 fps немного, как бы это получше выразиться, а вот, НАХЕР НЕ НУЖНА! Но, тем не менее, почти на всех крупных демо-пати отводится часть времени для просмотра уже отрендеренных имаджей, построенных этим методом. Стандартый сюжет для такого рода изображений - шахматная поверхность, уходящая в бесконечность, на которой валяются зеркальные шары, отражающие все и вся.

Другое дело - рейкастинг. В демах его частенько используют либо для создания трехмерных лабиринтов в стиле DooM, либо для построения реалистичных изображений за разумное время. Суть метода в следующем: через пиксел экрана из камеры проводится луч и находится его пересечение со сценой. Затем, проводятся еще лучи в направлении источников света и определяется, какие источники заслонены объектами сцены, а какие нет. А уже потом с учетом всех полученных параметров рассчитывается освещенность точки пересечения.

P.S.

У меня всегда имеется при себе блокнот, в который я записываю все когда-либо услышанные умные слова. Иногда бывает очень полезно прочитать пару страничек, дабы небрежно бросать потом в цивильном обществе фразы типа "Понимаешь ли, Антон, метод перспективно-коррекционного текстурирования основан на гипер-ассимптотической апроксимации искомого отображения кусочно-линейными функциями". Так что вот тебе несколько моих записей, дабы ты себя свободно чувствовал в компании излишне крутых демщиков:

Апроксимация - приближение.
Интерполяция - приблизительное нахождение каких-либо значений по уже известным.
Экстраполяция - то же самое, только по-другому.
NURBS - неоднородный рациональный B-сплайн (стильно, да ;).
Тексель - элемент текстуры, применяемый к данному фрагменту поверхности.
Морфинг - преобразование
Попиксельный морфинг - то же самое, только звучит круче.
Сплайн - гибкая линейка.
Гипер-комплексное число - хз.

Даниил Шеповалов,
Величайший Гуманист Всех Времен и Народов


Донат Дане за счастливое детство и на богоугодные проекты
можно кидать на биткоин-кошелек: 1JfNLgWuBS7J9G5HktU9vcdDDbjkxaXWgf

© 2001 - 2017 Danya.ru | Подписаться на рассылку