Физика нереального мира. Школьная программа на страже современного 3D

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

Реальность против эффективности

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

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

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

Рейкастинг

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

  1. Все доступное в игре пространство — это комната с прямоугольными (чаще квадратными) стенами.
  2. Нет лестниц, лифтов, любого вида спусков и подъемов.
  3. Потолок везде имеет одинаковую высоту.
  4. Нет других трехмерных объектов, кроме стен, пола и потолка.
  5. Все остальные сущности — это «билборды», двумерные изображения, расположенные в трехмерном пространстве.

Wolfenstein 3D — первая действительно популярная игра, разработчики которой этим воспользовались.

Скриншот игры Wolfenstein 3D

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

Перечисленные допущения приводят к тому, что стены всегда находятся на одном уровне экрана — ровно посередине, поэтому нарисовать их относительно просто.

У такого типа игр много заметных особенностей. Например, все существа здесь постоянно повернуты к игроку лицом, так как они не трехмерные, рисуются без использования 3D, на них не падают тени.

Движок Wolfenstein 3D стал большим шагом в компьютерной графике, но разработчикам было понятно, что такого подхода надолго не хватит.

Растеризация

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

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

Схематическое отображение предмета на экран

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

Проецирование точки из пространства на плоскость экрана, вид сбоку

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

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.