Компьютерная графика под микроскопом: от полигонов до процедурной генерации

Опубликовал Назар Яворський

Реалистичные компьютерные игры в современном мире воспринимаются как привычная вещь, но так было не всегда. Они прошли почти 70-летний путь от первого изображения на осциллографе, до процедурной и нейронной генерации. В слове «графика» на самом деле спрятаны десятки тысяч технологий, которые на выходе дарят нам целые миры. В этой статье мы поговорим о них подробнее.

Как все начиналось

Первая видеоигра «Tennis for Two» была создана американским физиком Уильям Гигинботэм. Уже во время первого показа 18 мая 1958 года образовалась огромная очередь из людей, которые стремились увидеть эту новинку. Он разработал ее в течение трех недель и даже не предполагал, что она станет такой популярной. «Tennis for Two» заложила фундамент для компьютерных игр, а для ее работы использовался дисплей осциллографа. Игру восприняли как настоящий хит. Сегодня она хранится в Брукхейвенской национальной лаборатории.

Некоторые могут посмеяться над примитивизмом «Tennis for Two», но прежде чем это сделать, советую для начала заглянуть в документацию разработчиков тех времен. Окажется, что за простотой вида скрывается недюжинный конструкторский талант.

Первой 3D-игрой считается Maze War, которая увидела свет в 1974 году. Она была создана для Imlac PDS-1 Стивом Колли в Исследовательском центре Эймса NASA. Это First-person shooter в лабиринте с прямоугольными стенами, фиксированной перспективой и скрытием невидимых линий.

Imlac PDS-1, на котором запускалась Maze War представлял собой 16-битный графический мини компьютер с 8kb памяти. Из интересного нем использовался так называемый векторный дисплей. Изображение на подобном дисплее строится путем произвольного перемещения луча по экрану, а не по строкам, как у тогдашних ЭЛТ мониторов

Для чего мы вспоминали всю эту старую историю? Все просто. Когда мы встречаем старый проект и автоматически ставим на него ярлык «устаревшая графика», то стоит вспомнить, что процесс развития ступенчатый и то, что сейчас кажется устаревшим, еще вчера выглядело как будущее.

Между первой игрой на осциллографе и 3D-графикой к которой мы привыкли, лежит целая пропасть времени и технологий. Это ничто иное, как эпоха 2D технологий, которые мы не будем упоминать в этой статье, хотя многие элементы перекочевали из них и в 3D.

Сумма 3D технологий

Мир 3D-графики, а следовательно и игровой мир обильно засыпан разнообразными терминами. Когда речь идет о графических движках большинству людей не очень понятно, о чем на самом деле идет речь при очередном обещании разработчиков добиться настоящего фотореализма. Конечно, для полного понимания всех процессов нужно быть как минимум серьезным специалистом и не прогуливать в университете курс высшей и дискретной математики. Тем не менее мы попробуем разобраться в основных технологиях 3D графики хотя бы поверхностно, чтобы приоткрыть завесу тайны и понять, что же находится «под капотом» типичных игр.

Полигоны

В математическом мире точка — это всего лишь термин для указания места в геометрическом пространстве. И поскольку она не имеет физического размера, ее удобно использовать для установления точной позиции любых объектов. В мире 3D такая информация является крайне важной и от нее зависит, будет ли ваш персонаж стабильно находиться в нужном месте, а не провалится за пределы текстур. Именно от нее зависят расчеты начала и конца координат.

Наверное, в таком виде вам будет трудно понять, что на самом деле происходит в этой сцене. Все потому, что она состоит только из линий

Каждая точка в них связана с большим количеством вычислений. Если обрабатывать точки группами, особенно в виде треугольников, мы можем добиться значительной оптимизации в быстродействии. И вот мы приходим к тому, что наш треугольник есть не что иное, как три отрезка, соединяющиеся в трех точках (вершинах или vertex). Поскольку мы хотим увидеть перед собой именно 3D мир, то нам понадобится система координат с тремя значениями (x, y, z). Все данные вершин хранятся в непрерывном блоке памяти, который называется буфером вершин (vertex buffer).

В программе рендеринга фигуры, которые формируются на основе вершин называются примитивами. В рамках Direct3D они представлены списком точек, линий и треугольников. Если их правильно комбинировать, то линии треугольников используют общие вершины сразу для нескольких вершин.

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

С помощью многих таких многоугольников рисуется каркас 3D-модели. Затем на него накладываются текстуры, эффекты и освещение. В результате получается изображение, которое мы видим в игре.

Высокополигональная и низкополигональная модель

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

25 или более лет назад видеокарты банально не могли проработать большое количество полигонов, поэтому в каком-то условном Need For Speed можно было увидеть прямоугольные колеса на каком-то авто заднего плана.

Текстуры

Модель без текстуры

Текстуры — это, по сути, цифровые «обои» для 3D-объектов, которые делают их живыми и реалистичными. Представьте, что вы играете в игру, и без текстур все деревья, стены или персонажи выглядели бы как гладкие пластиковые фигурки. Это как макияж для виртуального мира, ведь без него все выглядит скучно и неестественно. Текстуры бывают разными: от простых растровых изображений до сложных процедурных, которые генерируются компьютером на основе алгоритмов.

Если взять, к примеру The Last of Us Part II, то здесь текстуры настолько детализированы, что можно рассмотреть каждую царапину на оружии или каждую складку на одежде персонажей. Разработчики из Naughty Dog использовали тысячи текстур, чтобы сделать мир постапокалипсиса максимально правдоподобным. Для их создания они сканировали реальных людей, чтобы передать мельчайшие детали, например поры или морщины. Благодаря этому герои выглядят почти как живые.

Текстуры высокого и низкого разрешения

Текстуры — это не только про красоту, но и про оптимизацию. Представьте, что в игре типа Assassin’s Creed Valhalla с огромным открытым миром каждая травинка или камешек рисовались бы отдельно — компьютер просто не выдержал бы! Поэтому разработчики часто используют повторяющиеся текстуры и процедурные методы, чтобы создавать детали на лету.

Текстуры в DOOM

Интересно, что первые игры, такие как Doom в 1993 году, имели очень простые текстуры из-за ограничений техники, но даже тогда они создавали атмосферу. Сегодня же текстуры — это целое искусство, которое сочетает технологии и творчество, чтобы мы могли окунуться в виртуальные миры с головой.

Тесселяция

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

С другой стороны, создание высокодетализированных моделей для рендеринга — это очень кропотливый процесс, и если модель будет находиться на каком-то расстоянии от сцены, все эти детали исчезнут впустую.

Каким-то образом нужно указать GPU, как разбить большой объект, например, один плоский треугольник на набор меньших треугольников, расположенных внутри исходного. Такой процесс называется тесселяцией (tesselation).

ATI TruForm

Первыми в решение этой проблемы стала компания ATI. В 2001 году увидела свет TruForm, которая по сути является первой реализацией тесселяции в компьютерных играх. Она использовалась в таких играх как Half-Life, Counter-Strike, Quake, Return to Castle Wolfenstein, Unreal Tournament. Через некоторое время технологии тесселяции эволюционировали и в 2011 году интегрировались в DirectX 11.

Шейдери

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

  • Pixel Shader. Применяются после обработки вершин, работая с пикселями. Шейдеры определяют цвет и текстуру объекта. Отвечают за освещение, текстурирование и визуальные эффекты.
  • Vertex Shader. Обрабатывают вершины 3D-объектов. Они отвечают за преобразование координат вершин из модели в экранные координаты. А также за вычисление нормалей и других атрибутов.
  • Compute Shader. Используются для вычислений, которые напрямую не связаны с графикой. Например, для обработки данных, симуляции физики или выполнения математических расчетов.
  • Geometry Shader. Работают с примитивами (например, треугольниками, точками и линиями). Принимают на вход уже обработанные вершины и создают новые — для создания теней, объемного освещения или упрощения геометрии

Вершинные шейдеры (Vertex Shader’s)

Вершинные шейдеры — это программы, которые выполняются на графическом процессоре для обработки данных о вершинах геометрических объектов в 3D-графике. Они отвечают за трансформацию координат вершин из пространства модели в пространство экрана, а также за вычисление таких параметров, как положение, нормали, текстурные координаты и другие атрибуты, которые затем передаются на следующие этапы графического конвейера.

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

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

Шейдеры в визуализации поверхности воды.

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

Это добавляет сценам глубины и реалистичности, ведь каждая травинка или ветка движется независимо, реагируя на виртуальное окружение. Такой подход значительно экономит ресурсы по сравнению с использованием предварительно записанных анимаций для каждого объекта.

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

Такие эффекты достигаются без необходимости создавать отдельные модели для каждого состояния объекта, что делает их незаменимым инструментом для современных игр с высоким уровнем детализации.

Пиксельные шейдеры

Пиксельные шейдеры выполняются видеочипом во время растеризации для каждого пикселя изображения. Они осуществляют выборку из текстур и математические операции над цветом и значением глубины (Z-buffer) пикселей. Все инструкции пиксельного шейдера обрабатываются для каждого пикселя отдельно после завершения операций с трансформацией и осветлением геометрии. В чем же они используются?

  • Стилизованное освещение. Во многих играх с точки зрения стиля значительно интереснее выглядит не освещение, а стилизация.
  • Эффекты деформации. Реалистичные волны, эффект от дождя, смятие при попадании пули.
  • Анимация объектов. Игры выглядит живее и интереснее, когда растения реагируют на персонажа или деревья покачиваются на ветру. Для этого также используются вертексные шейдеры.

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

С появлением пиксельных шейдеров версии по стандартам DirectX стало возможным не только мультитекстурирование, но и многое другое. Сегодня возможности пиксельных шейдеров достигли уровня, когда с их помощью можно реализовывать даже трассировку лучей (raytracing).

Процедурные текстуры (Procedural Textures)

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

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

No man’s sky

Одним из самых ярких примеров использования процедурных текстур является создание реалистичных ландшафтов в игре No Man’s Sky. В этой игре процедурные алгоритмы генерируют текстуры для поверхностей планет, таких как трава, песок или скалы, в зависимости от типа биома и условий среды. Таким образом, создаются уникальные миры для каждой планеты без необходимости вручную рисовать или сохранять тысячи текстур.

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

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

А что дальше?

В новом поколении видеокарт NVIDIA RTX 50 появилась реализация новейшей технологии нейронной шейдерной генерации, о которой мы уже писали ранее. Генеративный ИИ поможет разработчикам игр динамично создавать разнообразные ландшафты, внедрять генерировать более сложное поведение NPC в реальном времени и многое другое. Это изменит профессиональные приложения для 3D-моделирования уже в ближайшее время. Разработчики смогут создавать дизайн значительно быстрее, чем когда-либо, на основе заданных критериев.

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