Как игры рендерят картинку: краткая история с описанием базовых подходов

От однобитной графики до затенение по Фонгу.

Автор YouTube-канала DigiDigger опубликовал видео, в котором кратко рассказал про несколько базовых типов рендеринга. Он описал, как происходила отрисовка на восьмибитных консолях, как создавалось окружение в Wolfenstein 3D и Doom, и как генерируются карты теней. Мы выбрали из видео главное.

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

С развитием железа появилась возможность использовать восемь бит для передачи цвета. Для отображения красного и зелёного тратилось по три бита, а для синего — только два. Это связано с тем, что человеческие глаза менее восприимчивы к синему свету, поэтому разработчики решили «сэкономить» на его оттенках.

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

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

К примеру, в Wolfenstein 3D якобы представлено объёмное окружение, но на самом деле это фейковое 3D — команда id Software использовала технологию рейкастинга для формирования игрового мира. В игре была 2D-карта, на которой отображались все стены и препятствия. С позиции игровой камеры генерировались лучи, которые расходились по окружению. Если на 2D-карте луч натыкался на препятствие, то игра рендерила там стену.

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

Снизу — 2D-карта, на которой проходили все расчёты. Сверху — псевдо-3D окружение
Снизу — 2D-карта, на которой проходили все расчёты. Сверху — псевдо-3D окружение

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

Следующим важным этапом в эволюции графики стал Doom. Если в Wolfenstein 3D игрок перемещался исключительно по плоским поверхностям, то в Doom окружение стало намного более комплексным: к примеру, появились лестницы и подъёмники.

Игра отрисовывала только ту часть локации, в которой находился пользователь. Чтобы отрендерить сложное окружение Doom использовала технологию двоичного разбиения пространства (binary space partitioning), которое позволяло найти нужные зоны.

Всё игровое пространство представлено в виде иерархичной структуры. Локации поделены на зоны: большие пространства делятся на средние, а средние — на маленькие
Всё игровое пространство представлено в виде иерархичной структуры. Локации поделены на зоны: большие пространства делятся на средние, а средние — на маленькие
Вот так выглядит обычный уровень, если разделить его на множество мелких зон
Вот так выглядит обычный уровень, если разделить его на множество мелких зон
Благодаря иерархической структуре можно точно вычислить местоположение игрока на карте

Так как игра точно знает, в каком месте находится пользователь, она может избирательно отрисовать окружение. Но рендеринг в Doom сильно отличается от рейкастинга в Wolfenstein 3D. Игра измеряет, как далеко каждая стена находится от пользователя — это позволяет определить, под каким углом должен рендериться каждый отдельный объект окружения. Порядок отрисовки зависит от близости к игроку — сначала ближние, а потом дальние.

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

Рендеринг настоящих 3D-объектов устроен совсем иначе, так как модели обычно состоят из полигонов. Для имитации освещения яркость полигонов меняется в зависимости от местоположения источника света и угла, под которым лучи падают на треугольник. Такой подход называется Flat Shading.

Если лучи прямые, то полигон становится ярким
Если лучи прямые, то полигон становится ярким
Если лучи падают под углом, то полигон затемняется
Если лучи падают под углом, то полигон затемняется
Удалённость источника света также имеет значение
Удалённость источника света также имеет значение

На замену Flat Shading пришёл Phong Shading — этот подход позволил сделать освещение более плавным и визуально сгладить поверхность моделей.

Здесь можно наглядно увидеть разницу между Flat и Phong Shading
Здесь можно наглядно увидеть разницу между Flat и Phong Shading

Но всё это касается только собственных теней на объектах. Чтобы создать падающие тени на окружении, используется Shadow Mapping. Благодаря этой технологии рендеринг происходит с точки зрения источника света. Это позволяет сгенерировать карту поверхностей, на которые падают лучи. Соответственно, места, которые закрыты препятствиями, остаются в тени.

Как игры рендерят картинку: краткая история с описанием базовых подходов

Когда ко всему этому добавляются текстуры, всё становится немного сложнее. Чтобы создать корректное освещение, нужно точно понимать, на каких полигонах модели будет располагаться тот или иной фрагмент текстуры. Для этого нужно сгенерировать UV-карту.

Примерно так происходит процесс генерации UV-карты. С её помощью можно распознать, какие фрагменты нужно затемнить, а какие — сделать ярче

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

Без антиалиасинга
Без антиалиасинга
С антиалиасингом
С антиалиасингом

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

173173
13 комментариев

Статья обо всем и ни о чем (

56
Ответить

А вы хотели в 1 статью/ролик запихать то, чем люди занимаются всю жизнь?

И автору: тег #арт тут не при чём совсем, рендер/графика был бы корректнее.

4
Ответить

ну так это разбор 10 минутного родлика на картинки)))

3
Ответить

мне кажется это не так рабоатет

16
Ответить

А как?

Ответить

плюс, как-то лениво сделали картинки, в результате чего показали непонятно что и как

1
Ответить

Вот это напоминает Фибоначчи.
А последние картинки выглядят одинаково

4
Ответить