Как игры рендерят картинку: краткая история с описанием базовых подходов
От однобитной графики до затенение по Фонгу.
Автор YouTube-канала DigiDigger опубликовал видео, в котором кратко рассказал про несколько базовых типов рендеринга. Он описал, как происходила отрисовка на восьмибитных консолях, как создавалось окружение в Wolfenstein 3D и Doom, и как генерируются карты теней. Мы выбрали из видео главное.
Из-за технических ограничений в ранних играх было всего два цвета — чёрный и белый. Это связано с тем, что для отображения цвета использовался всего один бит информации: в результате пиксель либо излучал свет, либо нет.
С развитием железа появилась возможность использовать восемь бит для передачи цвета. Для отображения красного и зелёного тратилось по три бита, а для синего — только два. Это связано с тем, что человеческие глаза менее восприимчивы к синему свету, поэтому разработчики решили «сэкономить» на его оттенках.
Значительной вехой в развитии компьютерной графики стало появление трёхмерного пространства в играх. Но ранние компьютеры были недостаточно мощными, чтобы рендерить полноценные модели, поэтому разработчики шли на разные ухищрения.
К примеру, в Wolfenstein 3D якобы представлено объёмное окружение, но на самом деле это фейковое 3D — команда id Software использовала технологию рейкастинга для формирования игрового мира. В игре была 2D-карта, на которой отображались все стены и препятствия. С позиции игровой камеры генерировались лучи, которые расходились по окружению. Если на 2D-карте луч натыкался на препятствие, то игра рендерила там стену.
Чтобы создать правильную линейную перспективу, игра анализировала длину луча, который наткнулся на препятствие — чем длиннее луч, тем дальше стена. С помощью такого подхода и создавалось окружение в игре.
Процесс рейкастинга происходил на каждом кадре, благодаря чему игрок мог непрерывно перемещаться по фейковому 3D-окружению. Это позволило создать псевдо-объёмные уровни на железе, которое не поддерживало 3D.
Следующим важным этапом в эволюции графики стал Doom. Если в Wolfenstein 3D игрок перемещался исключительно по плоским поверхностям, то в Doom окружение стало намного более комплексным: к примеру, появились лестницы и подъёмники.
Игра отрисовывала только ту часть локации, в которой находился пользователь. Чтобы отрендерить сложное окружение Doom использовала технологию двоичного разбиения пространства (binary space partitioning), которое позволяло найти нужные зоны.
Так как игра точно знает, в каком месте находится пользователь, она может избирательно отрисовать окружение. Но рендеринг в Doom сильно отличается от рейкастинга в Wolfenstein 3D. Игра измеряет, как далеко каждая стена находится от пользователя — это позволяет определить, под каким углом должен рендериться каждый отдельный объект окружения. Порядок отрисовки зависит от близости к игроку — сначала ближние, а потом дальние.
Рендеринг настоящих 3D-объектов устроен совсем иначе, так как модели обычно состоят из полигонов. Для имитации освещения яркость полигонов меняется в зависимости от местоположения источника света и угла, под которым лучи падают на треугольник. Такой подход называется Flat Shading.
На замену Flat Shading пришёл Phong Shading — этот подход позволил сделать освещение более плавным и визуально сгладить поверхность моделей.
Но всё это касается только собственных теней на объектах. Чтобы создать падающие тени на окружении, используется Shadow Mapping. Благодаря этой технологии рендеринг происходит с точки зрения источника света. Это позволяет сгенерировать карту поверхностей, на которые падают лучи. Соответственно, места, которые закрыты препятствиями, остаются в тени.
Когда ко всему этому добавляются текстуры, всё становится немного сложнее. Чтобы создать корректное освещение, нужно точно понимать, на каких полигонах модели будет располагаться тот или иной фрагмент текстуры. Для этого нужно сгенерировать UV-карту.
Игра выводит изображение моделей на экран, который состоит из множества пикселей, из-за которых возникает эффект лесенки. Чтобы решить эту проблему, используется технология антиалиасинга, которая замыливает острые грани.
В заключение автор добавил, что это лишь базовые примеры и технологии рендеринга. На самом деле есть огромное количество других алгоритмов, которые позволяют добиться разных эффектов и улучшить общее качество графики.