Работа с трехмерной графикой в игре DirectX

Работа с трехмерной графикой в игре DirectX

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

Общие сведения о трехмерной графике

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

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

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

Весь процесс выполняется в 8 этапов:

  1. Загрузка и преобразование геометрических данных
  2. Выполнение операций с вершинным шейдером
  3. Настройка геометрии
  4. Растеризация сцены (сжатие трехмерной сцены в двухмерную проекцию)
  5. Удаление скрытых поверхностей
  6. Затенение фрагментов (текстуризация, освещение) и другие операции с пикселями
  7. Завершающая обработка буфера кадров (фильтры и эффекты полнокадрового затенения)
  8. Вывод на экран

Объекты в вашей трехмерной системе координат игрового мира представлены набором точек (так называемыми вершинами), которые описывают геометрический объект. Мы называем эти наборы точек геометрическими фигурами или многоугольниками, а реализацию данных этих наборов — сетками. Работа с этими сетками (загрузка, управление и преобразование) является ключевым процессом разработки трехмерной графики.

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

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

Растеризация — это процесс сжатия трехмерной сцены в двухмерную проекцию этой сцены, т. е. это удаление из прорисовки оси Z. Так как дисплей является двухмерной поверхностью (эффективной плоскостью x-y), вы должны растеризовать сцену, чтобы иметь возможность отобразить ее на дисплее. Это также преобразует координаты игрового мира в двухмерные координаты экрана, графика сейчас определяется пикселями, а не вершинами.

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

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

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

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

Вопросы разработки

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

  • Начните с малого. Концентрируйтесь на небольших сценах и простых сетках. Вы можете сделать отличную игру, используя основные примитивы. В то время как графика может значительно оправдывать ваши усилия, не упускайте из виду характеристики всей игры в целом. В небольшую узконаправленную игру с ограниченной графикой интереснее играть, чем в игру, амбициозно использующую все графические хитрости, но при этом разработанную с ошибками и расползающимися границами.
  • Вкладывайте средства в хорошие инструменты. Создание и организация сложных сеток и текстур, которые определяют модели вашей игры, может быстро утомить. Планирование и создание сложных сред часто требует использования промежуточных инструментов, которые объединяют структуру среды с игровой механикой, например события и поведение приложения, которые иначе потребуют больших усилий для встраивания в ваш код.
  • Используйте возможности шейдеров. Вы можете многое выполнить с помощью шейдеров и языка HLSL, который они используют как микрокод. В DirectX 11 эффективно использовать шейдеры стало легко как никогда, но при неправильном использовании они могут снижать производительность. Знание о том, когда и как загружать шейдеры, важнее, чем индивидуальная эффективность алгоритмов, которые они реализуют. Они являются самой важной характеристикой современного графического программирования.
  • Искусство определяют не только художники — их стиль разработчики воплощают в игру, используя навыки затенения. Погоня за фотореализмом не обязательно обеспечит вам наилучшее воздействие на аудиторию или производительность.
  • Технология может также стать большим достоинством при реализации в вашей игре. Одной из замечательных новых возможностей, доступных для применения в играх с помощью Direct3D, с недавних пор является стереоскопическая трехмерная графика. Конечно, при этом разработка вашей игры должна вестись с учетом стереоскопических трехмерных эффектов, т. е потребуется создание устройства и цепочки буферов которые поддерживают стереоскопическую трехмерную графику, настройка объектов однобуферной прорисовки для левого и правого глаза и использование стереоскопических трехмерных проекционных преобразований, а также обеспечение запросов и управления стереоскопическими трехмерными состояниями и событиями. Это необыкновенно и удивительно! (Чтобы стереоскопическая трехмерная графика работала, ваша целевая платформа оборудования должна обеспечивать, по меньшей мере, уровень версии Direct3D 10_0 или выше, конфигурацию системы, поддерживающую стереоскопическую трехмерную графику, и драйверы WDDM 1.2.)
  • Знайте свою сцену. Можно достичь наилучшей производительности, если знать, где нужна прорисовка деталей, а где нет, и где должна находиться камера в любой момент. Знание сцены означает, что вам нужно разрабатывать то, что попадает в поле зрения камеры.
  • Помните о вашей частоте кадров. Для игрока намного приятнее плавная, последовательная смена 30 или 60 кадров, прорисовываемых и отображаемых каждую секунду. Помните, что не все графическое оборудование одинаково, и если ваша игра хорошо работает на компьютере разработчика, демонстрируя плавную смену кадров, то на нетбуке она может вести себя совершенно иначе. Найдите компромисс между эффектами и производительностью.
  • Не все из ваших будущих игроков располагают новейшим оборудованием. Если вы разрабатываете игру для более широкой потенциальной аудитории, обязательно проследите, чтобы наряду с DirectX 11 для новейшего оборудования она поддерживала менее строгие системные требования, например DirectX 9_1.
  • Не бойтесь экспериментировать! Код для шейдеров автономен, и после небольшой практики вы сможете настраивать эффекты и управлять геометрией без воздействия на всю игровую систему.

Приступая к работе

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

В этом разделе

Здесь мы покажем, как использовать программирование в DirectX для реализации базовых принципов трехмерной графики.

Справочные материалы

Примечание

Эта статья адресована разработчикам решений для Windows 10, создающих приложения универсальной платформы Windows (UWP). При разработке приложений для Windows 8.x или Windows Phone 8.x см. раздел архивной документации.

📎📎📎📎📎📎📎📎📎📎