Directx 11 что это

Обновлено: 07.07.2024

До выхода новой — одиннадцатой — версии DirectX осталось не так много времени. Предположительно он появится уже этой осенью в составе Windows 7 и Service Pack 2 для Windows Vista. Сможет ли новый API стать новой общепризнанной платформой для разработчиков игр? Не ждет ли его та же судьба, что и DirectX 10? Именно в этом мы и попытаемся разобраться.

Начнем с небольшой предыстории. Если верить слухам (а они опираются на вполне конкретные факты), самая первая версия DirectX носила кодовое название Manhattan Project. Это прямой намек на ядерную программу США (помимо Америки в исследованиях принимали участие ученые из Канады, Великобритании и Германии), результатом которой стало появление атомной бомбы. Также есть предположение, что первый логотип DirectX был разработан по образу и подобию значка, предупреждающего о радиационной опасности (что и говорить, сходство действительно есть).

Что же касается названия технологии, то, по словам главы проекта DirectX Алекса Джона, DX разрабатывался в паре с приставкой Xbox, которая изначально называлась DirectXbox. Проекты должны были развалить японский рынок видеоигр так же, как некогда сброшенные атомные бомбы стерли с лица земли города Хиросима и Нагасаки. Разумеется, компания Microsoft все отрицает и говорит о том, что дизайн первого логотипа не имеет никакого отношения к роковому желто-черному значку.

Вот такие сложные эффекты освещения в DirectX 11 можно будет делать без всяких программных фокусов.

Первая версия DirectX появилась в 1995 году. Она вошла в комплект второго пакета обновлений для Windows 95. Под общим названием было собрано сразу несколько компонентов: Direct3D, DirectDraw, DirectMusic, DirectPlay, DirectSound (за что отвечает каждый из них, понятно из названия) и т.д. По сути, программистам предложили набор средств для разработки (так называемый SDK) трехмерной и растровой графики, музыки, коммуникации и других игровых и программных модулей. В состав DirectX входили все необходимые библиотеки, документация и заголовочные файлы.

Курс с самого начала был взят на удобство и массовость. Каждое обновление API добавляло важные функции, оперативно исправлялись ошибки. DirectX зашагали вперед семимильными шагами. Девелоперы продвигались к фотореализму, качество графики улучшалось и продолжает улучшаться с каждым новым поколением API.

Мы ждем перемен

Нас больше всего интересует графическая составляющая DX. Давайте разберемся, как она работает. Основная задача API — перенос описания трехмерного объекта на двухмерный экран. Интерфейс передает объект драйверу видеокарты и «объясняет» ей, что с ним нужно делать. Финальное изображение формируется в несколько стадий, которые вместе называются графический конвейер.

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

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

С момента выхода Crysis прошло уже полтора года, а он по-прежнему остается самой красивой игрой под DX10.

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

По методике Юлия Цезаря

Эффекты HDR Lighting позволяют получить очень реалистичное освещение в играх, а при помощи DX11 станет намного легче обрабатывать алгоритмы HDR.

Еще один очень важный момент. Новые возможности DX11 позволяют с легкостью адаптировать все написанные на нем программы под более ранние версии API, раньше с этим было немало проблем. В первую очередь речь идет об обратной совместимости с DX10 и DX10.1.

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

Еще одной важной особенностью DX11 станет многопоточность. Современные игры только начинают приспосабливаться к четырехъядерным процессорам, разработчики еще толком не научились писать подходящий для них программный код. Появление механизма для одновременного управления несколькими действиями существенно упростит переход к многопоточным вычислениям.

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

Открытый стандарт OpenGL не смог конкурировать с DirectX на рынке компьютерных игр. Хотя поначалу детище Microsoft не было столь популярно, как сейчас. Первые версии API подвергались критике со стороны разработчиков игр: в плане графики DirectX не предлагал существенных улучшений, но для реализации простейших функций требовался целый ряд ненужных команд. В OpenGL, напротив, все было просто.

Microsoft пыталась задавить SGI (разработчиков OpenGL) при помощи рекламных уловок. Они обещали, что DirectX будет работать быстрее конкурента. Уже тогда было понятно, что низкая скорость работы OpenGL связана не с самим API, а с неудачной его реализацией в среде Windows. С другой стороны, многие игры тогда не использовали DirectX для рендеринга. Вместо этого они обращались напрямую к ресурсам видеокарт через DirectDraw. OpenGL опирался на поддержку со стороны производителей железа, но с появлением новых видеокарт программные недостатки этого API стали видны невооруженным глазом.

Как бы там ни было, но войну выиграла Microsoft. Она выпускала все новые версии API с новыми функциями. Появление DirectX 8 с поддержкой пиксельных шейдеров и шейдерного языка высокого уровня отбросило SGI далеко назад.

Игра Rage — последний на сегодня оплот OpenGL в мире трехмерных игр.

На замену процессору

Научная программа Folding@Home позволяет рассчитывать структуру белков на дому. Видеокарты с их быстрой шейдерной архитектурой справляются с вычислениями куда лучше центральных процессоров.

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

Сразу же провели эксперимент. Ученые создали программу Folding@ Home, моделирующую трехмерную структуру протеинов, и оптимизировали ее для работы с графическим чипом. Очень быстро выяснилось, что даже древняя видеокарта AMD Radeon X1900 делает расчеты почти в двадцать раз быстрее самого мощного четырехъядерного процессора. Вдохновленные успехом, производители графических плат начали развивать новое направление, получившее название GPGPU (General-Purpose Graphics Processing Units, GPU общего назначения).

NVIDIA и AMD практически одновременно представили собственные концепции, но в лидеры сразу выбилась технология NVIDIA CUDA. И людей не останавливает даже тот факт, что программы, написанные с ее помощью, могут работать только на видеокартах GeForce (начиная с восьмого поколения и выше).

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

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

Только представьте себе, сколько в ближайшем будущем выйдет программных блоков и игр, которые будут использовать возможности видеокарт. Появятся продвинутые технологии затенения, сверхкачественное полноэкранное сглаживание — как обычных, так и прозрачных текстур. Вычислительные шейдеры возьмут на себя расчет игровой физики, искусственного интеллекта и многое другое, что обычно перекладывается на плечи центрального процессора. Один из наиболее ярких примеров — продвинутые эффекты освещения HDR Lighting. Сейчас для их расчета приходится прогонять алгоритм через ЦП несколько раз. Вычислительным шейдерам достаточно одного захода на цель.

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

Видеокарта NVIDIA GeForce GTX 295 напоминает старую VHS-кассету. Но скорость работы — феноменальная.

Графический конвейер DX11 обзавелся несколькими новыми стадиями.

Тесселяция — разбиение модели на полигоны.

Анизотропная фильтрация (AF) — метод снижения искажений картинки. Устраняет эффект размытости, повышает резкость текстур. На данный момент существуют режимы 2x, 4x, 8x и 16x.

Полноэкранное сглаживание (FSAA, AA) — устранение эффекта «лесенки», нечетких краев объектов. На данный момент существуют следующие виды антиалиазинга: суперсэмплинг (SuperSampling), мультисэмплинг (MultiSampling) и CSAA (Coverage Sampling AntiAliasing). По качеству изображения на первом месте стоит суперсэмплинг, но он сильно снижает производительность. Мультисэмплинг обеспечивает хорошее качество сглаживания при меньших затратах. CSAA — относительно новая технология, которая обеспечивает высокий класс сглаживания при разумном расходе ресурсов видеокарты.

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

Шейдеры — программы, которые определяют вид поверхности объекта. За последние несколько лет шейдерные программы сильно эволюционировали, а кроме пиксельных и вершинных шейдеров появился новый вид — геометрические.

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

Вершинные шейдеры — производят различные операции над вершинами 3D-объектов. Благодаря им в современных играх появились красиво анимированные деревья и трава, волны, развивающаяся одежда.

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

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

Судя по всему, новый DirectX обеспечит качественный скачок не только в графике, но и в игровой архитектуре в целом. Даже относительно старое железо благодаря распределению нагрузки между ЦП и графическим процессором сможет выдавать очень качественную картинку, да еще рассчитывать физику и, допустим, AI. Но до всего этого нам с вами еще предстоит дожить. Даже если DirectX 11 появится без опозданий, до массового перехода на него разработчикам потребуется еще минимум полтора-два года.

Сменяются видеокарты, игры, процессоры, а смена DX11 на DX12 тянется еще с 2015 года, поэтому многие и забыли, чем эти версии отличаются друг от друга, и что же принесет новая API. В большей части на этом лежит вина и самого Microsoft, так как они сделали DX12 достоянием исключительно Win10, заявив что на более старых системах DX12 невозможно реализовать, но не так давно появилась информация, что поддержка DX12 все же появится на win7, и первой игрой будет World of Warcraft. В результате долгое время компьютеров с поддержкой DX12 было крайне мало, чтобы разработчикам игр вообще стоило обращать на этот сегмент свое внимание. Пожалуй, только сама Microsoft и ее дочерние игровые компании перешли на полноценный выпуск игр на DX12, но среди них не было значимых шедевров, и, пожалуй, самая узнаваемая серия — это Forza Horizon.

Однако, на начало 2019 года ситуация стала меняться, и, прежде всего, мы уже видим в статистике STEAM, что большинство компьютеров (64.53%) уже имеют как видеокарту так и операционную систему, совместимую с DX12, и стоит напомнить, что последнее поколение приставок Microsoft и Sony тоже поддерживают DX12, что в итоге дает нам абсолютное большинство игровых устройств DX12 ready.


В итоге мы видим, что на конец 18 и начало 19 года все больше и больше игр отказываются от DX11 как основного API в пользу как DX12, так и Vulkan. Вот их список:

  • Lara Croft Shadow of the Tomb Raider
  • Resident evil 2 (remake)
  • Crackdown 3
  • Metro Exodus
  • The Division2
  • Devil may cry 5

Готовятся к выходу и, скорее всего, будут иметь поддержку Vulkan или DX12

  • DOOM Eternal
  • Wolfenstein Youngblood
  • Serious Sam 4
  • Star wars fallen order
  • Rage 2

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

Помимо упомянутой трассировки лучей DX12 включал в себя такую технологию как Multi Gpu — это возможность объединения нескольких видеокарт даже различных производителей для обработки изображения. Звучит здорово, но, на мой взгляд, технология имеет мало шансов на широкое применение, и вот почему. Для разработчика игр придется сначала заставить работать просто неимоверное кол-во различных вариаций видеокарт, потом еще это все протестировать, а это очень много времени и очень много затрат, а выгоды от введения сомнительны. Для разработчика GPU это будет означать, что можно купить менее мощную видеокарту и установить ее параллельно, причем это может быть видеокарта их конкурента, в итоге это будет влиять на среднюю цену купленных у них устройств — для достижения искомой производительности можно будет покупать видеокарту классом ниже. Вообще стоит вспомнить SLI и CrossFire - много ли игр поддерживают эти технологии? Вот мы и добрались до наиболее значимых отличий DX12 от предшественника — работа с потоками CPU.


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


DX12 распределяет по потокам/ядрам самую объемную задачу по подготовке данных и последующей обработке их на GPU, что влияет положительно на производительность. Производительность, разумеется, не вырастает в 8 раз, так как этот процесс не идеально масштабируемый, и есть и другие узкие места. Забавно отметить, что результаты работы в случае всего одного потока или восьми отправляются на GPU о обрабатываются тысячами ядер CUDA или CU в зависимости от вендора GPU.

Что же происходит с данными попавшими в GPU?


Вверху видна последовательность обработки данных DX11, которая происходит в строго установленном порядке, и без выполнения предыдущих задач следующие не могут быть реализованы, тогда как DX12 имеет возможность разделения и исполнения этих задач на разных ядрах нашего GPU, что обеспечивает большую загрузку самого GPU и приводит к уменьшению задержек и росту FPS. Важно отметить, что скорость исполнения самих элементов, из которых состоит вся задача, не увеличивается. Весь выигрыш в производительности достигается только за счет оптимизации очереди — это и называется асинхронные вычисления.

Давайте теперь взглянем на то, что же конкретно подготавливает CPU для последующей обработки на GPU, если конечную картинку мы видим в таком виде:


То процессор передает каркас изображения в виде сетки полигонов для последующей закраски — аналогия с деткой книжкой-раскраской более чем уместна.


Каждый из полигонов обрабатываются на CPU и называется вызовом отрисовки или draw call. Соответственно, чем больше полигонов в кадре мы видим, тем больше нагрузка на CPU, такие ситуации наиболее характерны для игр с открытым миром и появления большого количества объектов в кадре, особенно если это очень детализированные объекты как NPC. В других случаях — когда мы смотрим в небо или видим незначительное кол-во полигонов в каком-нибудь ограниченном пространстве, например, коридоре, где вызовов отрисовки не так много, преимущества DX12 тают. Давайте перейдем к выводам из теоретической части знакомства с DX12.

В визуальном плане DX12 имеет очень скудные преимущества перед DX11 - лучи это самое яркое отличие.

Программирование под DX12 сложнее, и все преимущества нового API раскрываются полностью, только когда движок изначально разрабатывается, а не адаптируется под него.

Для несложных сцен, где в кадре мало объектов/предметов и полигонов, DX12 может показывать меньшую производительность по сравнению с DX11, так как все вызовы отрисовки прекрасно успевают обрабатываться на 1 ядре процессора, а в случае с DX12 результаты работы восьми потоков надо еще синхронизировать. Это может быть верно для целых игр, а не просто сцен, если они в своей основе имеют несложную графику.

DX12 не снижает нагрузку на процессор, а, наоборот, увеличивает, только при этом нагрузка распределяется до 8ми ядер/потоков процессора а не ложится на 1 ядро.

Выигрыш от перехода на DX12 будет у процессоров с небольшой производительностью на ядро, но большим их количеством, например, как серия FX от AMD.


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

Игровые тесты

  • FX 6300 @4500
  • DDR3 2133
  • RX 580 8GB
Lara Croft Shadow of the Tomb Raider

Для рассмотрения возьмем последнюю сцену из 3х тестовых отрезков — она наиболее характерна большим количеством вызовов отрисовок.


Обратите внимание на загрузку процессора: слева DX11 74%, справа DX12 100%.


Первые 3 значения относятся к последней сцене теста, четвертое же значение — это результат по всем трем сценам. Примечательно что максимальный кадр, который был отмечен, был в момент показа именно куска неба, и разницы между API нету, в то время как наибольшая разница отмечена именно в минимальных кадрах, и достигает она внушительных 43%. То есть, в самых графически нагруженных сложных сценах мы видим наибольшую пользу от перехода на DX12.

Resident Evil 2 remake


В этом тесте мы видим куда менее тривиальные результаты: падение максимального и среднего кадра, но и подъем минимальных значений аж на целых 33%. То есть, в моментах, где производительности 1 потока вполне хватает, DX11 даже быстрее, но как только сцена усложняется и производительности 1 потока недостаточно, DX12 раскрывается, что переносит весь игровой процесс до 60+ кадров, а DX11 опускается до условно неиграбельных 45. Боюсь именно с такими результатами и связана такая нелюбовь тестеров к DX12, так как в нем может быть меньше максимальных кадров, и даже, что может показаться совсем неприемлемым, и средние кадры, однако, как ни парадоксально, DX12 при этом более комфортен для игры.

Давайте перейдем к связкам с другим видеокартами и процессорами и понаблюдаем за результатами. Для этого выберем 4 игры:

  • Lara Croft Shadow of the Tomb Raider
  • Resident Evil 2 remake
  • Division2
  • Metro Exodus

Все эти игры работают как в режиме DX11, так и DX12. Давайте сравним, каковы будут изменения от смены API. Во всех тестах в качестве CPU применялся 9900K в разгоне до 5.0. Другими словами, мы увидим ситуацию, когда процессор не ограничивал нашу производительность.


Данные в таблице — это изменения в % между API. Интересно, что видеокарты семейства Pascal по-разному реагируют на DX12, несмотря на одинаковую архитектуру в их основе, прироста на младших моделях нет, связано ли это с работой драйвера или аппаратной части, находится за рамками этого блога. Нужно констатировать только одно: на видеокартах, формально имеющих поддержку DX12_1, прироста от перехода на новый API может не быть. С другой стороны, видеокарта RX 580, формально имеющая поддержку только DX12_0, дает прирост в 9% как топовая GTX 2080, прирост у видеокарт Vega доходит до 17%, что является просто потрясающим результатом. В любом случае мы замечаем прирост на последних сериях видеокарт от 5% до почти 20% производительности, и это очень значительное изменение. Что можно сказать — даже в связке с мощным процессором на современных видеокартах переход на DX12 оправдан и увеличивает производительность, если провести подобные тесты с менее производительным процессором, то отличия будут еще более существенны.

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


Что ж, в DX11 видим тотальное доминирование продуктов Nvidia, и только Vega 56 немного опережает своего визави в виде GTX1070.


Однако при переходе на DX12 ситуация кардинально меняется, и Vega 56 опережает GTX 1070 уже на 13% и отстает на 7,6% от GTX1080, Vega 64 же опережает GTX 1080 5.4% и не дотягивает до RTX 2070 всего 2%! Да, похоже, AMD не зря в своих презентациях много внимание уделяла DX12 — действительно, их продукция намного лучше чувствует себя под новым API.

В качестве вывода можно сказать, что для владельцев старых процессоров, которые приобрели одни из последних серий видеокарт, переход на DX12 в любимой игре даст ощутимую прибавку производительности вплоть до 50%, при использовании DX12 на топовых видеокартах и процессорах выигрыш DX12 может составлять 10-20%, что тоже крайне не мало, поэтому все больше и больше разработчиков обращают внимание на новый API, и если в 19 году как минимум 50% из крупных, так называемых AAA, игр вышло с поддержкой DX12, то с выходом консолей нового поколения как от Microsoft, так и от Sony игровая индустрия окончательно перейдет на новый стандарт, поэтому при покупке видеокарты уже сейчас стоит обращать внимание преимущественно на тесты именно в этом API. Поэтому, скажем, новые серии Turing в виде 1660 1660ti 1650 1650ti могут быть намного привлекательнее, чем это могло бы казаться на первый взгляд т.к. по сравнению с 1050ti,1060, 1070 они действительно быстрее работают под новым API.

Содержание

Тесселяция [ ]

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

Вычислительные шейдеры и неупорядоченная память [ ]

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

Вычислительные шейдеры могут также производить операции такие, как summed-area tables, быстрое Фурье-преобразование значительно быстрее, чем ранее применяемые методы на графическом процессоре. На данный момент Microsoft исследует библиотеки, обеспечивающие подобные расчёты. Microsoft считает, что алгоритмы, такие как A-буфер визуализация и трассировка лучей могут также быть осуществлены эффективно, но на данный момент нет реальных показателей, свидетельствующих об их эффективности.

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

Многопоточная визуализация [ ]

В отличие от других возможностей, в Direct3D 11 многопоточная визуализация реализуется программно через драйвер. Соответствующие драйверы D3D10 (возможно, даже D3D9) позволяют выполнять многопоточную визуализацию гораздо эффективней, чем ранее. Определённый уровень многопоточности будет доступен даже без новых драйверов, однако пока неясно, какие ограничения будут в этом случае.

Другие возможности [ ]

Форматы блоков сжатия D3D9 и D3D10 основаны на идее, что каждый блок 4 × 4 из текселей содержит все свои значения в виде одной линии, и биты каждого текселя кодируют позицию в этой линии. Например, в DXT1/BC1 строка в пространстве RGB представляет две конечные точки RGB, и каждый тексель использует два бита, чтобы указать какой цвет используется из четырёх точек вдоль линии.

Новые форматы D3D11 поддерживают типы блоков с одной, двумя и даже тремя (в случае BC7) цветовыми линиями. Существует компромисс между числом линий и числом точек вдоль такой линии, поскольку каждый блок занимает одинаковый объём памяти. В принципе, блок 4 × 4 с двумя цветовыми линиями требует дополнительно 16 бит на каждый блок для задания какая линия каждого текселя была связана с ним (в случае трёх цветовых линий потребуется ещё больше бит). Для снижения требований по памяти поддерживаются только небольшой набор возможных моделей цветовых линий. Для каждого блока утилита упаковки выбирает лучший вариант из этого подмножества.

Direct3D 11 имеет более жёсткую спецификацию текстур. Результаты декомпрессии должны быть точными и субтексельная/субмип фильтрация должна обеспечивать точность не менее 8 бит.

Аппаратное обеспечение может дополнительно поддерживать (опционально) вещественные числа с плавающей точкой двойной точности.

  • Адресуемый потоковый вывод (Addressable Stream Out)
  • Непрямая отрисовка (Draw Indirect)
  • Улучшенный Gather4 (Improved Gather4)
  • Instance programming model для геометрических шейдеров (Geometry shader instance programming model)
  • Min-LOD texture clamps
  • Conservative oDepth
  • Pull-model attribute eval
  • Read-only depth or stencil views

Я заметил, что очень многие почему-то считают что начинать надо с DX9 и только потом переходить на DX11. Это неверно. DX9 устарел, и хотя до сих пор делают игры на нем, вы ведь завтра игру не сделаете, в лучшем случае через год или через два. То есть к тому времени когда вы будете способны делать игры, технологии могут сто раз поменяться, поэтому стоит всегда начинать с самых новых. Кроме того скорее всего консоли нового поколения также будут использовать современное GAPI (DX11/OGL 4 или выше).

Это первая причина. Вторая - DX11 проще по синтаксису.

А почему не OpenGL? [ ]

Не всем он нравится. Не все собираются делать игры под линуксы и маки (а в консоли вас все равно не пустят). Проблемы с драйверами - не все конечные пользователи умеют их правильно устанавливать (я вот до сих пор не могу обновить драйвер своей видеокарты 2010 года, потому что криворукие драйверописатели что-то там сделали, из-за чего их драйверы не опознают мою видеокарту, и поэтому не хотят устанавливаться. ну и как я буду играть в игру на OpenGL 4?). Хотя, возможно, я когда-нибудь и начну писать статьи по OGL, но не сейчас.

Подготовка [ ]

Что нужно знать [ ]

Вы должны знать С++, чуть выше написания хеловорда. Будет хорошо, если вы до этого писали какие-то проекты. Если вы не знаете С++ или начали его изучать в прошлом месяце - продолжайте изучать С++, вам еще рано изучать голый GAPI. Вы спешите и хотите сделать игру завтра? Unity вам в помощь, знать DX для этого вам не нужно - там уже все за вас сделали. Вы уникум умеющий все изучать за неделю? Чтож, я вас предупредил, большинство возникших проблем у читателей было связано как раз с незнанием программирования или IDE. Хотя не волнуйтесь, я пытаюсь помочь даже начинающим, ведь сам был когда-то таким же и тоже DX (тогда DX9) решил изучать на вторую неделю обучения программированию:)

Нужно хоть как-то читать по английски, я конечно статьи пишу на русском, но ведь не одну же эту вики вы будете читать:) Как минимум придется читать хелп из DirectX SDK. Если с английским проблемы, советую тогда скачать программу-переводчик (я использую PROMT).

Что нужно скачать [ ]

Вам, нужна IDE, если вы достаточно опытны, то любая к которой можно подключить DirectX SDK. Если вы не опытны, то Visual Studio 2010. Не Visual studio 2008 (из-за того что я использую новый стандарт С++). И не Visual Studio 2012 (там возможно есть какие-то заморочки, хотя можете попробовать, вдруг не будет проблем). Постарайтесь понять как создается статическая библиотека, как библиотеки подключаются к проекту, что такое RELEASE и что такое DEBUG. А в случае проблем вам нужно понимать, как сделать пошаговое выполнение приложения, и вообще иметь общие представления об дебаге приложения.

Кроме того вам нужно скачать DirectX 11 SDK. Это дело лежит здесь

Обратите внимание - это версия за июль 2010 года. Сейчас есть более новая версия (DX 11.1) которая идет в Windows SDK, но я ее пока не буду рассматривать, из-за не слишком важных изменений, и вам не советую начинать с нее - нет ни примеров, ни документации (точнее они есть, на сайте Microsoft, но их там еще найти надо:) ).

Документация лежит в Microsoft DirectX SDK (June 2010)\Documentation\DirectX9:

С нею вам придется часто работать. Все что я не описываю (например параметры методов), описано там простым английским языком. Хотя документация должна встроится в IDE (но почему-то это не всегда получается)

В папке Microsoft DirectX SDK (June 2010)\Samples\C++ лежат примеры (в том числе и скомпилированные). Вас должны интересовать папки Direct3D10 и Direct3D11 (в них есть папка Bin, в ней уже собранные примеры для запуска)

Вопросы по DirectX SDK [ ]

Какой самый новый и где взять? [ ]

На данный момент самый новый - 11.1. Работает с Visual Studio 2012. Новые фичи:

Но я не рекомендую.

Не находит заголовок "d3dx9.h", "d3dx10.h" или "d3dx11.h" [ ]

Скорее всего у вас DX 11.1. В нем вроде как таких заголовков больше нет

Об этом написано здесь:

Wherever "d3dx9.h", "d3dx10.h", or "d3dx11.h" are included in your project, be sure to explicitly include "d3d9.h", "d3d10.h" and "dxgi.h", or "d3d11.h" and "dxgi.h" first to ensure you are picking up the newer version. You can disable warning C4005 if needed; however, this warning indicates you are using the older version of these headers.
Remove all references to DXGIType.h in your project. This header doesn't exist in the Windows SDK, and the DirectX SDK version conflicts with the new winerror.h.
All D3DX DLLs are installed onto your development computer by the DirectX SDK installation. Ensure that the necessary D3DX dependencies are redistributed with any sample or with your application if it is moved to another machine.
Be aware that replacement technologies for current uses of D3DX11 include DirectXTex and DirectXTK. D3DXMath is replaced by DirectXMath.

Удалите данные строчки.

Вопросы по урокам [ ]

Как изучать [ ]

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

Самый идеальный способ изучения примерно следующий:

Возникли проблемы, что делать? [ ]

Если код не компилируется:

  1. Вы подключили нужный фреймворк?
  2. Вы правильно настроили проект?
  3. Вы не допустили ошибку при перепечатывании кода?

Если ваше приложение компилируется, но не работает:

Приложение работало, вы внесли изменения, и теперь пустой экран (или сразу пустой экран):

Читайте также: