Обучение технологии ray-casting, часть 1

Двумерное indie… трехмерные AAA-проекты… А может что-то промежуточное?

Приветствую всех читателей. Мною было решено обобщить и перевести замечательную серию статей «Ray-Casting Tutorial For Game Development And Other Purposes» за авторством Ф. Пермади по изучению технологии ray-casting.

image

В данной публикации затронуты и объединены What is Ray-Casting и Ray-Casting vs Ray-Tracing For Game Development оригинальные статьи.

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

Ну что ж… Начнем!

Что такое ray-casting?


Ray-casting (далее — бросание) — это технология, которая преобразует ограниченный набор данных (максимально упрощенная карта, либо же план этажа) в 3D проекцию путем «бросания лучей» из точки обзора по всей области видимости. К примеру, на картинке ниже показано, как бросание преобразует что-то двумерное A во что-то почти что трехмерное B.

image

Ray-casting и ray-tracing


Как и ray-casting, ray-tracing (далее — трассировка) «определяет видимую часть поверхности путем бросания воображаемых лучей света из точки обзора в сторону объекта на сцене».

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

Бросание быстрее трассировки. Это возможно за счет того, что оно использует некоторые геометрические ограничения для ускорения процесса рендеринга. К примеру, стены всегда перпендикулярны полу (это можно увидеть в таких играх как Doom или же Wolfenstein 3D). Если бы не такие ограничения, то технология бросания не была бы возможна.

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

Принцип


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

Трассировка: каждый луч вычисляется по отдельности, то есть каждая точка на экране монитора (обычно, пиксель) трассируется одним своим лучом. К примеру, на экране с разрешением 320х200 нам необходимы 64 тысячи (320 * 200 = 64000) лучей, что в 200 раз медленнее в сравнение с бросанием.

Формула


Как правило, при бросании допустимы погрешности в вычислениях. При трассировки же все должно быть максимально точным.

Скорость


Бросание в разы быстрее трассировки и подходит для процессов реального времени. Трассировка же ни как не подходит (разве что у нас не имеется ПК с частотой в 500ГГц).

Качество


При бросании мы получаем изображение среднего / плохого качества. Можно заметить деление на блочные элементы. При трассировке же картинка максимально реалистичная — иногда даже слишком.

image

Сцена из Wolfenstein 3D. Заметьте, картинка делится на прямоугольные блоки. Объекты (оружие) и враги (собака) — это просто прозрачные растровые изображения, которые масштабированы и отрисованы поверх заднего фона.

image

Сцена из игры 7th Guest. Результат рендеринга поражает. Тем не менее, передвижения игрока ограничены ранее определенными путями (это обусловлено тем, что количество заранее отрендеренных картинок ограничено).

Внешний мир


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

Память


Бросание: отрендеренные изображения не сохраняются на диск. Обычно, только сама карта сцены хранится на носителе, а соответствующие изображения генерируются «на лету».

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

Примеры


Бросание:

  • Wolfenstein 3D (iD Software)
  • Shadow Caster (Raven)
  • Arena (Bethesda)
  • Doom (iD Software)
  • Dark Forces (LucasArts)

Трассировка:

  • 7th Guest (Trilobyte)
  • Critical Path (Mechadeus)
  • 11th Hour (Trilobyte)
  • Myst (Cyan)
  • Cyberia (Xatrix)

Конец первой части

Средняя зарплата в IT

120 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 6 247 анкет, за 1-ое пол. 2021 года Узнать свою зарплату
Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 8

    +5
    Ray-casting (далее — бросание)

    А давайте без этой отсебятины. «Бросание»… Что за чушь!
    Ray-casting — он и в Африке ray-casting
      0
      Doom (iD Software)


      Где именно в Domm применяется это самое ваше «бросание»?
        0
        В исходниках. Doom 1,2 Duke Nukem 3D использовали отсечение лучей для рендринга.
          +2
          Конкретнее, пожалуйста. Doom использует BSP-дерево с плавающими линиями горизонта. Duke Nukem 3D использует экранный портал. Никакого рендеринга «бросанием» лучей там нет и в помине. Отбрасываются или корректируются невидимые точки стены (те, что за спиной игрока). Далее вычисляется проекция угловых точек стены (четырёх), они отсекаются по экрану, и промежуток закрашивается. Примерно вот так. Что же тогда может в Doom быть реализовано «бросанием»?
          +1
          В первой версии Doom как раз и был реализован Ray-casting.
          Автор всё верно написал.
          Я в 1995-м купил как-то книгу, где было подробно расписан этот механизм и я его повторил потом на Pascal (сейчас стыдно про это говорить, но в то время это было нормой)

          P.S. Книга: Секреты программирования игр
          Автор: Ла Мот А., Ратклифф Д., Семинаторе М.
          Издательство: Питер
          Год: 1995
          ISBN: 5-88782-037-3
            0
            В первой версии Doom как раз и был реализован Ray-casting.


            В какой «первой версии»? В той, где Кармак экспериментировал с движками и которая в продажу не пошла? Ну так там много чего могло быть. А толку-то? В том Doom, который вышел, никакого «бросания» не было.
          +1
          Если бы не такие ограничения, то технология бросания не была бы возможна.
          Разумеется работал бы, только требовал бы больше ресурсов.
          Собственно все эти описания ray-cast движков (кстати, в те времена в русскоязыкной литературе термин переводили как «отсечение лучей», намекая что в отличии от обратной трассировки процесс останавливается на первом же пересечении) умалчивают о главной фишке, которая позволяет им работать так быстро, что первые игры работали ещё на двойках (пусть и не в полный экран). При полноценном отсечении или трассировке вам надо пустить по лучу из точки «глаз» наблюдателя через каждый пиксель экрана, чтобы определить в какой цвет его красить. Для разрешения 320x200 это 64000 лучей на каждый кадр. Однако, учитывая, что стены только вертикальные и только от пола до потолка — мы можем ограничиться лишь одной линией отсечения вдоль виртуального горизонта, что для vga режима даст всего 320 лучей на кадр. Вот оно то, драматическое улучшение алгоритма.
          Раз стена занимает всегда всю высоту, то найдя точку пересечения луча со стеной мы можем сразу отрисовать всю колонку текстуры стены от пола до потолка. Собственно, в Wolf3D текстуры даже хранились в таком перевёрнутом виде, поколоночно, а не построчно, как обычно.
          Второй трюк в том, что стены имеют квадратное основание, т.е. все её стороны равны, а их расположение строго дискретно. Грубо говоря вся карта представляет собой двумерный массив, в каждой из ячеек которой стена может или быть или не быть. Это превращает задачу поиска пересечения луча со стеной в тривиальную.
            +1

            Ребята. Перевод статьи 1996 года не очень своевременный. Как раз два года назад начали появляться аппаратные средства для рейтрейсинга (пересечение/построение BVH и пересечение луча с треугольником). Теперь это не так уж и медленно.

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

            Самое читаемое