Введение
API, используемый в Microsoft DirectX для 3D-рендеринга.
Direct3D — это графический интерфейс программирования приложений (API) для Microsoft Windows. Direct3D используется для рендеринга трехмерной графики в приложениях, где важна производительность, таких как игры. Direct3D использует аппаратное ускорение, если оно доступно на видеокарте, позволяя аппаратно ускорить весь конвейер 3D-рендеринга или его часть. Direct3D раскрывает расширенные графические возможности 3D-графического оборудования, включая Z-буферизацию, W-буферизацию, буферизацию трафаретов, пространственное сглаживание, альфа-смешивание, цветовое смешивание, мип-картирование, текстурное смешивание, отсечение, отбрасывание невидимых поверхностей, атмосферные эффекты, перспективно-корректное текстурирование, программируемые HLSL-шейдеры и эффекты. Интеграция с другими технологиями DirectX позволяет Direct3D предоставлять такие функции, как видеокартирование, аппаратный 3D-рендеринг в 2D-плоскостях наложения и даже спрайты, обеспечивая использование 2D и 3D-графики в интерактивных мультимедийных приложениях. Direct3D содержит множество команд для рендеринга 3D-компьютерной графики; однако, начиная с версии 8, Direct3D заменил фреймворк DirectDraw и также взял на себя ответственность за рендеринг 2D-графики. Microsoft постоянно обновляет Direct3D для поддержки новейших технологий, доступных на 3D-графических картах. Direct3D предлагает полную программную эмуляцию вершин, но не пиксельную программную эмуляцию для функций, недоступных в аппаратном обеспечении. Например, если программное обеспечение, использующее Direct3D, требует пиксельных шейдеров, а видеокарта на компьютере пользователя не поддерживает эту функцию, Direct3D не будет ее эмулировать, хотя он будет вычислять и отображать полигоны и текстуры 3D-моделей, хотя и с обычно ухудшенным качеством и производительностью по сравнению с аппаратной реализацией. API включает в себя Reference Rasterizer (или REF-устройство), которое эмулирует общую графическую карту в программном обеспечении, хотя оно слишком медленное для большинства 3D-приложений реального времени и обычно используется только для отладки. Новый программный растризатор реального времени WARP, предназначенный для эмуляции полного набора функций Direct3D 10.1, включен в Windows 7 и Windows Vista Service Pack 2 с обновлением платформы; его производительность, как утверждается, сопоставима с производительностью маломощных 3D-карт на многоядерных процессорах. Как часть DirectX, Direct3D доступен для Windows 95 и более поздних версий и является основой для векторного графического API на различных версиях консолей Xbox. Слой совместимости Wine, свободная реализация нескольких API Windows, включает в себя реализацию Direct3D. Основными конкурентами Direct3D являются OpenGL от Khronos и его преемник Vulkan. Fahrenheit была попыткой Microsoft и SGI объединить OpenGL и Direct3D в 1990-х годах, но в конечном итоге была отменена.
Обзор
Direct3D 6.0 – Многотекстурирование
Direct3D 7.0 – Аппаратное преобразование, отсечение и освещение (TCL/T&L)
Direct3D 8.0 – Pixel Shader 1.0/1.1 и Vertex Shader 1.0/1.1
Direct3D 8.1 – Pixel Shader 1.2/1.3/1.4
Direct3D 9.0 – Shader Model 2.0 (Pixel Shader 2.0 и Vertex Shader 2.0)
Direct3D 9.0a – Shader Model 2.0a (Pixel Shader 2.0a и Vertex Shader 2.0a)
Direct3D 9.0b – Pixel Shader 2.0b
Direct3D 9.0c – Последняя версия, поддерживаемая для Windows 98 (ранние выпуски) и Windows 2000/XP (все выпуски); Shader Model 3.0 (Pixel Shader 3.0 и Vertex Shader 3.0)
Direct3D 9.0L – Только для Windows Vista; Direct3D 9.0c, Shader Model 3.0, Windows Graphics Foundation 1.0, DXVA 1.0, GPGPU
Direct3D 10.0 – Windows Vista/Windows 7; Shader Model 4.0, Windows Graphics Foundation 2.0, DXVA 2.0
Direct3D 10.1 – Windows Vista SP1/Windows 7; Shader Model 4.1, Windows Graphics Foundation 2.1, DXVA 2.1
Direct3D 11.0 – Windows Vista SP2/Windows 7; Shader Model 5.0, Тесселяция, Многопоточная отрисовка, Вычислительные шейдеры, реализованные аппаратно и программно при работе с Direct3D 9/10/10.1
Direct3D 11.1 – Windows 8 (частично поддерживается на Windows 7 SP1); Стереоскопическая 3D-рендеринг
Direct3D 11.2 – Windows 8.1; Плиточная адресация ресурсов
Direct3D 11.3 – Windows 10
Direct3D 12.0 – Windows 10; Низкоуровневый API рендеринга, Shader Model 5.1 и 6.0
Direct3D 12.1 – Windows 10; DirectX Raytracing
Direct3D 12.2 – Windows 10; DirectX 12 Ultimate
Direct3D 7.0 – Hardware Transformation, Clipping and Lighting (TCL/T&L)
Direct3D 8.0 – Pixel Shader 1.0/1.1 & Vertex Shader 1.0/1.1
Direct3D 8.1 – Pixel Shader 1.2/1.3/1.4
Direct3D 9.0 – Shader Model 2.0 (Pixel Shader 2.0 & Vertex Shader 2.0)
Direct3D 9.0a – Shader Model 2.0a (Pixel Shader 2.0a & Vertex Shader 2.0a)
Direct3D 9.0b – Pixel Shader 2.0b
Direct3D 9.0c – last version supported for Windows 98 (early releases) and for Windows 2000/XP (all releases); Shader Model 3.0 (Pixel Shader 3.0 & Vertex Shader 3.0)
Direct3D 9.0L – Windows Vista only; Direct3D 9.0c, Shader Model 3.0, Windows Graphics Foundation 1.0, DXVA 1.0, GPGPU
Direct3D 10.0 – Windows Vista/Windows 7; Shader Model 4.0, Windows Graphics Foundation 2.0, DXVA 2.0
Direct3D 10.1 – Windows Vista SP1/Windows 7; Shader Model 4.1, Windows Graphics Foundation 2.1, DXVA 2.1
Direct3D 11.0 – Windows Vista SP2/Windows 7; Shader Model 5.0, Tessellation, Multithreaded rendering, Compute shaders, implemented by hardware and software running Direct3D 9/10/10.1
Direct3D 11.1 – Windows 8 (partially supported on Windows 7 SP1 also); Stereoscopic 3D Rendering
Direct3D 11.2 – Windows 8.1; Tiled resources
Direct3D 11.3 – Windows 10
Direct3D 12.0 – Windows 10; low level rendering API, Shader Model 5.1 and 6.0
Direct3D 12.1 – Windows 10; DirectX Raytracing
Direct3D 12.2 – Windows 10; DirectX 12 Ultimate
Direct3D 2.0 и 3.0
В 1992 году Серван Кёндджан, Даг Рабсон и Кейт Сикингс основали компанию RenderMorphics, которая разработала 3D графический API под названием Reality Lab, использовавшийся в медицинской визуализации и программном обеспечении CAD. Было выпущено две версии этого API. Первая версия Direct3D вошла в состав DirectX 2.0 (2 июня 1996 года) и DirectX 3.0 (26 сентября 1996 года). Direct3D изначально реализовал 3D API "непосредственного режима" и надстроил поверх него 3D API "сохраняемого режима". Оба типа API уже были доступны во втором выпуске Reality Lab до выхода Direct3D. (см. OpenGL против Direct3D)
Вместо того чтобы принять OpenGL в качестве игрового API, Microsoft решила продолжать совершенствовать Direct3D, не только для конкуренции с OpenGL, но и для более эффективной конкуренции с другими проприетарными API, такими как Glide от 3dfx. С самого начала режим непосредственного рендеринга также поддерживал тайловый рендеринг Talisman с использованием методов BeginScene/EndScene интерфейса IDirect3DDevice.
Direct3D 4.0
Никаких существенных изменений в Direct3D для DirectX 4.0 не планировалось; выпуск был запланирован на конец 1996 года, но затем отменен.
Direct3D 5.0
В декабре 1996 года команда в Редмонде взяла на себя разработку Direct3D Immediate Mode, а лондонская команда RenderMorphics продолжила работу над Retained Mode. Команда из Редмонда добавила API DrawPrimitive, который избавил приложения от необходимости создавать буферы выполнения, сделав Direct3D более похожим на другие API рендеринга в немедленном режиме, такие как Glide и OpenGL. Первая бета-версия DrawPrimitive была выпущена в феврале 1997 года, а финальная версия – вместе с DirectX 5.0 в августе 1997 года. Помимо внедрения более удобного API немедленного режима, DirectX 5.0 добавил метод SetRenderTarget, который позволил устройствам Direct3D выводить графику на различные поверхности DirectDraw.
Direct3D 6.0
DirectX 6.0 (выпущенный в августе 1998 года) представил множество новых функций, поддерживающих современное оборудование (таких как мультитекстурирование и буферы трафаретов), а также оптимизированные конвейеры геометрии для x87, SSE и 3DNow! и необязательное управление текстурами для упрощения программирования. Direct3D 6.0 также включал поддержку функций, лицензированных Microsoft у отдельных производителей оборудования для включения в API в обмен на преимущество в скорости выхода на рынок для лицензиата. Поддержка сжатия текстур S3 была одной из таких функций, переименованной в DXTC для интеграции в API. Другой – запатентованная техника рельефного отображения TriTech. Microsoft включила эти функции в DirectX, а затем добавила их в обязательные требования к драйверам для получения логотипа Windows, чтобы стимулировать широкое внедрение этих функций в оборудование других производителей. Незначительное обновление DirectX 6.0 вышло в феврале 1999 года в виде DirectX 6.1. Помимо впервые добавленной поддержки DirectMusic, этот релиз улучшил поддержку 3D-расширений Intel Pentium III. Конфиденциальный служебный документ, датированный 1997 годом, свидетельствует о планах Microsoft объявить о полной поддержке Talisman в DirectX 6.0, однако разработка API была прекращена (подробности см. на странице Microsoft Talisman).
Direct3D 7.0
DirectX 7.0 (выпущенный в сентябре 1999 года) представил формат текстур DDS и поддержку аппаратного ускорения трансформаций и освещения (впервые реализованную на ПК-оборудовании с GeForce 256 от Nvidia), а также возможность выделения буферов вершин в аппаратной памяти. Аппаратные буферы вершин стали первым значительным преимуществом DirectX перед OpenGL за всю его историю. Direct3D 7.0 также расширил поддержку аппаратного многотекстурирования в DirectX и является кульминацией возможностей фиксированного конвейера многотекстурирования: несмотря на свою мощность, он был настолько сложен в программировании, что потребовалась новая модель программирования для раскрытия возможностей шейдинга графического оборудования.
Direct3D 8.0
DirectX 8.0, выпущенный в ноябре 2000 года, представил программируемость в виде вершинных и пиксельных шейдеров, позволяя разработчикам писать код, не заботясь о избыточном состоянии оборудования. Сложность программ шейдеров зависела от сложности задачи, а драйвер дисплея компилировал эти шейдеры в инструкции, понятные аппаратному обеспечению. Direct3D 8.0 и его возможности программируемого затенения стали первым значительным отходом от архитектуры с фиксированной функциональностью в стиле OpenGL, где отрисовка контролируется сложной машиной состояний. Direct3D 8.0 также упразднил DirectDraw как отдельный API, включив в себя все оставшиеся вызовы API DirectDraw, необходимые для разработки приложений, такие как Present – функция, используемая для отображения результатов рендеринга. Direct3D не считался удобным в использовании, но с версии DirectX 8.1 многие проблемы с удобством использования были решены. Direct3D 8 содержал множество мощных функций 3D-графики, таких как вершинные шейдеры, пиксельные шейдеры, туман, рельефное текстурирование и текстурирование.
Direct3D 10
Windows Vista включает в себя значительное обновление API Direct3D. Изначально он назывался WGF 2.0 (Windows Graphics Foundation 2.0), затем DirectX 10 и DirectX Next. Direct3D 10 включает обновленную модель шейдеров 4.0 и возможность прерывания программ шейдеров. В отличие от предыдущих версий API, Direct3D 10 больше не использует "биты функциональности" (или "капсы") для определения поддерживаемых функций графического устройства. Вместо этого он определяет минимальный стандарт аппаратных возможностей, необходимых для того, чтобы система отображения считалась "совместимой с Direct3D 10". Это существенное изменение, направленное на упрощение кода приложений за счет исключения проверок функциональности и специальных случаев, основанных на наличии или отсутствии определенных возможностей. Поскольку аппаратное обеспечение, совместимое с Direct3D 10, было относительно редким после первоначального выпуска Windows Vista и из-за большого количества установленных несовместимых с Direct3D 10 видеокарт, первые игры, совместимые с Direct3D 10, по-прежнему предоставляют пути рендеринга Direct3D 9. Примерами таких игр являются проекты, изначально написанные для Direct3D 9 и портированные на Direct3D 10 после выпуска, такие как Company of Heroes, или игры, первоначально разработанные для Direct3D 9, в которые позже был добавлен путь Direct3D 10 в процессе разработки, такие как Hellgate: London или Crysis. SDK DirectX 10 стал доступен в феврале 2007 года.
Direct3D 10.0
Аппаратное обеспечение уровня Direct3D 10.0 должно поддерживать следующие функции: возможность обработки цельных примитивов на новой стадии шейдера геометрии, возможность вывода данных вершин, генерируемых конвейером, в память с использованием стадии вывода потока, поддержка мультисэмплинг-альфа-в-покрытие, чтение обратно поверхности глубины/шаблона или мультисэмплированного ресурса после того, как он больше не связан в качестве цели рендеринга, полная интеграция HLSL – все шейдеры Direct3D 10 написаны на HLSL и реализованы с использованием общего ядра шейдеров, целочисленные и побитовые операции шейдеров, организация состояния конвейера в 5 неизменяемых объектов состояния, организация констант шейдера в константные буферы, увеличенное количество целей рендеринга, текстур и сэмплеров, отсутствие ограничений на длину шейдера, новые типы ресурсов и форматы ресурсов, многоуровневые среды выполнения/API, возможность выполнения смены материала для каждого примитива и настройки с использованием шейдера геометрии, расширенная обобщенность доступа к ресурсам с использованием представлений, удаление устаревших битов возможностей оборудования (caps). Фиксированные конвейеры упраздняются в пользу полностью программируемых конвейеров (часто называемых унифицированной архитектурой конвейера), которые могут быть запрограммированы для эмуляции их функциональности. Новый объект состояния для обеспечения (в основном) эффективного изменения состояний центральным процессором. Модель шейдеров 4.0 расширяет программируемость графического конвейера. Она добавляет инструкции для целочисленных и побитовых вычислений. Общее ядро шейдеров предоставляет полный набор 32-битных целочисленных и побитовых операций, соответствующих стандарту IEEE. Эти операции позволяют реализовать новый класс алгоритмов в графическом оборудовании, например, методы сжатия и упаковки, быстрое преобразование Фурье (FFT) и управление потоком программы с использованием битовых полей. Шейдеры геометрии, работающие с соседними треугольниками, образующими сетку. Массивы текстур позволяют осуществлять замену текстур на графическом процессоре без вмешательства центрального процессора. Условный рендеринг позволяет игнорировать вызовы отрисовки на основе определенных условий. Это обеспечивает быстрое отсечение невидимых объектов, предотвращая отрисовку объектов, которые не видны или находятся слишком далеко для отображения. Поддержка инстанцирования 2.0, позволяющая отрисовывать несколько экземпляров похожих сеток, таких как армии, трава или деревья, за один вызов отрисовки, сокращая время обработки, необходимое для нескольких похожих объектов, до времени обработки одного объекта.
Direct3D 10.1
Direct3D 10.1 был анонсирован Microsoft вскоре после выпуска Direct3D 10 в качестве незначительного обновления. Спецификация была окончательно сформирована с выпуском DirectX SDK в ноябре 2007 года, а среда выполнения поставлялась с Windows Vista SP1, которая стала доступна с середины марта 2008 года. Direct3D 10.1 устанавливает дополнительные стандарты качества изображения для производителей графики и предоставляет разработчикам больший контроль над качеством изображения. Функции включают более тонкую настройку сглаживания (как мультисэмплинг, так и суперсэмплинг с затенением на образец и управлением приложением положением сэмплов), а также большую гибкость в некоторых существующих функциях (массивы кубических карт и независимые режимы смешивания). Аппаратное обеспечение уровня Direct3D 10.1 должно поддерживать следующие функции: мультисэмплинг был улучшен для обобщения прозрачности на основе покрытия и повышения эффективности мультисэмплинга при многопроходном рендеринге, улучшено отсечение – полигоны нулевой площади автоматически отсекаются (это влияет только на отрисовку каркасов), независимые режимы смешивания для каждого буфера кадра, новое выполнение пиксельного шейдера с частотой сэмплирования с примитивной растризацией, увеличена пропускная способность этапов конвейера, поверхности MSAA для цвета и буфера глубины/трафарета теперь могут использоваться с CopyResource как в качестве источника, так и в качестве назначения, MultisampleEnable влияет только на растризацию линий (точки и треугольники не затронуты) и используется для выбора алгоритма рисования линий. Это означает, что некоторые методы мультисэмплирования из Direct3D 10 больше не поддерживаются, инструкции Texture Sampling sample c и sample c lz определены для работы как с Texture2DArrays, так и с TextureCubeArrays, используя член Location (альфа-компонент) для указания индекса массива, поддержка TextureCubeArrays. Обязательная фильтрация с плавающей точкой 32 бита. Правила для чисел с плавающей точкой – используются те же правила IEEE 754 для чисел с плавающей точкой, за исключением того, что 32-битные операции с плавающей точкой были ужесточены для получения результата в пределах 0,5 единицы младшего значащего бита (0,5 ULP) от бесконечно точного результата. Это относится к сложению, вычитанию и умножению (точность 0,5 ULP для умножения, 1,0 ULP для обратной величины). Форматы – точность смешивания float16 увеличена до 0,5 ULP. Смешивание также требуется для форматов UNORM16/SNORM16/SNORM8. Преобразование форматов при копировании между некоторыми 32/64/128-битными предварительно структурированными типизированными ресурсами и сжатыми представлениями той же разрядности. Обязательная поддержка 4x MSAA для всех целей рендеринга, кроме R32G32B32A32 и R32G32B32. Модель шейдеров 4.1.
В отличие от Direct3D 10, который строго требовал аппаратные средства и интерфейсы драйверов класса Direct3D 10, среда выполнения Direct3D 10.1 может работать на аппаратном обеспечении Direct3D 10.0, используя концепцию "уровней функций", но новые функции поддерживаются исключительно новым оборудованием, которое предоставляет уровень функций 10.1. Единственным доступным аппаратным обеспечением Direct3D 10.1 по состоянию на июнь 2008 года были серии Radeon HD 3000 и Radeon HD 4000 от ATI; в 2009 году к ним присоединились графические процессоры Chrome 430/440GT от S3 Graphics и некоторые модели начального уровня серии GeForce 200 от Nvidia. В 2011 году чипсеты Intel начали поддерживать Direct3D 10.1 с выпуском Intel HD Graphics 2000 (GMA HD).
Direct3D 11
Direct3D 11 был выпущен в составе Windows 7. Он был представлен на Gamefest 2008 22 июля 2008 года и продемонстрирован на технической конференции Nvision 08 26 августа 2008 года. Технический предварительный просмотр Direct3D 11 был включен в ноябрьский выпуск DirectX SDK 2008 года. AMD продемонстрировала рабочее аппаратное обеспечение DirectX 11 на Computex 3 июня 2009 года, запустив некоторые примеры из DirectX 11 SDK. Среда выполнения Direct3D 11 способна работать на аппаратном обеспечении и драйверах классов Direct3D 9 и 10.x, используя концепцию "уровней функций", расширяя функциональность, впервые представленную в среде выполнения Direct3D 10.1. Уровни функций позволяют разработчикам унифицировать конвейер рендеринга под API Direct3D 11 и использовать улучшения API, такие как более эффективное управление ресурсами и многопоточность, даже на видеокартах начального уровня, хотя расширенные функции, такие как новые модели шейдеров и этапы рендеринга, будут доступны только на более производительном оборудовании. Существует три профиля "Уровень 9", которые охватывают различные возможности популярных видеокарт DirectX 9.0a, а Direct3D 10, 10.1 и 11 имеют отдельные уровни функций; каждый верхний уровень является строгим надмножеством нижнего уровня. Тесселяция рассматривалась для Direct3D 10, но впоследствии была отменена. Графические процессоры, такие как Radeon R600, оснащены движком тесселяции, который можно использовать с Direct3D 9/10/10.1 и OpenGL, но он не совместим с Direct3D 11 (согласно Microsoft). Более старое графическое оборудование, такое как Radeon 8xxx и GeForce 3/4, поддерживало другую форму тесселяции (RT-патчи, N-патчи), но эти технологии не получили широкого распространения. В связи с этим их поддержка была прекращена в новом оборудовании. Microsoft также упоминала другие функции, такие как прозрачность, независимую от порядка, которая никогда не была реализована в API Direct3D, но почти прозрачно поддерживалась ранним оборудованием Direct3D, таким как линейка чипов PowerVR от Videologic.
Direct3D 11.1
Direct3D 11.1 — это обновление API, поставляемое с Windows 8. Среда выполнения Direct3D в Windows 8 использует DXGI 1.2 и требует новых драйверов устройств WDDM 1.2. Предварительная версия Windows SDK для Windows 8 Developer Preview была выпущена 13 сентября 2011 года. Новый API включает в себя трассировку шейдеров и улучшения компилятора HLSL, поддержку скалярных типов данных HLSL с минимальной точностью, UAV (Unordered Access Views) на каждом этапе конвейера, независимую растризацию целей (TIR), возможность сопоставления SRV динамических буферов без перезаписи, обработку видеоресурсов шейдерами, возможность использования логических операций в целевом буфере рендеринга, возможность привязки поддиапазона константного буфера к шейдеру и его извлечения, возможность создания константных буферов, превышающих объем, доступный для шейдера, возможность отбрасывания ресурсов и представлений ресурсов, возможность изменения субресурсов с новыми опциями копирования, возможность принудительного указания количества сэмплов для создания состояния растризатора, возможность очистки всего или части представления ресурса, возможность использования Direct3D в процессах Session 0, возможность указания плоскостей отсечения пользователем в HLSL на уровне функций 9 и выше, поддержку буфера теней на уровне функций 9, поддержку воспроизведения видео, расширенную поддержку общих ресурсов Texture2D и динамическое переключение между контекстами и уровнями функций Direct3D 10 и 11. Direct3D 11.1 включает в себя новый уровень функций 11.1, который вносит незначительные обновления в язык шейдеров, такие как большие константные буферы и необязательные инструкции двойной точности, а также улучшенные режимы смешивания и обязательную поддержку 16-битных цветовых форматов для повышения производительности графических процессоров начального уровня, таких как Intel HD Graphics. WARP был обновлен для поддержки уровня функций 11.1. Обновление платформы для Windows 7 включает ограниченный набор функций Direct3D 11.1, однако компоненты, зависящие от WDDM 1.2, такие как уровень функций 11.1 и связанные с ним API, или квад-буферизация для стереоскопической визуализации, отсутствуют.
Direct3D 11.2
Direct3D 11.2 поставлялся вместе с Windows 8.1. Новые аппаратные возможности требуют DXGI 1.3 с драйверами WDDM 1.3 и включают в себя модификацию и связывание шейдеров во время выполнения, граф ссылок функций (FLG), встроенный компилятор HLSL и возможность аннотирования графических команд. Уровни функций 11_0 и 11_1 вводят необязательную поддержку плиточных ресурсов с ограничением уровня детализации шейдеров (Tier2). Последняя функция фактически обеспечивает контроль над аппаратными таблицами страниц, присутствующими во многих современных графических процессорах. WARP был обновлен для полной поддержки новых возможностей. Уровня функций 11_2 не существует; новые возможности распределены по существующим уровням функций. Зависимые от аппаратного обеспечения возможности можно проверять индивидуально с помощью CheckFeatureSupport. Некоторые из "новых" возможностей Direct3D 11.2 фактически более детально раскрывают старые аппаратные возможности; например, D3D11 FEATURE D3D9 SIMPLE INSTANCING SUPPORT раскрывает частичную поддержку инстансирования на оборудовании уровня функций 9_1 и 9_2, в то время как полная поддержка обеспечивается с уровня функций 9_3 и выше. Direct3D 11. X
Direct3D 11. X является надмножеством DirectX 11.2, работающим на Xbox One. Он включает в себя некоторые возможности, такие как пакеты отрисовки, которые позже были анонсированы как часть DirectX 12.
Direct3D 11.3
Direct3D 11.3 был выпущен в июле 2015 года вместе с Windows 10; он включает в себя незначительные функции рендеринга из Direct3D 12, сохраняя при этом общую структуру API Direct3D 11.x. Direct3D 11.3 представляет собой опциональное значение эталонного шаблона, заданное шейдером (Shader Specified Stencil Reference Value), типизированные загрузки из неупорядоченных буферов доступа, растрированные упорядоченные представления (Rasterizer Ordered Views, ROV), опциональный стандартный Swizzle, опциональное отображение текстур по умолчанию, консервативную растризацию (с тремя уровнями), опциональную поддержку Unified Memory Access (UMA) и расширенные плиточные ресурсы (уровень 2) – объёмные плиточные ресурсы.
Direct3D 11.4
Direct3D 11.4 версия 1511 – Изначальная версия Direct3D 11.4 была представлена с обновлением Windows 10 Threshold 2 (версия 1511), улучшая поддержку внешних графических адаптеров и DXGI 1.5. Direct3D 11.4 версия 1607 – Обновленная версия Direct3D 11.4 с обновлением Windows 10 Anniversary Update (версия 1607) включает поддержку WDDM 2.1, формата UHDTV HDR10 (ST 2084) и поддержку переменной частоты обновления для приложений UWP.
Direct3D 12
Direct3D 12 обеспечивает более низкий уровень аппаратной абстракции, чем предыдущие версии, что позволяет будущим приложениям значительно улучшить масштабируемость многопоточности и снизить загрузку центрального процессора. Это достигается за счет лучшего соответствия уровня абстракции Direct3D базовому оборудованию, посредством новых функций, таких как косвенная отрисовка, таблицы дескрипторов, компактные объекты состояния конвейера и пакеты вызовов отрисовки. Снижение накладных расходов драйвера является главным преимуществом Direct3D 12, аналогично Mantle от AMD; хотя Nvidia объявила о широкой поддержке Direct3D 12, компания также проявила некоторую сдержанность в отношении универсальной привлекательности нового API, отметив, что, хотя разработчики игровых движков могут быть рады непосредственному управлению ресурсами GPU из кода приложения, "многие [другие] пользователи не будут" рады этому. В Direct3D 12 также присутствуют некоторые новые аппаратные функции, включая Shader Model 5.1, Volume Tiled Resources (Tier 2), дополнительные режимы смешивания, программируемое смешивание и эффективную прозрачность, независимую от порядка (OIT) с упорядоченными по пикселям UAV. Объекты состояния конвейера (PSO) эволюционировали из Direct3D 11, а новые компактные состояния конвейера означают, что процесс был упрощен. DirectX 11 предлагал гибкость в изменении состояний, что негативно сказывалось на производительности. Упрощение процесса и унификация конвейеров (например, состояний пиксельного шейдера) приводят к более оптимизированному процессу, значительно снижая накладные расходы и позволяя графической карте выполнять больше вызовов отрисовки для каждого кадра. После создания PSO становится неизменяемым. Корневые сигнатуры вводят конфигурации для связи списков команд с ресурсами, необходимыми для шейдеров. Они определяют структуру ресурсов, которые будут использоваться шейдерами, и указывают, какие ресурсы будут привязаны к конвейеру. Графический список команд имеет как графическую, так и вычислительную корневую сигнатуру, в то время как вычислительный список команд будет иметь только вычислительную корневую сигнатуру. Эти корневые сигнатуры полностью независимы друг от друга. В то время как корневая сигнатура определяет типы данных для использования шейдерами, она не определяет и не сопоставляет фактическую память или данные. Корневые параметры — это один из типов записей в корневой сигнатуре. Фактические значения корневых параметров, которые изменяются во время выполнения, называются корневыми аргументами. Это данные, которые читают шейдеры. Direct3D 12 поддерживает явную поддержку нескольких адаптеров, позволяя явно управлять конфигурациями с несколькими графическими процессорами. Такие конфигурации могут быть построены с использованием графических адаптеров одного и того же производителя оборудования, а также с использованием адаптеров от разных производителей. Microsoft выпустила экспериментальную поддержку D3D 12 для Windows 7 SP1 в 2019 году через специальный пакет NuGet. Direct3D 12 версия 1607 – С юбилейным обновлением Windows 10 (версия 1607), выпущенным 2 августа 2016 года, среда выполнения Direct3D 12 была обновлена для поддержки конструкций для явной многопоточности и межпроцессного взаимодействия, что позволяет разработчикам использовать современные массово-параллельные графические процессоры. Другие функции включают обновленные корневые сигнатуры версии 1.1, а также поддержку формата HDR10 и переменных частот обновления. Direct3D 12 версия 1703 – С обновлением Windows 10 Creators Update (версия 1703), выпущенным 11 апреля 2017 года, среда выполнения Direct3D 12 была обновлена для поддержки Shader Model 6.0 и DXIL. Shader Model 6.0 требует обновления Windows 10 Anniversary Update (версия 1607), WDDM 2.1. Новые графические функции включают тестирование границ глубины и программируемую MSAA, а также DirectX Raytracing Tier 1.1 и улучшения выделения памяти.
Although Nvidia has announced broad support for Direct3D 12, they were also somewhat reserved about the universal appeal of the new API, noting that while game engine developers may be enthusiastic about directly managing GPU resources from their application code, "a lot of [other] folks wouldn't" be happy to have to do that. Some new hardware features are also in Direct3D 12, including Shader Model 5.1, Volume Tiled Resources(Tier 2), additional blend modes, programmable blend and efficient order independent transparency (OIT) with pixel ordered UAV. Pipeline state objects (PSOs) have evolved from Direct3D 11, and the new concise pipeline states mean that the process has been simplified. DirectX 11 offered flexibility in how its states could be altered, to the detriment of performance. Simplifying the process and unifying the pipelines (e. g. pixel shader states) lead to a more streamlined process, significantly reducing the overheads and allowing the graphics card to draw more calls for each frame. Once created, the PSO is immutable. Root signatures introduce configurations to link command lists to resources required by shaders. They define the layout of resources that shaders will use and specifies what resources will be bound to the pipeline. A graphics command list has both a graphics and compute root signature, while a compute command list will have only a compute root signature. These root signatures are completely independent of each other. While the root signature lays out the types of data for shaders to use, it does not define or map the actual memory or data. Root parameters are one type of entry in a root signature. The actual values of the root parameters that are modified at runtime are called root arguments. This is the data that the shaders read. Direct3D 12 features explicit multi adapter support, allowing the explicit control of multiple GPUs configuration systems. Such configurations can be built with graphics adapter of the same hardware vendor as well of different hardware vendor together. An experimental support of D3D 12 for Windows 7 SP1 has been released by Microsoft in 2019 via a dedicated NuGet package. Direct3D 12 version 1607 – With the Windows 10 anniversary update (version 1607), released on August 2, 2016, the Direct3D 12 runtime has been updated to support constructs for explicit multithreading and inter process communication, allowing developers to take advantage of modern massively parallel GPUs. Other features include updated root signatures version 1.1, as well as support for HDR10 format and variable refresh rates. Direct3D 12 version 1703 – With the Windows 10 Creators Update (version 1703), released on April 11, 2017, the Direct3D 12 runtime has been updated to support Shader Model 6.0 and DXIL. and Shader Model 6.0 requires Windows 10 Anniversary Update (version 1607), WDDM 2.1. New graphical features are Depth Bounds Testing and Programmable MSAA. as well DirectX Raytracing Tier 1.1 and memory allocation improvements.
Трубопровод
API Microsoft Direct3D 11 определяет процесс преобразования группы вершин, текстур, буферов и состояния в изображение на экране. Этот процесс описывается как конвейер рендеринга, состоящий из нескольких отдельных этапов. Различные этапы конвейера Direct3D 11 следующие:
Входной компоновщик: считывает данные вершин из буфера вершин, предоставляемого приложением, и передает их по конвейеру. Вершинный шейдер: выполняет операции над каждой вершиной по отдельности, такие как преобразования, скиннинг или освещение. Hull-шейдер: выполняет операции над наборами управляющих точек патча и генерирует дополнительные данные, известные как константы патча. Тесселятор: подразделяет геометрию для создания более детализированных представлений оболочки. Domain-шейдер: выполняет операции над вершинами, полученными на этапе тесселяции, аналогично вершинному шейдеру. Геометрический шейдер: обрабатывает целые примитивы, такие как треугольники, точки или линии. Для каждого примитива этот этап может отбросить его или сгенерировать один или несколько новых примитивов. Поток вывода: может записывать результаты предыдущего этапа в память, что полезно для повторного использования данных в конвейере. Растеризатор: преобразует примитивы в пиксели и передает их в пиксельный шейдер. Растеризатор также может выполнять другие задачи, такие как отсечение невидимых частей или интерполяция данных вершин для получения данных на пиксель. Пиксельный шейдер: определяет окончательный цвет пикселя, который будет записан в целевой буфер рендеринга, и может вычислять значение глубины для записи в буфер глубины. Объединитель вывода: объединяет различные типы выходных данных (значения пиксельного шейдера, альфа-смешивание, данные глубины/трафарета) для создания конечного результата. Этапы конвейера, изображенные в виде круглых блоков, полностью программируемые. Приложение предоставляет программу шейдера, которая описывает точные операции, выполняемые на этом этапе. Многие этапы являются необязательными и могут быть полностью отключены.
Уровни характеристик
В Direct3D 5–9, когда новые версии API вводили поддержку новых аппаратных возможностей, большинство из них были необязательными – каждый производитель графических карт поддерживал свой собственный набор поддерживаемых функций в дополнение к базовой необходимой функциональности. Определение поддержки отдельных функций требовало использования "битов возможностей" или "caps", что делало кросс-платформенное программирование графики сложной задачей. Direct3D 10 представил значительно упрощенный набор обязательных аппаратных требований, основанный на наиболее популярных возможностях Direct3D 9, которым должны были соответствовать все поддерживающие графические карты, с небольшим количеством дополнительных возможностей для поддерживаемых форматов текстур и операций. Direct3D 10.1 добавил несколько новых обязательных аппаратных требований, и для сохранения совместимости с оборудованием и драйверами 10.0 эти функции были объединены в два набора, называемых "уровнями функций", при этом уровень 10.1 являлся надмножеством уровня 10.0. С появлением Direct3D 11.0, 11.1 и 12 новые аппаратные возможности и обязательные функции были сгруппированы в более высокие уровни функций, которые были расширены в Direct3D 11.2 и последующих версиях. Такой подход позволяет разработчикам унифицировать конвейер рендеринга и использовать единую версию API как на новом, так и на старом оборудовании, используя преимущества повышения производительности и удобства использования в новых средах выполнения. Уровни функций используют символ подчеркивания в качестве разделителя (например, "12_1"), а версии API/среды выполнения – точку (например, "Direct3D 11.4").
Многопоточность
Модель драйвера WDDM в Windows Vista и более поздних версиях поддерживает произвольно большое количество контекстов исполнения (или потоков) в аппаратном или программном обеспечении. Windows XP поддерживала лишь многозадачный доступ к Direct3D, при котором отдельные приложения могли выполняться в разных окнах и использовать аппаратное ускорение, а операционная система имела ограниченный контроль над действиями графического процессора и драйвер мог произвольно переключать потоки исполнения. Возможность выполнения среды выполнения в многопоточном режиме появилась с Direct3D 11. Каждый контекст исполнения представлен представлением ресурсов графического процессора. Контексты исполнения защищены друг от друга, однако вредоносное или некорректно написанное приложение может получить контроль над выполнением в драйвере пользовательского режима и потенциально получить доступ к данным другого процесса в памяти графического процессора, отправляя измененные команды. Несмотря на защиту от доступа другого приложения, хорошо написанное приложение все равно должно защищать себя от сбоев и потери устройства, вызванных другими приложениями. Операционная система самостоятельно управляет потоками, позволяя аппаратному обеспечению переключаться между ними по мере необходимости, а также обрабатывает управление памятью и подкачку (в системную память и на диск) через интегрированное управление памятью ядра ОС. Более гранулярное переключение контекста, то есть возможность переключать два потока исполнения на уровне инструкции шейдера, а не на уровне одной команды или даже пакета команд, было представлено в WDDM/DXGI 1.2, поставлявшемся с Windows 8. WDDM 2.0 и DirectX 12 были переработаны для поддержки полностью многопоточных вызовов отрисовки. Это было достигнуто путем создания всех ресурсов неизменяемыми (то есть доступными только для чтения), сериализации состояний рендеринга и использования пакетов вызовов отрисовки. Это позволяет избежать сложного управления ресурсами в драйвере ядра, что делает возможными множественные повторные вызовы драйвера пользовательского режима через одновременные контексты исполнения, предоставляемые отдельными потоками рендеринга в одном приложении.
Мобильная версия Direct3D
Direct3D Mobile основан на Direct3D, но требует меньше памяти. Windows CE предоставляет поддержку Direct3D Mobile.
Альтернативные варианты реализации
Существуют следующие альтернативные реализации API Direct3D. Они полезны для платформ, отличных от Windows, и для оборудования, не поддерживающего некоторые версии DX:
WineD3D – The Wine open source project has working implementations of the Direct3D APIs via translation to OpenGL. Wine's implementation can also be run on Windows under certain conditions. vkd3d – vkd3d is an open source 3D graphics library built on top of Vulkan which allows to run Direct3D 12 applications on top of Vulkan. It's primarily used by the Wine project, and is now included with Valve's Proton project bundled with Steam on Linux. DXVK – An open source Vulkan based translation layer for Direct3D 9/10/11 which allows running 3D applications on Linux using Wine. It is used by Proton/Steam for Linux. DXVK is able to run a large number of modern Windows games under Linux. D9VK – A fork of DXVK for adding Direct3D 9 support, included with Steam/Proton on Linux. On December 16, 2019 D9VK was merged into DXVK. D8VK – A fork of DXVK for adding Direct3D 8 support on Linux. Gallium Nine – Gallium Nine makes it possible to run Direct3D 9 applications on Linux natively, i. e. without any calls translation which allows for a near native speed. It depends on Wine and Mesa.
WineD3D – Проект Wine с открытым исходным кодом имеет рабочие реализации API Direct3D посредством трансляции в OpenGL. Реализация Wine также может работать в Windows при определенных условиях.
WineD3D – The Wine open source project has working implementations of the Direct3D APIs via translation to OpenGL. Wine's implementation can also be run on Windows under certain conditions. vkd3d – vkd3d is an open source 3D graphics library built on top of Vulkan which allows to run Direct3D 12 applications on top of Vulkan. It's primarily used by the Wine project, and is now included with Valve's Proton project bundled with Steam on Linux. DXVK – An open source Vulkan based translation layer for Direct3D 9/10/11 which allows running 3D applications on Linux using Wine. It is used by Proton/Steam for Linux. DXVK is able to run a large number of modern Windows games under Linux. D9VK – A fork of DXVK for adding Direct3D 9 support, included with Steam/Proton on Linux. On December 16, 2019 D9VK was merged into DXVK. D8VK – A fork of DXVK for adding Direct3D 8 support on Linux. Gallium Nine – Gallium Nine makes it possible to run Direct3D 9 applications on Linux natively, i. e. without any calls translation which allows for a near native speed. It depends on Wine and Mesa.
vkd3d – vkd3d – это библиотека 3D-графики с открытым исходным кодом, построенная на основе Vulkan, которая позволяет запускать приложения Direct3D 12 поверх Vulkan. Она в основном используется проектом Wine и теперь включена в проект Proton от Valve, поставляемый вместе с Steam на Linux.
WineD3D – The Wine open source project has working implementations of the Direct3D APIs via translation to OpenGL. Wine's implementation can also be run on Windows under certain conditions. vkd3d – vkd3d is an open source 3D graphics library built on top of Vulkan which allows to run Direct3D 12 applications on top of Vulkan. It's primarily used by the Wine project, and is now included with Valve's Proton project bundled with Steam on Linux. DXVK – An open source Vulkan based translation layer for Direct3D 9/10/11 which allows running 3D applications on Linux using Wine. It is used by Proton/Steam for Linux. DXVK is able to run a large number of modern Windows games under Linux. D9VK – A fork of DXVK for adding Direct3D 9 support, included with Steam/Proton on Linux. On December 16, 2019 D9VK was merged into DXVK. D8VK – A fork of DXVK for adding Direct3D 8 support on Linux. Gallium Nine – Gallium Nine makes it possible to run Direct3D 9 applications on Linux natively, i. e. without any calls translation which allows for a near native speed. It depends on Wine and Mesa.
DXVK – Translation layer с открытым исходным кодом на основе Vulkan для Direct3D 9/10/11, позволяющий запускать 3D-приложения на Linux с использованием Wine. Используется Proton/Steam для Linux. DXVK способен запускать большое количество современных игр для Windows под Linux.
WineD3D – The Wine open source project has working implementations of the Direct3D APIs via translation to OpenGL. Wine's implementation can also be run on Windows under certain conditions. vkd3d – vkd3d is an open source 3D graphics library built on top of Vulkan which allows to run Direct3D 12 applications on top of Vulkan. It's primarily used by the Wine project, and is now included with Valve's Proton project bundled with Steam on Linux. DXVK – An open source Vulkan based translation layer for Direct3D 9/10/11 which allows running 3D applications on Linux using Wine. It is used by Proton/Steam for Linux. DXVK is able to run a large number of modern Windows games under Linux. D9VK – A fork of DXVK for adding Direct3D 9 support, included with Steam/Proton on Linux. On December 16, 2019 D9VK was merged into DXVK. D8VK – A fork of DXVK for adding Direct3D 8 support on Linux. Gallium Nine – Gallium Nine makes it possible to run Direct3D 9 applications on Linux natively, i. e. without any calls translation which allows for a near native speed. It depends on Wine and Mesa.
D9VK – Форк DXVK для добавления поддержки Direct3D 9, включенный в Steam/Proton на Linux. 16 декабря 2019 года D9VK был объединен с DXVK.
WineD3D – The Wine open source project has working implementations of the Direct3D APIs via translation to OpenGL. Wine's implementation can also be run on Windows under certain conditions. vkd3d – vkd3d is an open source 3D graphics library built on top of Vulkan which allows to run Direct3D 12 applications on top of Vulkan. It's primarily used by the Wine project, and is now included with Valve's Proton project bundled with Steam on Linux. DXVK – An open source Vulkan based translation layer for Direct3D 9/10/11 which allows running 3D applications on Linux using Wine. It is used by Proton/Steam for Linux. DXVK is able to run a large number of modern Windows games under Linux. D9VK – A fork of DXVK for adding Direct3D 9 support, included with Steam/Proton on Linux. On December 16, 2019 D9VK was merged into DXVK. D8VK – A fork of DXVK for adding Direct3D 8 support on Linux. Gallium Nine – Gallium Nine makes it possible to run Direct3D 9 applications on Linux natively, i. e. without any calls translation which allows for a near native speed. It depends on Wine and Mesa.
D8VK – Форк DXVK для добавления поддержки Direct3D 8 на Linux.
WineD3D – The Wine open source project has working implementations of the Direct3D APIs via translation to OpenGL. Wine's implementation can also be run on Windows under certain conditions. vkd3d – vkd3d is an open source 3D graphics library built on top of Vulkan which allows to run Direct3D 12 applications on top of Vulkan. It's primarily used by the Wine project, and is now included with Valve's Proton project bundled with Steam on Linux. DXVK – An open source Vulkan based translation layer for Direct3D 9/10/11 which allows running 3D applications on Linux using Wine. It is used by Proton/Steam for Linux. DXVK is able to run a large number of modern Windows games under Linux. D9VK – A fork of DXVK for adding Direct3D 9 support, included with Steam/Proton on Linux. On December 16, 2019 D9VK was merged into DXVK. D8VK – A fork of DXVK for adding Direct3D 8 support on Linux. Gallium Nine – Gallium Nine makes it possible to run Direct3D 9 applications on Linux natively, i. e. without any calls translation which allows for a near native speed. It depends on Wine and Mesa.
Gallium Nine – Gallium Nine позволяет запускать приложения Direct3D 9 на Linux нативно, то есть без трансляции вызовов, что обеспечивает почти нативную производительность. Требует Wine и Mesa.
WineD3D – The Wine open source project has working implementations of the Direct3D APIs via translation to OpenGL. Wine's implementation can also be run on Windows under certain conditions. vkd3d – vkd3d is an open source 3D graphics library built on top of Vulkan which allows to run Direct3D 12 applications on top of Vulkan. It's primarily used by the Wine project, and is now included with Valve's Proton project bundled with Steam on Linux. DXVK – An open source Vulkan based translation layer for Direct3D 9/10/11 which allows running 3D applications on Linux using Wine. It is used by Proton/Steam for Linux. DXVK is able to run a large number of modern Windows games under Linux. D9VK – A fork of DXVK for adding Direct3D 9 support, included with Steam/Proton on Linux. On December 16, 2019 D9VK was merged into DXVK. D8VK – A fork of DXVK for adding Direct3D 8 support on Linux. Gallium Nine – Gallium Nine makes it possible to run Direct3D 9 applications on Linux natively, i. e. without any calls translation which allows for a near native speed. It depends on Wine and Mesa.
ДСУТ
DXUT (также называемый базовым примером) — это слой, построенный на основе API Direct3D. Этот фреймворк разработан, чтобы помочь программистам тратить меньше времени на рутинные задачи, такие как создание окна, создание устройства, обработка сообщений Windows и обработка событий устройства. DXUT был удален из Windows SDK 8.0 и теперь распространяется в виде исходного кода через CodePlex.