Уроки Коммент.

Создание игр » DirectX 11, Featured » DirectX 11

DirectX 11

DirectX 11 DirectX 11 появился относительно недавно и пока ещё не используется повсеместно, хотя уже примерно с год все современные ААА-тайтлы стараются в обязательном порядке иметь поддержку DirectX 11. С этого урока я хочу начать цикл уроков про DirectX 11, в которых попробую рассказать Вам в чём же заключаются преимущества DirectX 11, как их правильно применить так, что бы пользователь увидел реальный прирост производительности и качества картинки, как оптимизировать программы под directx 11 и чем отличаются оптимизации под эту версию DirectX от прежних версий. Так же я постараюсь объяснить как 11 версия DirectX устроена внутри и на что это влияет, что надо знать и учитывать программисту, на какие подводные камни Вы можете наткнуться при разработке программ под DX11.

Знакомство с DirectX 11

DirectX 11 является логическим развитием предыдущей версии – DirectX 10. При этом, естественно, многие возможности были немного расширены и дополнены и, кроме того, появились некоторые возможности, которых раньше не было. Наиболее интересные возможности новой версии DirectX 11 включают в себя:

  • Более низкоуровневая поддержка аппаратного обеспечения и операционной системы
  • Значительно улучшенные возможности многопоточной обработки данных
  • Вычислительные шейдеры (Compute shaders)
  • Улучшенное сжатие текстур
  • Shader Model 5.0
  • Тесселяция

DirectX 11: низкоуровневая поддержка

DirectX 10 был спроектирован с целью улучшения модели Windows Display Driver Model (WDDM) и, тем самым, создания дополнительных возможностей повышения производительности драйвера. Кроме того, DirectX 10 API был разработан практически без оглядки на более ранние версии DirectX и, в итоге, получился более “чистым”, простым, удобным – что позволило сделать клиентский код, использующий DirectX 10 API, более простым для написание и чтения, тем самым избавляя разработчиков от кучи лишней работы и головных болей. DirectX 11, являясь развитием DirectX 10, содержит в себе довольно много разных новых возможностей, которых вполне достаточно для того, что бы назвать его именно новой версией DirectX, а не просто обновлением. При этом, однако, DirectX 11 построен на основе DirectX 10 и просто ещё больше расширяет его возможности. Если Вы ранее уже работали DirectX 10 или с 10.1, то вы без проблем разберётесь и с 11 версией DirectX. При этом DirectX 11 позволяет разработчикам использовать различные аппаратные возможности – уровня DirectX 10, 10.1 и 11, но при этом работая с одним и тем же набором функций DirectX 11.

Улучшенная многопоточность в DirectX 11

Все прежние версии DirectX (а именно его Direct3D-части) были “заточены” прежде всего на работу с одноядерным центральным процессором и потому, можно сказать, имели лишь зачатки поддержки многопоточности. Но, поскольку в наше время даже у домохозяек зачастую стоят компьютеры с 2-4 ядрами и более (что уж говорить о геймерах!), в DirectX 11 были внесены изменения, позволяющие разработчикам получить больший контроль над тем, как взаимодействуют GPU и CPU. DirectX 11 становится возможным асинхронный доступ к устройствам, прежде всего благодаря двум новым ключевым особенностям объекта Direct3D 11 Device:

  • Во-первых, это значительно усовершенствованный процесс синхронизации между Direct3D Device и драйвером, который позволяет делать асинхронные вызовы DirectX API. Direct3D 11 предоставляет разработчикам больше свободы при реализации параллелизма, разрешая при этом делать вызовы из нескольких независимых друг от друга потоков.
  • Во-вторых, Direct3D Device 11 теперь поддерживает несколько так называемых контекстов визуализации. 1) главный прямой контекст (Immediate Context), который руководит передачей команд на исполнение в GPU и 2) дополнительные отложенные контексты (Deferred Contexts), которые разработчик может создавать в любых количествах, по мере необходимости. Работа с каждым таким контекстом, может выполняться в отдельном потоке/ядре. Это позволяет командам GPU накапливаться в рамках контекста, параллельно основным процессам визуализации, а после это поступать на выполнение в GPU, когда основной контекст уже выполнил задачу визаулизации и ждёт новых команд.

Поскольку этот функционал DirectX 11 реализован на программном, а не аппаратном уровне, то вы можете использовать эти возможности даже если в системе установленны видео-карты Direct3D с поддержкой только DirectX 10 и/или 10.1.

Тесселяция в DirectX 11

DirectX 11 принёс нам три новых стадии в конвейер визуализации, это: 1) hull shader, 2) tessellator и 3) domain shader. Эти стадии позволяют создать очень гибкую, настраиваемую программно, но с аппаратной поддержкой, тесселяцию. При этом Hull shaders и Domain shaders – это части, которые пишет программист, а Tessellator – это фиксированная функция, но имеющая очень большое количество настроек, которое обеспечивает полный контроль над генерацией данных.

Hull Shader

Hull Shader это модуль, который позволяет производить преобразования во входных данных таким образом, что их обработка идет на уровне управляемой ячейки. Обсуждая приложения конвейера, мы часто говорим о том, что внесли кардинальные изменения в этот шейдер, перешли от поверхности одного типа к другому, например, от квадратных ячеек Кэтмула-Кларка (Catmull-Clark) к патчам Безье (Bezier patch).

Tessellator

Этот модуль является по факту просто “расширителем” данных, в котором можно запараллелить алгоритмы, определяемые пользователями. Он берет на входе параметры тесселяции и вставляет вершины в поверхность в пространстве U, V согласно выбранной пользователем схеме разбиения.

Domain Shader

Этот модуль выполняется по одному разу для каждой вершины объекты, а также является местом, где оценивается представление поверхности. Входные данные на этой стадии представлены в U-, V-доменах поверхности, готовых к параметрической оценке поверхности.

Пока это всё мало понятно, но из следующих уроков Вы поймёте что к чему.

Вообще, конвейер тесселяции поддерживает несколько типов входных данных (квадратные элементы, треугольные элементы, ломаные линии (polylyne)), что позволяет разработчику работать практически с любым представлением поверхности. Единственное условие, которое является обязательным, это поддержка иерархических поверхностей (subdivision surfaces) для визуализации символов.

Чарльз Луп (Charles Loop)и Скотт Шафер (Scott Schaefer) из Microsoft Research работали над несколькими вариантами подходов к аппроксимации иерархических поверхностей (или поверхностей с разбиением), которые могут быть применены в конвейере DirectX 11. Один из таких подходов, представленный в сэмплах DirectX 10 в DirectX SDK, изменяет основную сетку квадратных элементов на поверхности Безье путем фиксированной тесселяции. В применении к конвейеру DirectX 11 эта и другие схемы могут использоваться для визуализации в реальном времени сетки иерархических поверхностей.

Улучшенное сжатие текстур в DirectX 11

Наибольший объем памяти в играх обычно занимают текстуры, поэтому вполне понятно желание разработчиков DirectX 11 улучшить сжатие текстур – поскольку это необходимо для сохранения объемов используемой памяти и требований к ее пропускной способности на уровне, необходимом для рендеринга с высокой скоростью. DirectX 11 имеет в своём арсенале новые форматы сжатия текстур BC6 и BC7, которые призваны помочь им достичь высококачественной визуализации, но при этом не жертвуя при этом производительностью.

DirectX 11 и Shader Model 5.0

DirectX 11 включает в себя Shader Model 5.0, которая использует ООП-концепции, чтобы облегчить разработку шейдеров и внести дополнительную поддержку для вычислений двойной точности. Это обновление HLSL (High Level Shading Language) отдает разработчику полный контроль над компилятором HLSL, для решения проблемы специализации шейдеров путем использования интерфейсов, объектов и полиморфизма. Благодаря динамическому контролю за шейдерами, разработчики могут легко создавать большие, гибкие шейдеры и предоставлять специализированные, оптимизированные версии для использования во время определенных моментов визуализации.

Вычислительные шейдеры (Compute Shader)

Любому, кто уже знаком с использования GPU для выполнения задач общего назначения (GPGPU или General Purpose GPU), будет интересно услышать о новом вычислительном шейдере, который дает аппаратному обеспечению от различных производителей поддержку для программирования GPU на выполнение задач общего назначения. Многое уже было сделано ранее в направлении использования поистине огромных вычислительных мощностей GPU для решения крупных вычислительных задач на узкоспециализированных рынках. Вместе с вычислительным шейдером из DirectX 11 компания Microsoft делает возможным использование этих алгоритмов обычными клиентами на широком спектре аппаратных средств. Давайте посмотрим, какие новые возможности открывает перед разработчиками игр и других приложений использование GPU в задачах, отличных от рендеринга.

Главным образом это коммуникация данных между потоками и богатый выбор примитивов для случайного доступа и потоковых операций ввода/вывода. Эти функции позволяют создавать более простые и более быстрые реализации уже используемых методик, таких как создание изображений и постобработка, а также открывают новые методы, которые могут работать на аппаратных средствах Direct3D класса 11.

Прочие возможности DirectX 11

DirectX 11 содержит в себе ещё достаточно много нововведений, о которых не было упомянуто выше, например такие как:

  • Conservative oDepth: обычно разработчикам приходится отключать Z-структуры и алгоритмы, когда происходит запись шейдера в буфер глубины через регистр oDepth. Функция Conservative oDepth в DirectX 11 позволяет шейдерам производить запись в буфер глубины в переделах указанной зарезервированной области. Это позволяет аппаратным средствам избежать существенной потери в производительности, разрешая использование ускорения за пределами указанной области.
  • Ограничение для текстур в 16K и привязка текстур: DirectX 11 поднимает ограничение на максимальный размер текстур с 4K до 16K, а также предоставляет контрольные привязки MIP-LOD для ограничения числа mipmap-уровней, загруженных в GPU

»crosslinked«

Ещё по этой теме:




Раздел: DirectX 11, Featured · Теги: Direct3D, DirectX

14 комментариев на "DirectX 11"
  1. ArchiDevil пишет:

    Я бы еще упомянул про Feature Level, поскольку это достаточно интересное и важное нововведение.

    1. Вячеслав пишет:

      Я просто пока не стал особо погружаться, потому написал в общих чертах: “При этом DirectX 11 позволяет разработчикам использовать различные аппаратные возможности – уровня DirectX 10, 10.1 и 11, но при этом работая с одним и тем же набором функций DirectX 11.” (3 параграф статьи). В следующих уроках распишу детальнее и “правильнее”.

  2. Sergey пишет:

    Код) просим код. Можно даже провести некую аналогию между Dx9 API и Dx11 API. Рад что решили начать публиковать материалы по Dx11, думаю они будут бесценны :) А то русскоязычных статей по Dx выше 9 версии нет. Для меня очень сложно после привычки работы с Dx7 – Dx9 перейти на новую концепцию API :) хочется все таки основы почитать на родном языке :)

    1. ArchiDevil пишет:

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

      1. Вячеслав пишет:

        Можно и про мендежеры в движке. Только это вопрос достаточно сложный и, при этом, весьма скользкий )) Сколько людей – столько и мнений по этому поводу. Каждый делает что-то по своему и оптимально решения тут просто нет.

        Я вообще в ближайшее время думал сделать для начала статью об организации сцены. Опять же, хотел показать достаточно простой, но при этом вполне работоспособный для не очень больших игр, вариант. Как правило вообще простые решения “заруливают” все остальные – например, даже брутфорсный вариант обработки сцены вполне имеет право на жизнь, если количество объектов на уровне не превышает несколько тысяч. А путём совсем небольших оптимизациий этот вариант развивается до того, который запросто сможем “тянуть” и 10к и даже больше объектов…

        1. ArchiDevil пишет:

          Менеджеры сцены тоже очень хорошо. Вообще побольше бы статей именно о том, как движок устроен, где, что и куда прикручено и что с чем соединяется. Было бы чрезвычайно полезно, ибо таких статей днем с огнем не сыщешь. Спасибо вам за работу, Вячеслав!

  3. Евгений пишет:

    Было бы не плохо, если бы вы подправили статью Direct3D11 в вики.

    1. Вячеслав пишет:

      Думаю, что в викки – это к тамошним редакторам, я викки не занимаюсь 8-)

  4. ArchiDevil пишет:

    Не хочу торопить, но когда будут новые статьи?)

  5. Felix пишет:

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

    1. Вячеслав пишет:

      Я вокселами особо никогда не занимался. Технология интересная, имеющая как свои плюсы, так и свои минусы. Прежде всего, надо понимать, что для того, что бы грамотно и хорошо реализовать воксели – надо весьма неплохо разбираться в математике и графике. Не могу сказать, что воксели это однозначно хорошо или однозначно плохо, но вот то, что применять их пока сложновато и этого не делает практически никто – это можно сказать точно ;-)

  6. Felix пишет:

    Понятно, сложность реализации меня интересует в последнюю очередь, и так ясно что придется попотеть, и не мало выучить, но это же только к лучшему. А то что мало распростроненно скорее более привлекает, единственное что, так это доступность информации значительно ниже.

    Спасибо за ответ.

  7. Аскар пишет:

    Здравствуйте проблема такая, в играх очень маленькая дальность прорисовки текстур около 5-7 метров. Это происходит полностью со всем окружением, видна четкая линия после которой все прорисовывается четче, причем этот процесс очень резкий. Этой проблемы не было на моем старом ПК. (Win XP) Например идешь и вдруг появляется новый куст или что то начинает прорисовываться намного четче. Если отойти назад оно снова пропадает. Все очень резко и раздражает. Я облазил весь интернет у многих такая проблема и никто не может дать внятного ответа что делать. Помогите! Очень жаль потраченные деньги.

  8. keyboard пишет:

    DirecX плохое отображение текстур похож на Flash Player.
    Vertex buffer кое как. Текстуры просто накладываются а могли бы быть разными. Облизано все.

Оставить комментарий

*

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>