Пиксели и воксели в чем разница
Слово воксель - voxel - образовано от слова VOlume и аббревиатуры piXEL (pixel, расшифровывается как PICture'S ELement, элемент картины). То есть, переводится как "элемент объемного изображения" или "элемент объема изображения".. Обычно это шар или куб.
Не стоит приписывать пикселу и вокселю равносторонность. Это удобно, не более того. Иногда даже удобнее считать воксель неким параллепипедом - например, в карте высот.
Как работают воксельные движки
Воксели – точки в виртуальном трехмерном мире, эдакие маленький кубики, из которых можно построить любую фигуру. Использование вокселей дает нам возможность сохранить трехмерную фигуру любой сложности. Поэтому воксельные движки в компьютерных играх чаще всего применяются для генерации земного ландшафта, всех его бугорков и неровностей. Идеальный пример - серия вертолетных симуляторов Comanche от фирмы Novalogic. Впрочем, воксельной движок можно использовать и для других целей (в Blade Runner все трехмерные модели персонажей состоят из вокселей).Давайте попытаемся разобраться, как именно воксельный движок создает трехмерный ландшафт. Вначале берется плоская картинка (как будто мы сфотографировали кусок земли сверху) и так называемая "карта высот" (heightmap) - массив данных, в котором хранятся значения высоты для каждого пикселя нашей картинки. Теперь движок в состоянии превратить плоский пиксель в трехмерный воксель. При этом - чем точнее будет наша карта высот, тем реалистичнее будет наш трехмерный ландшафт. И наоборот, если взятая карта высот будет слишком неточной (скажем, сможет хранить лишь десять различных отсчетов по оси Z), то финальная картинка получится весьма угловатой (так называемый эффект лесенки).
Окружающий нас мир изобилует мельчайшими деталями. Поэтому в воксельных движках используются специальные технологии, улучшающие качество heightmap низкого разрешения. Два наиболее распространенных способа основаны на диаметрально противоположных алгоритмах: первый добавляет множество новых отсчетов в карту высот, используя псевдослучайные карты смещения (displacement maps), второй сглаживает угловатости, получая новые значения по оси Z путем интерполяции между существующими.
К этому моменту наш движок вполне может построить трехмерный скелет кусочка земли. Осталось лишь найти цветовую карту (color map) и покрасить верхний слой вокселей всеми цветами радуги. Для этого потребуется обыкновенная плоская текстура. Теперь, если ставить кубики-воксели друг на друга и присваивать самому верхнему определенный цвет, рано или поздно можно добиться желаемого результата. Впрочем, результат мы получим скорее поздно, нежели рано, ибо движок наш выполняет слишком много ненужной работы. Человечество еще не научилось видеть сквозь предметы, поэтому глаза наши фиксируют только верхний слой кубиков и даже не задумываются о том, что под всем этим кроется груда вокселей, каждый из которых рендерил наш трудолюбивый движок. Чтобы избавить его от лишней работы, конечный рендеринг использует технологию трассировки лучей. Несмотря на громоздкое название, ничего сложного в ней нет.
Представьте себе невидимый луч, испускаемый из вашего глаза на определенную точку экрана. Проходя через экран монитора, луч попадает в наш виртуальный мир и продолжает двигаться в пространстве до тех пор, пока не натолкнется на какой-либо объект. Допустим, этим объектом стал красный кубик. Теперь глаз знает, что в этой точке экрана находится нечто красное. Просмотрев весь экран, глаза формируют полную картинку и скармливают ее мозгу. Ну, не совсем так, но вряд ли офтальмологи будут читать эту статью.
Движок наш с офтальмологами не знаком, поэтому считает, что человеческий глаз работает именно так, как описано в предыдущем абзаце. И поэтому рендеринг финальной картинки методом трассировки лучей происходит следующим образом: нашли самую нижнюю координату в карте высот, выпустили туда луч, натолкнулись на какое-нибудь препятствие, считали значение в карте цветов, покрасили пиксель и поднялись на один пиксель повыше. Снова пустили луч, натолкнулись на что-то твердое и т. п. Интересно, что и на этом этапе можно немножко ускорить работу движка, слегка изменив алгоритм. Предположим, пущенный луч уперся в стенку красного кубика, причем в самый низ. Следующий по счету пиксель сверху тоже будет красным, и что самое важное - будет иметь те же координаты по осям X и Y. Зачем же, спрашивается, пускать еще один луч от самого "глаза", если можно сначала подняться наверх и посмотреть, что там такое. Если стенка, то сразу ее покрасить, и снова наверх - до тех пор, пока на свежий воздух не выберемся, сиречь ничего не найдем. Вот тогда и новый луч выпустим. Недостатков у такого подхода никаких - сплошная экономия времени.
Если воксельный движок написан без глюков (а они такие), то рано или поздно луч упрется в пластмассовый ободок монитора, а на экране появится очередной кадр. Потом все начнется с самого начала, но повторение, хоть и мать учения, но совсем не повод писать еще два-три абзаца с кратким пересказом предыдущих двух-трех абзацев.
Использовать воксели в играх было бы очень целесообразно.Воксели это гораздо более реалистичный подход к представлению трехмерной модели на экране монитора чем полигоны. Просто так уж случилось что в пору зарождения 3D, производители аппаратных частей, в частности 3D акселераторов, избрали технологию полигонов а не вокселей.
Может быть если бы тогда все получилось иначе, сейчас бы мы играли в полностью воксельные игрушки и интересовались поддержкой полигонов.
Сейчас на рынке представлено совсем немного игр с воксельной графикой: как пример C&c Tiberian Sun (на скрине сверху), Периметр от Российских разработчиков, но чаще воксели используют в авиасимуляторах. Однако уже существуют игры, сочетающие в себе как полигональную, так и воксельную графику (первыми такое проделали создатели Zar). И результат получается прямо-таки великолепный: красивые детализированные ландшафты и аккуратненькие модели с цветным освещением.
Так что будущее, как мне кажется, именно за таким вот симбиозом. Но это зависит от крупных магнатов, производителей "железа". Многие считают технологию тупиковой и устаревшей.
Добавление №1 Взято с википедии
Новый Воксельный движок (Острожно! Много умного текста)
id Tech 6 — игровой движок серии id Tech, который в настоящее время разрабатывается американской компанией id Software и который должен стать преемником id Tech 5. id Tech 6 позиционируется как движок для ПК и, возможно, для игровых консолей следующего поколения, т.е. для будущих наследников PlayStation 3 и Xbox 360. На данный момент не анонсирована ни одна игра на id Tech 6, сам движок находится на начальной стадии разработки. Однако уже известно о некоторых характеристиках и инновационных особенностях движка. Основными разработчиками движка являются Джон Кармак (англ. John Carmack) и Йон Олик (англ. Jon Olick).Описание
В движке будет использоваться инновационная технология «Sparse Voxel Octree» (SVO, русск. Разреженное воксельное октодерево). Геометрия игрового уровня, поддерживаемая этой технологией, будет иметь не полигональную, а воксельную геометрию, т.е. геометрические объекты будут состоять из вокселей. Воксели будут сохраняться в октодереве. Для освещения будет использоваться технология рейкастинга (англ. raycasting, бросание лучей). Одна из целей технологии «SVO» состоит в том, чтобы иметь возможность «подгружать» части октодерева в графическую память (видеопамять), идя вниз вдоль ветвей дерева. Это значит, что объекты на нижних ветвях октодерева, т.е. те объекты, которые расположены к наблюдателю ближе всего, будут рендерится в максимальном качестве, с максимальной детализацией и текстурами максимального разрешения. Соответственно, для дальних объектов, которые расположены на более высоких ветках октодерева, будет использоваться меньшее качество, они будут построены на вокселях больших размеров. Таким образом, данная технология является способом контроля уровня детализации (англ. level of detail — LOD).
Геометрические объекты, полученные благодаря SVO, теоретически могут иметь неограниченное число уровней детализации, более того, данные уровни детализации генерируются автоматически. Это устраняет потребность в использовании разных псевдотрёхмерных методик типа параллакс-маппинга. Тем не менее, все тесты с использованием SVO нуждаются в большом количестве памяти (вплоть до нескольких гигабайт). Йон Олик заявил, что является возможным сжатие такого SVO до уровня 1,15 битов на один воксел.
В id Tech 6 с помощью SVO будет рендериться только статическая геометрия, например ландшафт, строения и т.д. Также из-за этого рейкастинг-освещение также будет статическим. Все динамические объекты типа персонажей, транспорта и т.д. будут «построены» на классических полигонах и динамически освещаться с помощью стандартных растеризационных методик. Олик заявил, что создание динамических объектов и динамического освещения с помощью SVO возможно, однако это потребует быстрого обновления октодерева для рендеринга. Согласно Олику, динамические освещение и геометрия, представленные SVO, которые позволят создавать изменяемую геометрию, будут присутствовать в id Tech 7.
Кроме SVO, id Tech 6 будет использовать более продвинутую технологию мегатекстуры, которая впервые использовалась ещё в id Tech 4. При помощи данной технологии вся поверхность уровня покрывается одной текстурой.
Разработчики id Tech 6 и SVO ориентируются не на текущее аппаратное обеспечение, а на аппаратное обеспечение, которое на момент начала разработки ещё не доступно. В частности, id Tech 6 ориентируется на CUDA, Intel Larrabee и AMD Fusion. Также Кармак заявил, что если игровые консоли следующего поколения (наследники Xbox 360 и PlayStation 3) будут иметь такие аппаратные спецификации, которые будут удовлетворять архитектуре движка, то, возможно, id Tech 6 будет работать и на этих консолях.
Согласно Олику, на видеокарте GeForce GTX 280 при стандарте 720p (1280х720 пикселей) id Tech 6, возможно, сможет «выдавать» 60 кадров/сек. При этом движок стабильно будет «выдавать» не менее 30 кадров/сек.В интервью сайту PC Perspective на вопрос о том, каким должно быть и на сколько должно измениться аппаратное обеспечение, чтобы быть подходящим для SVO, Кармак ответил следующим образом: «Аппаратное обеспечение, спроектированное специально для SVO, может быть намного меньше, проше и эффективнее, чем средства общего назначения, но никто, кто находится в здоровом уме, не захочет сделать ставку на нашу технологию и не захочет создавать специфическое аппаратное решение для технологии, которую ещё не использовал ни один разработчик».
Порой я ничего не могу с собой поделать, поэтому вместо прямого ответа написал целую статью на эту тему.
Я понял вопрос. В обществе появляются такие вещи, как афиши фильма «Пиксели» (2015), и они действительно сбивают с толку. Это пиксель? Или воксель? Это птица? Или самолет? Они определенно затрудняют суть.
Не бойтесь, теперь вы в надежных руках. Когда вы закончите читать эту статью, то будете знать все, что нужно, о пикселях, вокселях и обо всем, что между ними. Возьмите печенье.
Это длинная статья, но я обещаю: вы читаете Retronator Magazine, а это значит, что здесь больше иллюстраций, чем текста.
Сначала я дам вам небольшую базу, чтобы прояснить полную картину. Есть 2 основных способа представления графики на компьютерах: векторный и растровый.
Математическая точность векторной графики (слева) и дискретная сущность растровой графики (справа)Векторная графика описывает изображение с помощью математических уравнений, обычно представляющих такие вещи, как линии, кривые и фигуры. В отличие от нее растровая графика описывает изображение как матрицу цветовых значений, которые располагаются одно за другим в виде сетки.
Второе различие в компьютерной графике — представление 2D- и 3D-пространств. Вместе с векторным / растровым разделением это дает нам 4 квадранта для рассмотрения:
ВЕКТОРНАЯ ГРАФИКА
В 2D-векторной графике каждая точка на линии или фигуре описывается вектором, имеющим 2 компонента: x и y. Вот что делает ее двухмерной: два компонента — два измерения.
Так 2D-векторы описывают все точки в 2D-векторной графикеВот пример так называемого low-poly (низкополигонального) 2D-векторного рисунка:
Он полностью построен из 2D-полигонов (в данном случае — треугольников). Термин «низкополигональный» означает, что количество полигонов, используемых для создания изображения, относительно небольшое (низкое). За счет этого треугольники легко заметны.
Давайте добавим измерение. В 3D-векторной графике ситуация такая же, но каждый вектор использует 3 компонента: x, y и z. Три компонента — три измерения.
Посмотрим на низкополигональный 3D-рисунок:
Большая разница между 2D-изображением скалы Улуру и 3D-изображением гоночного трека здесь заключается в том, что мы можем смотреть на трек из любой точки, какой пожелаем.
Чтобы показать гоночный трек на вашем экране (по сути 2D-поверхности), мы должны выбрать одну конкретную точку обзора и спроецировать 3D-геометрию на 2D с этой точки обзора.
Так мы получаем одно конкретное 2D-изображение.
Но мы можем использовать трюк, чтобы показать объемную сущность 3D-геометрии даже в 2D. Можем сделать анимацию, в которой перемещаем точку обзора вокруг объекта (или сохраняем точку обзора при вращении самого объекта, как видно ниже).
Ура, мы видим, что это действительно 3D, даже очки не нужны!
РАСТРОВАЯ ГРАФИКА
То была всего лишь разминка. Давайте двинемся от векторов дальше и посмотрим, как растровая графика взаимодействует с 2D и 3D.
В 2D-растровой графике изображение делится на ряд строк и столбцов одинакового размера:
Каждая ячейка называется «пиксель» (от англ. picture element — элемент картинки). Помимо 2D-координаты в сетке (x, y), его основное свойство — цвет, который помещается в эту координату.
Мы видели, как в низкополигональных векторных рисунках используются крупные, заметные многоугольники. Если сделать то же самое с растровой графикой (использовать крупные, заметные пиксели), мы получим пиксель-арт.
В случае с 2D-пиксельными артами, даже если они пытаются представить 3D-объекты (авто Lotus Esprit или истребитель X-wing), они рисуются непосредственно на 2D-сетке пикселей. Вы не можете поворачивать такое изображение, как мы делали с 3D-векторным фургоном выше. Точно так же рисунок скалы Улуру (№5 в статье) нельзя повернуть. Несмотря на то, что он состоит из многоугольников, они были размещены не в 3D-пространстве, а непосредственно в 2D.
До сих пор мы рассматривали 2D- и 3D-векторную графику, а также 2D-растровую. Последний шаг — 3D-растровая графика.
В 3D-растровой графике объем разделен на равномерно расположенные строки и столбцы, охватывающие все 3 разных направления: вверх-вниз, влево-вправо, внутрь-наружу. Это делит 3D-пространство на кубы, известные как «воксели» (от англ. volume elements — объемные элементы, либо volumetric pixels — объемные пиксели). Каждый воксель определяется 3D-координатой и цветом в этой координате.
Прямо как пиксель-арт, который представляет собой изображение с умышленным размещением пикселей, только теперь это воксель-арт, где каждый куб тщательно просчитан.
Очень похоже на ЛЕГО, не правда ли?
Обратите внимание: поскольку мы в 3D-пространстве, воксели тоже можно наблюдать под любым углом. Вот еще один ракурс воксельной планеты Татуин:
Мы даже можем делать анимацию! Вот пример одного из анимированных воксельных персонажей от Sir Karma:
Сравните его с 2D-пиксельным персонажем:
Смотрите, как в воксель-арте анимация изменяет присутствие (цвет) маленьких кубиков — вокселей, а в пиксель-арте изменение цвета происходит на маленьких квадратиках — пикселях.
Теперь вы знаете разницу между пикселями и вокселями (и многое другое… ха-ха, сорян).
Но я не останавливаюсь на этом. Видите ли, причина, по которой я объяснил вектор / растр и 2D / 3D, заключается в том, что на современных дисплеях каждый тип графики в итоге выводится как 2D-растровое изображение.
Причина, по которой мы озаботились этим в журнале о пиксельной графике, заключается в том, что мы можем использовать эти типы преобразований для создания современных стилей пиксель-арта, которые используют объекты из квадрантов непиксельной графики.
«Я могу создать пиксель-арт из вокселей или 3D-моделей?» — спросите вы. Разумеется! Искусные методы затенения и рендеринга позволяют нам создавать уникальные визуальные стили, которые переносят пиксель-арт в будущее.
ВЕКТОРНЫЕ ДИСПЛЕИ И ПРОЕКЦИИ
Диаграмма выше не совсем правдива. Есть способ отображать 2D-векторную графику напрямую, пусть и с небольшой оговоркой.
Если у вас есть 2D-векторное изображение, его можно напрямую вывести только на векторный монитор, такой как используемый аркадной игрой Asteroids от Atari.
Вот как это будет выглядеть на практике (игра в стиле Asteroids, выведенная на осциллограф):
Таким же способом мы можем выводить и 3D-векторные изображения (обычно называемые 3D-моделями).
Как упоминал ранее, сначала 3D-модели надо спроецировать на два измерения, чтобы получить 2D-векторное изображение, которое можно вывести на векторный монитор.
Я также настоятельно рекомендую посмотреть трейлер VEC9 ради огромной дозы офигенных 80-х:
РАСТЕРИЗАЦИЯ
Сегодня трудно найти векторный монитор за пределами музея. Вместо них мы используем дисплеи, которые состоят из… пикселей!
Современный ЖК-дисплей создает разные цвета, включая и выключая (или где-то посередине) маленькие красные, зеленые и синие жидкокристаллические индикаторы. Если интересно, нечто похожее было даже во времена ЭЛТ (электронно-лучевых трубок), просто они использовали 3 типа люминофора в разных конфигурациях, которые светились красным, зеленым или синим светом при попадании электронного луча.
Так что же делать, если у нас есть векторное изображение и только растровый дисплей, на котором его надо вывести? Ну, чтобы перейти от 2D-векторного изображения к 2D-растровому изображению, его необходимо отрендерить, или растеризовать. Каждый многоугольник (обычно треугольник) рендерится в сетку пикселей.
Растеризация с помощью семплинга, слайд из Making WebGL Dance (Steven Wittens, 2013)Это можно распространить и на рендеринг 3D-моделей на растровом дисплее. В первую очередь 3D-треугольники проецируются в 2D-треугольники. Во вторую — 2D-векторные треугольники растеризуются в пиксели.
ТРИАНГУЛЯЦИЯ
А что насчет вокселей? Сегодня самый распространенный подход к воксель-арту — представление каждого вокселя в виде 3D-векторного куба. Мы делаем это, создавая 3D-модель с треугольниками, размещенными вдоль сторон воксельных кубов.
Как и ранее, 3D-треугольники затем проецируются в пространство 2D-изображения и, наконец, растеризуются для вывода 2D-растрового изображения.
Вращающийся куб, тех. демонстрация (Matej ‘Retro’ Jan, 2016)Так мы подходим к самому распространенному сегодня стилю воксель-арта, созданному почти исключительно с помощью бесплатного инструмента моделирования MagicaVoxel.
РЕЙКАСТИНГ
Вообще-то необязательно использовать кубический подход. Каждый воксель можно рассматривать как точку в 3D-пространстве, как сгусток объема в этом месте. Вы можете нарисовать каждый воксель в 2D-пространстве напрямую, разместив пиксель (или несколько) в этом 2D-местоположении. Или наоборот — вы берете пиксель на экране и видите, какой воксель в сцене появляется в этом месте.
Этот обратный подход называется «рейкастинг» (метод «бросания лучей»). Вы бросаете луч из точки обзора на сцену и видите, в какой воксель попали. Фактически, вы бросаете много лучей, чтобы охватить все поле зрения.
Простой рейкастинг с коррекцией «рыбий глаз», Kieff (Lucas Vieira, 2012)Впервые эта техника была применена в Wolfenstein 3D, где воксели представляли собой целые блоки комнат, так что это был просто еще один способ рендеринга подхода «воксель как блок». Однако он был очень быстрым, потому что вам нужно было лишь бросить один луч на целый столбец пикселей на экране. Это сделало его по существу 2D-процессом, поэтому иногда этот тип 3D-графики мы также называем 2.5D (третье измерение получается фальшивым, поскольку оно просто позволяет выдавить 2D-поверхности).
Хотя, мы обычно не думаем о Wolfenstein как о рисовании вокселей. Мы должны сделать ячейки достаточно маленькими и позволить им иметь разную высоту. Так мы пришли к классическим движкам воксельной графики 90-х.
Поначалу воксели использовались только для рельефа. Они должны были упростить вещи, так что вся объемная информация была просто возвышением рельефа, сохраненным в 2D-изображении, также называемым картой высот.
Ограничение воксельной информации картой высот означает, у вас не может быть, например, нависающих скал. Но, черт побери, рельеф имел столько деталей, сколько мы никогда раньше не видели в играх.
Художник Матеуш Retro Ян, рисующий в стиле пиксель-арт, написал для издания Retronator Magazine статью, в которой попытался ответить на вопрос, в чём разница между пикселями и вокселями, но при этом рассказал намного больше.
Ян объяснил, чем игры девяностых отличаются от современных 2D и 3D-игр в пиксельной стилистике, а также изучил разные варианты такого подхода к созданию графики.
Редакция DTF публикует перевод материала.
Предупреждение: в тексте много картинок и GIF-анимаций, поэтому он может долго прогружаться. Особенно с мобильных устройств.
Ранее в этом году мне задали такой вопрос: в чём разница между пикселями и вокселями?
Иногда бывает сложно удержаться, поэтому вместо прямого ответа я написал по этому поводу целую статью.
Вопрос вполне логичен. Общество вываливает на вас что-то вроде постера к фильму «Пиксели», и вы не понимаете, что происходит. Это вот пиксели? Или это воксели? Это птица? Самолёт? Никто вам ничего не объясняет.
Я до сих пор не могу решить, должен ли я из своей любви к старым играм посмотреть этот фильм, или наоборот НЕ смотреть его.Но не бойтесь, пока я с вами, всё будет хорошо. К моменту, как вы прочитаете этот материал, вы будете знать всё про пиксели, воксели и всё, что находится между ними. Расслабьтесь, заварите чаю.
Начнём с основ, иначе вы не сможете понять общей картины. Есть два основных способа представления компьютерной графики: векторный и растровый.
Математическая точность векторной графики (слева) против дискретной природы растровой (справа).Векторная графика описывает изображение с помощью математических формул, обычно с помощью таких вещей как прямые, кривые и различные геометрические формы.
Растровая графика представляет изображение как массив цветных точек, расположенных друг за другом по сетке.
Второе различие — способ представления компьютерной графики в двумерном и трёхмерном пространстве. Если разделить их, а заодно векторную и растровую графику, то мы получим такую таблицу:
В двумерной векторной графике каждая точка на линии или фигуре описывается вектором с двумя составляющими (x и y). В общем, именно поэтому двумерная графика так и называется.
Именно так двухмерная векторная графика строит изображение с помощью двухмерных векторов.А вот пример низкополигонального двухмерного векторного изображения.
Оно построено исключительно из двумерных полигонов (в данном случае — треугольников). Изображение называется низкополигональным из-за сравнительно небольшого числа составных элементов. Именно поэтому треугольники легко заметны.
Добавим ещё одно измерение. В трёхмерной векторной графике всё работает так же, но добавляется ещё одна компонента — z. Три компоненты — три измерения.
Концепт игры Racetrack для iOS, Автор: Тимоти РейнольдсРазница между двумерным изображением Улуру и трёхмерной моделью гоночного трека в том, что на трек мы можем посмотреть под любым углом.
Чтобы отобразить трек на вашем экране (то есть на двумерной поверхности), мы выбрали несколько углов и отобразили трёхмерную геометрию на плоском изображении.
Так и получается двумерное изображение.
Но есть одна хитрость, позволяющая показать трёхмерную геометрию в 2D. Просто измените угол угол обзора или повращайте объект.
Да, действительно, перед нами трёхмерный объект. И даже очки не нужны!
Так, немного разогрелись. Теперь разберёмся с тем, как растровая графика работает в 3D и 2D.
Растровое двумерное изображение представляется массивом с определённым количеством столбцов и строк.
Каждая клетка в таком массиве называется пикселем (от слов picture element — pixel). Помимо его координат в массиве пиксель определяется цветом.
Мы уже узнали, что низкополигональное векторное изображение состоит из заметных полигонов. Если мы сделаем то же самое с растровой графикой и заметными пикселями, то получим пиксель-арт.
На двумерной пиксельной сетке можно изобразить трёхмерные объекты вроде автомобиля Lotus Esprit или X-Wing из «Звездных войн», но для изображения они не трёхмерны. Их нельзя покрутить и рассмотреть с разных сторон, как гоночный трек или машинку. Точно так же мы не можем вертеть рисунок Улуру — изображение состоит из полигонов, но они располагаются не в трёхмерном пространстве, а в двумерном.
Итак, мы поговорили о двумерной и трехмерной векторной графике и 2D-растровой графике. Не хватает только 3D-растровой графики.
В трёхмерной растровой графике всё пространство разделено на колонки и строчки по всем трём направлениям (высота, ширина и глубина). В результате трёхмерное пространство становится набором разноцветных кубов-вокселей (volume element — voxel, элемент объёма). Каждый воксель определяется цветом и расположением.
Мы уже знаем, как выглядит пиксель-арт. Воксель-арт выглядит похожим образом.
Похоже на LEGO, не правда ли?
Так как теперь мы смотрим на трёхмерное изображение, сцену можно рассмотреть с разных сторон. Вот так выглядит воксельный Татуин под другим углом:
Можно даже делать анимации. Вот это, например, анимированный воксельный персонаж от Sir Carma:
Сравните его с двумерным пиксельным персонажем:
То есть в воксельном изображении анимация изменяет цвет (или расположение) определённых маленьких кубов, а в пиксельном — меняется цвет квадратов-пикселей.
Теперь вам известна разница между пикселями и вокселями (и много чего ещё… прошу прощения).
Но давайте пойдём ещё дальше. Не время останавливаться. Я рассказал это всё потому, что на современных мониторах любая графика в конечном итоге отображается на двумерной растровой сетке.
Для нас это интересно потому, что люди, увлекающиеся пиксель-артом, создают его с помощью всех возможных видов графики.
«Я что, могу превращать воксели и трёхмерные модели в пиксель-арт?» — спросите вы. Именно так. С помощью особых техник рендеринга и шейдинга можно создавать совершенно уникальный пиксель-арт.
Схема наверху отображает не совсем полную картину. Двумерное векторное изображение можно отображать и сразу, без преобразований. Но всё не так просто.
Двумерное векторное изображение может отображаться напрямую только на векторном мониторе. Они, например, использовались на некоторых аркадных автоматах Atari.
Вот как оно бы выглядело на осциллографе.
Похожим образом иногда отображается трёхмерное векторное изображение.
Как я уже говорил, сначала трёхмерное изображение нужно отобразить на плоскости. Так получается двумерное векторное изображение, которое можно вывести на векторный монитор.
Настоятельно рекомендую глянуть трейлер аркадной игры VEC9:
В наши дни вы вряд ли найдёте векторный монитор где-нибудь за пределами музея. Люди используют мониторы, на которых отрисовываются… пиксели!
Современные ЖК-дисплеи окрашивают каждый отдельный пиксель в определённый цвет, включая или выключая маленькие красные, зелёные и синие жидкие кристаллы на каждую клетку. Если что, в старых ЭЛТ-мониторах работал похожий механизм: на каждый пиксель три разноцветных трубки зажигались под воздействием луча электронов.
Итак, что же мы делаем, если нам надо отобразить векторное изображение на растровом мониторе? Для этого используется техника растрирования. Каждый полигон (чаще всего треугольник) отображается на массив пикселей.
Трёхмерная графика прорисовывается на плоском мониторе так: сначала трёхмерные треугольники отображаются на плоскость и становятся двумерными полигонами, а затем полигоны растрируются и становятся набором пикселей.
Но что насчёт вокселей? Сегодня они чаще всего представляются как трёхмерные векторные кубы. Мы создаём трёхмерную модель с треугольниками по каждой стороне воксельного куба.
Так же, как и в прошлый раз, трёхмерные треугольники затем отображаются на плоское пространство, после чего растрируются в двумерное изображение.
Сегодня практически весь воксельный арт создаётся таким образом, чаще всего с помощью бесплатной программы MagicaVoxel.
Есть ещё один подход. Каждый воксель можно представить как точку в трёхмерном пространстве, то есть как кусочек объёма. Можно отрисовать воксель на плоском пространстве, если расположить пиксель в том же месте. Или наоборот: взять пиксель с экрана и отыскать в пространстве воксель, находящийся на том же месте.
Обратный подход называется ray casting («бросание лучей»). Луч направляется прямо в трёхмерное пространство, и летит, пока не наткнётся на воксель. На практике в пространство «бросается» столько лучей, сколько надо, чтобы покрыть все необходимые точки.
Впервые эта техника была использована в игре Wolfenstein 3D. В ней комнаты целиком состояли из вокселей. Рендеринг работал довольно быстро, потому что один луч отображал целую колонку пикселей на экране. Результат, по сути, получался двумерным, поэтому такую 3D-графику иногда называют 2.5D (потому что третье измерение вроде как не настоящее).
Сейчас Wolfenstein обычно не называют воксельной игрой, но именно она дала толчок к развитию воксельных движков девяностых.
Поначалу воксели использовались только для создания локаций. Из-за нехватки ресурсов разработчики не могли хранить информацию о каждой клетке пространства, но могли записывать высоту расположения вокселей на плоской карте (также известной как карта высот).
Карта высот (слева) показывает насколько высоко поднимаются колонки вокселей (чёрный – низкие колонки, белый - высокие).Так как вся информация о вокселях могла содержаться только в картах высот, то игры не могли создавать нависающие над игроком скалы. Но, господи, насколько же детализированными получались локации!
Ray casting был не единственной технологией воксельного рендеринга в девяностых. Существовали и другие. Каждая с собственными сильными сторонами: разрушаемое окружение, поддержка обработки моделей машин и персонажей и так далее. Это было что-то невероятное! Но, что иронично, именно такое разнообразие в итоге и привело к закату технологии.
В 2000 году началась эпоха графических карт или графических процессоров. Специальные встроенные в компьютер устройства, которые сейчас называются GPU, отлично справлялись с обработкой 3D-полигонов. Они делали это очень быстро, но больше ничего не умели. К несчастью, различные алгоритмы рендеринга вокселей (включая ray casting) остались за бортом.
Воксельные движки переехали на центральный процессор, но и у него хватало собственных проблем. Процессор думал о таких важных вещах, как физика, геймплей и игровой ИИ. Графические карты создавались для того, чтобы «переселить» рендеринг на отдельную микросхему. В результате рендеринг значительно ускорился, а у процессора освободились ресурсы на выполнение других задач. Воксельные движки не смогли угнаться за полигональной графикой. Так они и умерли.
С тех пор прошло 10 лет, и вдруг воксели вернулись. Помощь пришла с неожиданной стороны. Появилась игра, которая нашла к вокселям совершенно новый подход. Воксель – это куб, верно? И теперь эти кубы уже могли спокойно обрабатываться видеокартой. А дальше вы и сами всё знаете.
Давайте вспомним всё, о чём я рассказал, и попытаемся ответить на вопрос, с которого всё началось. Что же такое пиксели и что такое воксели?
Пиксель — мельчайший элемент двумерного пространства, разделённого дискретно на множество равных частей.
Каждый пиксель определяется вектором с двумя целыми числами X и Y. Именно поэтому пиксельное пространство дискретно, в то время как в векторной графике координаты определяются вещественными числами.
Соответственно, воксель — мельчайший элемент трёхмерного дискретного пространства, где все элементы имеют одинаковый размер.
Ну что, на этом всё? А вот и нет!
Как видите, определение довольно общее, а потому пиксели и воксели могут быть очень разными. Давайте попробуем соединить все четыре элемента таблицы вместе: растровое/векторное, а также 2D/3D.
В прежние времена для отображения 2D-спрайта на экране приходилось напрямую копировать биты из памяти, в которой хранились цвета спрайта, в память, хранящую данные об отображенных на экране цветах. Эта технология называется bit blit или bit BLT - bit block transfer (перенос блоков битов). Сейчас почти никто не рендерит двухмерную графику именно так.
Виртуальная консоль PICO-8 — один из немногих современных движков, работающих на блиттинге, но в прошлом двумерная графика не могла отображаться иначе.
PICO-8, Lexallofle Games (а также авторы показанных игр)Сейчас большинство графических движков работает с векторами, потому что видеокарты заточены именно под них. В таких условиях, чтобы отобразить изображение на плоском экране, его нужно нанести на полигон с помощью карты текстур.
Текстуры — двумерные растровые изображения, размещённые на трёхмерном полигоне.
Если не вдаваться в подробности, то именно так и работает трёхмерная графика.
Вот, например, как выглядит высокополигональная 3D-модель без текстуры и с текстурой высокого разрешения:
Благодаря шейдингу и картам текстур нам даже не нужно слишком много полигонов, чтобы получить приятно выглядящего персонажа.
Вот низкополигональная трёхмерная модель с качественной текстурой:
А если взять текстуру с низким разрешением, то получится приятная на вид низкополигональная модель с текстурами в стиле пиксель-арт:
Снова можно вспомнить Minecraft. Её блоки — воксели по определению (мельчайшие дискретные элементы игры), и по сторонам они покрыты пиксельными текстурами. Однако, обратите внимание, что не все блоки в игре — простые кубы.
Mirror’s Edge (слева-сверху), Max Payne (слева-снизу) и Minecraft (справа-снизу)А теперь разберёмся с 2D. Если натянуть текстуру на плоский прямоугольник, мы получим современную 2D-графику. На современном железе каждое 2D-изображение (чаще всего в данном контексте мы называем его спрайтом) отображается на прямоугольнике, состоящем из двух треугольников. Два треугольника (их пара называется квадом) рендерятся с натянутым на них спрайтом. И так изображение оказывается на своём месте.
С изображениями высокого разрешения всё понятно.
Но вот с текстурами в стиле пиксель-арта всё становится немного сложнее. Всё зависит от разрешения экрана, на котором отображаются спрайты.
Braid (слева-сверху), Path to the Sky (справа-сверху), Kingdom (снизу-справа)Мы уже знаем, что пиксельные текстуры без проблем наносятся на трёхмерные низкополигональные модели даже на экранах с большим разрешением. Снова подумайте о Minecraft. Ведь низкополигональные кубы всё равно рендерятся на дисплеях с разрешением 1920×1080.
То же самое можно сделать и с полигонами на плоскости. Возможно взять пиксель-арт, нацепить его на 2D-квад и отреднерить результат на мониторе с высоким разрешением. Тогда каждый пиксель на исходном изображении окрасит несколько пикселей на дисплее в определённый цвет.
Это называется пиксель-артом с большими пикселями. Каждый пиксель на спрайте увеличивается в размерах и становится большим квадратом на изображении.
Каждый пиксель на спрайте занимает квадрат в 3 на 3 пикселя на экране.Если спрайт вдруг наклоняется или поворачивается, то сразу становится заметно, что квадраты на экране состоят из нескольких пикселей:
Посмотрите на листву на этом изображении и сравните с вращающимся спрайтом при низком разрешении:
Обратите внимание, что пиксели на колесе остаются на одной линии и горизонтально, и вертикально, а на гифке из Path to the Sky большие пиксели на листве, птице и мосту заметно искажаются при движении.
Чтобы достичь этого, Kingdom полностью рендерится при низком разрешении и растягивает пиксели только на итоговом изображении. В то же время Path to the Sky, Hotline Miami и Moonman рендерят спрайты на монитор напрямую.
Kingdom — двумерная игра, но такой же подход можно применить и в трёх измерениях.
Если нацепить пиксель-арт текстуры на трёхмерные модели и отрендерить их при низком разрешении, получится что-то такое:
Техническое демо Pixel Art Academy, Matej ‘Retro’ JanС тенями всё нормально. Хотя на первый взгляд кажется, что перед вами пиксель-арт, на самом деле это полноценная 3D-сцена в низком разрешении с пиксельными текстурами.
Техническое демо Pixel Art Academy (под другим углом)Анимации, основанные на векторах (со скелетным ригом), могут использовать пиксельный стиль себе на пользу:
И если запустить рендер на низком разрешении, то анимация ещё сильнее начнёт напоминать пиксель-арт, почти как в случае с Kingdom.
Может быть, эта анимация и не кажется слишком качественной, но у неё есть свой стиль. Почти как в старых добрых играх девяностых.
А теперь снова поговорим о высоком разрешении. Существует игра, которая по полной использует свою трёхмерную природу, сохраняя двухмерный стиль. Это The Last Night от студии Odd Tales.
Их модели нарисованы в 2D, но наложены на трёхмерный мир со всеми современными графическими эффектами: динамическим освещением, bloom, depth of field, кинематографичными ракурсами камеры, отражениями и так далее.
Таким образом, разработчики создали трёхмерный мир, на который можно посмотреть с разных углов.
А вот ещё один пример качественного динамического 3D-освещения. Невероятно атмосферная игра с печальной судьбой — Confederate Express:
Все модели отрисованы в 2D, но каждый объект хранит данные по шейдингу для света, идущего с любого угла. Свет обрабатывается модулем Sprite Lamp, и благодаря ему кажется, что лучи попадают на трёхмерные объекты.
Проблема в том, что с таким подходом мы получаем только шейдинг для спрайтов, но тени всё равно не отобразятся корректно без трёхмерной геометрии объекта. А что может дать нам трёхмерную геометрию? Правильно. Воксели!
Отличным примером такого подхода является недавно анонсированная игра Pathway:
Кажется, словно графика состоит исключительно из плоских спрайтов, но на самом деле модельки в игре полностью объёмные. Разработчики девяностых пытались сделать свою графику максимально реалистичной и современной. Но разработчики из студии Robotality не собираются заходить так далеко, им достаточно, чтобы воксель на экране соответствовал размеру пикселя на мониторе. В результате графика выглядит как очень приятный для глаза пиксель-арт, но у движка есть вся необходимая ему 3D-информация.
В подходе к отображению вокселей в стиле пиксель-арта нет ничего инновационного. Впервые такая технология была использована в игре FEZ. Авторы называли кубики, из которых состояла игра, трикселями (3D-пикселями). Триксель — это куб со сторонами в 16 вокселей.
В каждый отдельный момент времени игрок видит FEZ только с одного угла, и поэтому ему кажется, что он видит мир в 2D. Именно поэтому FEZ выглядит как пиксель-арт, но мир всё равно может вращаться.
Мы пообщались с потрясающими разработчиками Atomontage, пытаясь разобраться, смогут ли воксели вернуться и победить пиксели.
Воксельная разработка
Бранислав: в 2000-2002 годах я участвовал в соревнованиях европейской демосцены. Я написал несколько 256-байтных демо (также называемых intro) под ником Silique/Bizzare Devs (см. «Njufnjuf», «Oxlpka», «I like ya, Tweety» и «Comatose»). Каждое из интро генерировало в реальном времени воксели или графику из облака точек. И воксели, и облака точек являются примерами сэмплированной геометрии.
Интро выполняли свою задачу всего в 100 инструкциях процессора, таких как ADD, MUL, STOSB, PUSH и им подобных. Однако из-за самой природы такого типа программ на самом деле десятки инструкций использовались просто для правильной настройки, а не для генерации самой графики. Тем не менее этих 50 с лишним инструкций, которые по сути являлись элементарными математическими операциями или операциями с памятью, оказалось достаточно для генерации довольно красивой подвижной 3D-графики в реальном времени. Все эти 256-байтные интро выигрывали с первого по третье места. Это заставило меня осознать, что если такую 3D-графику возможно создавать без полигонов, то в играх и других приложениях можно достичь гораздо большего с помощью того же принципа: использования сэмплированной геометрии вместо полигональных мешей. Решение заключается в простоте. Я понял, что доминировавшая тогда парадигма, основанная на сложных и фундаментально ограниченном (необъёмном) представлении данных, уже готова была упереться в потолок возможностей. То есть настало подходящее время испробовать эту «новую», более простую парадигму: объёмную сэмплируемую геометрию.
Дэн: ещё учась в старшей школе в Швеции, я начал программировать 2D-движок с сайдскроллингом, на котором я в результате создал инди-игру под названием «Cortex Command». Она была похожа на «Worms» или «Liero», но с геймплей был больше в реальном времени и с элементами RTS. Также в игре использовалась более подробная симуляция различных материалов каждого пикселя рельефа. В виде сбоку, похожем на «муравьиную ферму», персонажи игрока могли копать золото в мягкой земле и строить защитные бункеры с твёрдыми бетонными и металлическими стенами. В 2009 году Cortex Command выиграла награду за техническое превосходство и приз зрительских симпатий на Independent Games Festival. Ещё с того времени я мечтал создать полностью трёхмерную версию игры, а это было возможно только с помощью волюметрической симуляции и графики.
Примерно шесть лет назад я искал готовые воксельные решения и нашёл работы Бранислава на его веб-сайте и в видео, в котором он рассказывал о неизбежном переходе от полигональной 3D-графики к чему-то, напоминавшему сделанное мной в 2D: к симуляции всего виртуального мира как небольших блоков-атомов со свойствами материалов. Мне не только показалось правильным его заявление — его технологии, судя по простым, но впечатляющим видео, оказались лучшими и самыми убедительными из существовавших. Я начал спонсировать его проект через его веб-сайт и общаться с ним, что привело к началу многолетней дружбы, а теперь и совместному финансированию нашей компании. Восхитительно чувствовать себя частью этого поворотного периода в таком эпичном проекте, в котором результаты долгих лет исследований и разработок наконец-то можно будет передать людям и произвести революцию в создании и потреблении 3D-контента!
Растущий интерес
Мы считаем, что многие крупные игроки осознали: полигональные технологии упёрлись в потолок сложности больше десятилетия назад. Эта проблема проявляет себя множеством способов: в сложных тулчейнах, в хитрых хаках, позволяющих реализовать взаимодействия и симуляцию разрушений, в сложном представлении геометрии (модель полигональной поверхности + модели коллизии + другие модели для представления внутренней структуры, при её наличии), в переусложнённых подходах к волюметрическому видео, хаках и огромных кодовых базах, и т.д. Из-за этих проблем прогресс почти полностью зависит от мощности видеопроцессоров, а некоторые аспекты вообще недостижимы. Это битва, в которой нельзя выиграть. Это свойственно природе больших компаний: часто они даже не пытаются потратить много времени и ресурсов на развитие рискованных и меняющих условия игры решений; вместо этого их стратегия заключается в покупке маленьких компаний, которым это удалось.
Технология
Существует набор техник, которые люди обычно считают основанными на вокселях. Самые старые из них использовался в играх, основанных на картах высот, где рендерер интерпретировал 2D-карту значений высот для вычисления границ между воздухом и землёй сцены. Это не совсем воксельный подход, потому что здесь не используется волюметрический набор данных (примеры: Delta Force 1, Comanche, Outcast и другие).
В некоторых движках и играх используются большие блоки с собственной внутренней структурой, составляющие виртуальный мир (пример: Minecraft). Эти блоки обычно рендерятся с помощью полигонов, то есть наименьшими их элементами являются треугольники и текселы, а не воксели. Такая геометрия просто упорядочена в сетку из более крупных блоков, но это, строго говоря, не делает их вокселями.
В некоторых играх используются относительно большие воксели, или элементы SDF (signed distance fields, полей со знаковым расстоянием), которые всё равно не обеспечивают реализм, но уже позволят создавать интересный геймплей (примеры: Voxelstein, Voxelnauts, Staxel). Существуют также проекты на основе SDF, обеспечивающие замечательные взаимодействия и симуляцию и имеющие потенциал создания высокой реалистичности (пример: Claybook). Однако пока мы не видели попыток разработки решения для симуляции и рендеринга реалистичных больших сцен, аналогичных тем, на которые способна наша технология.
В Atomontage воксели используются как базовые строительные блоки сцен. Отдельные воксели в нашей технологии практически не имеют структуры. Такой подход обеспечивает простоту, сильно помогающую в симуляциях, взаимодействиях, генерации контента, а также в сжатии данных, рендеринге, кодировании объёмного видео и т.д.
Преимущества
Наше решение на основе вокселей устраняет множество сложностей, с которыми сталкиваются люди, работающие с технологиями на основе полигонов, в том числе саму концепцию ограничения на количество полигонов и множество хаков, используемых для обхода этого ограничения. Наша технология объёмна по самой своей природе и поэтому не требует никого дополнительного представления для моделирования внутри объектов.
В таком подходе существует мощная и неотъемлемая система LOD (level of detail, уровня детализации), позволяющая технологии балансировать производительность и качество в традиционно сложных ситуациях. Одни из множества преимуществ — гранулярный контроль над LOD, foveated rendering и обработка, не требующие почти никаких излишних затрат.
Воксельная геометрия избавляет от бремени сложной структуры: она основана на сэмплировании, а поэтому с ней легко работать (простая и универсальная модель данных для любой геометрии, в отличие от сложной модели данных ресурсов на основе полигонов). Это позволяет быстрее выполнять итерации при разработке мощных методов сжатия, инструментов взаимодействия, генераторов контента, симуляторов физики и т.д. Этого не происходит в полигональных технологиях, потому что они уже не меньше десятка лет бьются о потолок сложности, а их прогресс сильно зависит от экспоненциального роста мощи видеопроцессоров.
Воксельный подход эффективен, поскольку он не тратит ресурсов или пропускной способности на плохосжимаемые компонентов векторов или векторных представлений данных (полигонов, облаков точек, частиц), то есть значений, имеющих почти случайное расположение. В случае вокселей в основном можно кодировать полезную информацию (цвет, информацию о материале и т.д.), а не излишние данные, просто располагая эту информацию в нужном месте пространства. Можно сравнить это с JPEG и каким-нибудь двухмерным векторным форматом, кодирующими большое и сложное изображение. Кодирование JPEG предсказуемо и может хорошо настраиваться под оптимальное качество и малый объём, а векторное изображение потратит бОльшую часть пространства на векторную информацию вместо самих сэмплов цвета.
Наш подход позволит обычным людям дать волю своему творческому таланту без необходимости изучать и понимать внутреннюю технологию и её ограничения. Навыков, которые мы получили, взрослея в реальном мире, будет достаточно для взаимодействий с виртуальными средами полезным и реалистичным образом.
Благодаря системе LOD, являющейся неотъемлемой частью технологии, и простой пространственной структуре воксельных ресурсов легко получить крупномасштабное объёмное видео высокого разрешения. Наш рендеринг на основе вокселей не снижает качество геометрии из-за упрощения меша, а достигаемая на стандартном современном оборудовании производительность несравнима ни с чем.
Сейчас мы находимся на этапе, когда можем вокселизировать не только одну большую высокополигональную модель, но и целую серию таких ресурсов со сборкой из них объёмного видео. Также мы можем делать это с целыми средами: представьте сцену кинематографического качества с персонажами, которую можно использовать в научно-фантастическом или анимационном фильме. Мы можем превратить среду в VR-фильм, в котором пользователь может находиться в одном пространстве с персонажами, свободно перемещая точку обзора (а не просто оглядываясь, как в виртуальном видео) в сцене размером с комнату или даже больше. Пользователь может воспринимать процесс, как это привычно для VR-игр, за исключением интерактивности. Сейчас мы ищем партнёров, которые помогли бы нам сделать первый пробный короткометражный фильм с качественными графическими данными.
Риггинг
Наша технология уже позволяет использовать различные преобразования, влияющие на любой воксель модели, создавая убедительные эффекты деформации мягких тел. Хотя у нас пока нет демо анимации персонажа с полным скиннингом и другими функциями, наша технология безусловно способна на это, если привязать её к любой традиционной системой риггинга. Это уже видно в наших видео с мягкими телами: шины на колёсах автомобиля сжимаются в ответ на симулируемые силы, и такая деформация похожа на то, что происходит в анимации персонажей при влиянии привязанных костей. На ранних этапах сам риггинг может даже выполняться в некоторых из уже имеющихся инструментов ещё до вокселизации, а со временем мы реализуем его и в собственных инструментах.
Читайте также: