Direct3D — это интерфейс программирования графических приложений (API) для Microsoft Windows . Часть DirectX , Direct3D используется для рендеринга трехмерной графики в приложениях, где важна производительность, таких как игры. Direct3D использует аппаратное ускорение, если оно доступно на графической карте , что позволяет аппаратно ускорить весь конвейер 3D-рендеринга или даже только частичное ускорение. Direct3D предоставляет расширенные графические возможности аппаратного обеспечения 3D-графики, включая Z-буферизацию , [1] W-буферизацию, [2] буферизацию трафарета , пространственное сглаживание , альфа-смешивание , смешивание цветов, MIP-отображение , смешивание текстур, [3] [4] отсечение , отбраковку , атмосферные эффекты, отображение текстур с корректной перспективой , программируемые шейдеры HLSL [5] и эффекты. [6] Интеграция с другими технологиями DirectX позволяет Direct3D предоставлять такие функции, как видеомэппинг, аппаратный 3D-рендеринг в 2D- плоскостях наложения и даже спрайты , обеспечивая использование 2D- и 3D-графики в интерактивных медиасвязях.
Direct3D содержит множество команд для рендеринга 3D-графики ; однако, начиная с версии 8, Direct3D заменил фреймворк DirectDraw и также взял на себя ответственность за рендеринг 2D-графики . [7] Microsoft стремится постоянно обновлять Direct3D для поддержки новейших технологий, доступных на 3D-графических картах. Direct3D предлагает полную программную эмуляцию вершин , но не пиксельную программную эмуляцию для функций, недоступных в оборудовании. Например, если программное обеспечение, запрограммированное с использованием Direct3D, требует пиксельных шейдеров , а видеокарта на компьютере пользователя не поддерживает эту функцию, Direct3D не будет ее эмулировать, хотя он будет вычислять и рендерить полигоны и текстуры 3D-моделей, хотя и с обычно ухудшенным качеством и производительностью по сравнению с аппаратным эквивалентом. API включает в себя Reference Rasterizer (или устройство REF), которое эмулирует обычную графическую карту в программном обеспечении, хотя оно слишком медленно для большинства 3D-приложений реального времени и обычно используется только для отладки. Новый программный растеризатор реального времени WARP , разработанный для эмуляции полного набора функций Direct3D 10.1, включен в Windows 7 и Windows Vista Service Pack 2 с обновлением платформы; его производительность, как говорят, находится на одном уровне с 3D-картами начального уровня на многоядерных процессорах. [8]
Как часть DirectX , Direct3D доступен для Windows 95 и выше и является основой для API векторной графики на различных версиях консольных систем Xbox . Уровень совместимости Wine , свободное программное обеспечение для повторной реализации нескольких API Windows, включает реализацию Direct3D.
Главным конкурентом Direct3D является OpenGL от Khronos и его последователь Vulkan . Fahrenheit был попыткой Microsoft и SGI объединить OpenGL и Direct3D в 1990-х годах, но в конечном итоге был отменен.
В 1992 году Серван Кеонджян, Дуг Рабсон и Кейт Сикингс основали компанию RenderMorphics, которая разработала API 3D-графики под названием Reality Lab , который использовался в медицинской визуализации и программном обеспечении САПР. [15] Было выпущено две версии этого API. [16] Microsoft купила RenderMorphics в феврале 1995 года, привлекая своих сотрудников для реализации движка 3D-графики для Windows 95. [ 17] Первая версия Direct3D поставлялась в DirectX 2.0 (2 июня 1996 года) и DirectX 3.0 (26 сентября 1996 года).
Direct3D изначально реализовал « немедленный режим » 3D API и наложил на него « сохраненный режим » 3D API. [18] Оба типа API уже предлагались во втором выпуске Reality Lab до выпуска Direct3D. [16] Как и другие API DirectX, такие как DirectDraw , оба были основаны на COM . API сохраненного режима был API графа сцены , который получил небольшое распространение. Разработчики игр требовали более прямого контроля над действиями оборудования, чем мог обеспечить сохраненный режим Direct3D. Только две игры, которые продавались значительными тиражами, Lego Island и Lego Rock Raiders , были основаны на сохраненном режиме Direct3D, поэтому Microsoft не обновляла API сохраненного режима после DirectX 3.0.
Для DirectX 2.0 и 3.0 режим Direct3D immediately mode использовал модель программирования «буфера выполнения», которую Microsoft надеялась напрямую поддерживать поставщиками оборудования. Буферы выполнения предназначались для размещения в аппаратной памяти и анализа оборудованием для выполнения 3D-рендеринга. Однако в то время их считали крайне неудобными для программирования, что препятствовало принятию нового API и побудило Microsoft принять OpenGL в качестве официального API 3D-рендеринга для игр и приложений для рабочих станций. [19] (см. OpenGL против Direct3D)
Вместо того чтобы принять OpenGL в качестве игрового API, Microsoft решила продолжить совершенствование Direct3D не только для того, чтобы конкурировать с OpenGL, но и для того, чтобы более эффективно конкурировать с другими фирменными API, такими как Glide от 3dfx .
С самого начала немедленный режим также поддерживал мозаичный рендеринг Talisman с помощью методов BeginScene/EndScene интерфейса IDirect3DDevice.
Никаких существенных изменений в Direct3D для DirectX 4.0 не планировалось , выпуск которого был запланирован на конец 1996 года, а затем отменен. [20]
В декабре 1996 года команда в Редмонде взяла на себя разработку Direct3D Immediate Mode, в то время как лондонская команда RenderMorphics продолжила работу над Retained Mode. Команда в Редмонде добавила API DrawPrimitive, который устранил необходимость для приложений создавать буферы выполнения, сделав Direct3D более похожим на другие API рендеринга в немедленном режиме, такие как Glide и OpenGL . Первая бета-версия DrawPrimitive была выпущена в феврале 1997 года, [21] а финальная версия была выпущена с DirectX 5.0 в августе 1997 года. [22]
Помимо внедрения более простого в использовании API немедленного режима, DirectX 5.0 добавил метод SetRenderTarget, который позволил устройствам Direct3D записывать свой графический вывод на различные поверхности DirectDraw. [23]
DirectX 6.0 (выпущен в августе 1998 года) представил многочисленные функции для покрытия современного оборудования (такие как мультитекстурирование [24] и буферы трафаретов ), а также оптимизированные геометрические конвейеры для x87 , SSE и 3DNow! и опциональное управление текстурами для упрощения программирования. [25] Direct3D 6.0 также включал поддержку функций, которые были лицензированы Microsoft у определенных поставщиков оборудования для включения в API, в обмен на преимущество во времени выхода на рынок для поставщика лицензии. Поддержка сжатия текстур S3 была одной из таких функций, переименованной в DXTC для целей включения в API. Другой была запатентованная техника отображения рельефа TriTech . Microsoft включила эти функции в DirectX, а затем добавила их к требованиям, необходимым для драйверов, чтобы получить логотип Windows , чтобы поощрить широкое внедрение функций в оборудование других поставщиков.
Небольшое обновление DirectX 6.0 появилось в обновлении DirectX 6.1 в феврале 1999 года. Помимо добавления поддержки DirectMusic в первый раз, этот релиз улучшил поддержку расширений Intel Pentium III 3D. [26]
Конфиденциальная записка, отправленная в 1997 году [27], показывает, что Microsoft планировала объявить о полной поддержке Talisman в DirectX 6.0, но в итоге API был отменен ( подробности см. на странице Microsoft Talisman ).
DirectX 7.0 (выпущен в сентябре 1999 года) представил формат текстур .dds [28] и поддержку аппаратного ускорения преобразования и освещения [29] (впервые доступного на оборудовании ПК с GeForce 256 от Nvidia ), а также возможность выделения вершинных буферов в аппаратной памяти. Аппаратные вершинные буферы представляют собой первое существенное улучшение по сравнению с OpenGL в истории DirectX. Direct3D 7.0 также расширил поддержку DirectX для аппаратного мультитекстурирования и представляет собой вершину функций конвейера с фиксированными функциями мультитекстурирования: хотя он и мощный, его было настолько сложно программировать, что для раскрытия возможностей затенения графического оборудования требовалась новая модель программирования. Direct3D 7.0 также представил функции DXVA .
DirectX 8.0 (выпущен в ноябре 2000 года) представил программируемость в форме вершинных и пиксельных шейдеров , что позволило разработчикам писать код, не беспокоясь об излишнем состоянии оборудования. [30] Сложность программ шейдеров зависела от сложности задачи, а драйвер дисплея компилировал эти шейдеры в инструкции, которые могли быть поняты оборудованием. Direct3D 8.0 и его программируемые возможности шейдеров были первым серьезным отходом от фиксированной архитектуры функций в стиле OpenGL, где отрисовка управляется сложным конечным автоматом. Direct3D 8.0 также исключил DirectDraw как отдельный API. [31] [32] Direct3D включил в себя все оставшиеся вызовы API DirectDraw, все еще необходимые для разработки приложений, такие как Present(), функция, используемая для отображения результатов рендеринга.
Direct3D не считался удобным для пользователя, но начиная с версии DirectX 8.1 многие проблемы с удобством использования были решены. Direct3D 8 содержал множество мощных функций 3D-графики, таких как вершинные шейдеры , пиксельные шейдеры , туман , рельефное отображение и текстурное отображение .
Direct3D 9.0 [33] (выпущен в декабре 2002 г.) добавил новую версию языка шейдеров высокого уровня [34] [35] поддержку форматов текстур с плавающей точкой, множественных целей рендеринга (MRT), [36] многоэлементных текстур, [37] поиска текстур в вершинном шейдере и методах буфера трафарета. [38]
Direct3D 9Ex [39] (ранее имевший версию 9.0L («L» означает Longhorn, кодовое название Windows Vista)), расширение, доступное только в Windows Vista, 7, 8, 8.1, 10 и 11, позволяет использовать преимущества, предлагаемые моделью драйвера дисплея Windows Vista (WDDM), и используется для Windows Aero . [40] Direct3D 9Ex в сочетании с драйверами WDDM класса DirectX 9 позволяет виртуализировать графическую память и выгружать ее в системную память, позволяет прерывать и планировать графические операции и позволяет совместно использовать поверхности DirectX между процессами. [41] Direct3D 9Ex ранее был известен как версия 1.0 Windows Graphics Foundation (WGF).
Улучшения Direct3D 9Ex — приложения Win32
Windows Vista включает в себя крупное обновление API Direct3D. Первоначально называвшийся WGF 2.0 (Windows Graphics Foundation 2.0), затем DirectX 10 и DirectX Next, Direct3D 10 [42] имеет обновленную модель шейдера 4.0 и опциональную прерываемость для программ шейдеров. [41] В этой модели шейдеры по-прежнему состоят из фиксированных стадий, как и в предыдущих версиях, но все стадии поддерживают почти унифицированный интерфейс, а также унифицированную парадигму доступа для ресурсов, таких как текстуры и константы шейдеров. Сам язык был расширен, чтобы стать более выразительным, включая целочисленные операции, значительно увеличенное количество инструкций и больше языковых конструкций, подобных C. В дополнение к ранее доступным стадиям вершинного и пиксельного шейдера , API включает стадию геометрического шейдера , которая разрушает старую модель одной вершины на входе/одной вершины на выходе, чтобы позволить генерировать геометрию изнутри шейдера, таким образом позволяя генерировать сложную геометрию полностью графическим оборудованием.
Windows XP и более ранние версии не поддерживаются DirectX 10.0 и выше. Кроме того, Direct3D 10 прекратил поддержку API сохраненного режима, который был частью Direct3D с самого начала, что сделало Windows Vista несовместимой с 3D-играми, которые использовали API сохраненного режима в качестве своего движка рендеринга . [43]
В отличие от предыдущих версий API, Direct3D 10 больше не использует «биты возможностей» (или «caps») для указания того, какие функции поддерживаются на данном графическом устройстве. Вместо этого он определяет минимальный стандарт аппаратных возможностей, которые должны поддерживаться для системы отображения, чтобы быть «совместимой с 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 . DirectX 10 SDK стал доступен в феврале 2007 года. [44]
Аппаратное обеспечение уровня Direct3D 10.0 должно поддерживать следующие функции: возможность обработки целых примитивов на новом этапе геометрического шейдера, возможность вывода сгенерированных конвейером вершинных данных в память с использованием этапа потокового вывода, поддержка мультисэмплированного альфа-покрытия, обратное считывание глубинной/трафаретной поверхности или мультисэмплированного ресурса после того, как он больше не привязан к цели рендеринга, полная интеграция с HLSL — все шейдеры Direct3D 10 написаны на HLSL и реализованы с ядром общего шейдера, целочисленные и побитовые шейдерные операции, организация состояния конвейера в 5 неизменяемых объектов состояния, организация констант шейдера в константные буферы, увеличенное количество целей рендеринга, текстур и сэмплеров, отсутствие ограничения на длину шейдера, новые типы ресурсов и форматы ресурсов, [45] многоуровневые слои среды выполнения/API, [46] возможность выполнять замену и настройку материалов для каждого примитива с помощью геометрического шейдера, повышенное обобщение доступа к ресурсам с помощью представления, удалены устаревшие биты возможностей оборудования (caps).
Direct3D 10.1 [52] был анонсирован Microsoft вскоре после выпуска Direct3D 10 в качестве небольшого обновления. Спецификация была завершена с выпуском DirectX SDK в ноябре 2007 года, а среда выполнения была поставлена с Windows Vista SP1 , который доступен с середины марта 2008 года.
Direct3D 10.1 устанавливает несколько дополнительных стандартов качества изображения для поставщиков графики и дает разработчикам больше контроля над качеством изображения. [53] [54] Функции включают более точное управление сглаживанием (как мультисэмплинг, так и суперсэмплинг с затенением на выборку и контролем приложения над положением выборки) и большую гибкость некоторых существующих функций (массивы кубических карт и независимые режимы смешивания). Аппаратное обеспечение уровня Direct3D 10.1 должно поддерживать следующие функции: Мультисэмплинг был улучшен для обобщения прозрачности на основе покрытия и повышения эффективности мультисэмплингового рендеринга с многопроходным рендерингом, улучшенное поведение отбраковки — грани нулевой области автоматически отбраковываются; это влияет только на рендеринг каркаса, независимые режимы смешивания для каждой цели рендеринга, новое выполнение пиксельного шейдера с частотой выборки с примитивной растеризацией, увеличенная пропускная способность этапа конвейера, как цветные, так и глубинные/трафаретные поверхности MSAA теперь могут использоваться с CopyResource как в качестве источника или назначения, MultisampleEnable влияет только на растеризацию линий (точки и треугольники не затрагиваются) и используется для выбора алгоритма рисования линий. Это означает, что некоторые растеризации multisample из Direct3D 10 больше не поддерживаются, Выборка текстур — инструкции sample_c и sample_c_lz определены для работы как с Texture2DArrays, так и с TextureCubeArrays, используют член Location (альфа-компонент) для указания индекса массива, поддержка TextureCubeArrays.
В отличие от Direct3D 10, который строго требовал аппаратных средств и интерфейсов драйверов класса Direct3D 10, среда выполнения Direct3D 10.1 может работать на оборудовании Direct3D 10.0, используя концепцию «уровней функций» [56] [57] [58], но новые функции поддерживаются исключительно новым оборудованием, которое предоставляет уровень функций 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 [59] был выпущен как часть Windows 7. Он был представлен на Gamefest 2008 22 июля 2008 года и продемонстрирован на технической конференции Nvision 08 26 августа 2008 года. [60] [61] Техническая предварительная версия Direct3D 11 была включена в выпуск DirectX SDK от ноября 2008 года. [62] AMD представила рабочее оборудование DirectX11 на Computex 3 июня 2009 года, запустив несколько образцов DirectX 11 SDK. [63]
Среда выполнения Direct3D 11 может работать на оборудовании и драйверах класса Direct3D 9 и 10.x , используя концепцию «уровней функций», расширяющую функциональность, впервые представленную в среде выполнения Direct3D 10.1. [56] [64] [65] Уровни функций позволяют разработчикам унифицировать конвейер рендеринга в API Direct3D 11 и использовать улучшения API, такие как улучшенное управление ресурсами и многопоточность, даже на картах начального уровня, хотя расширенные функции, такие как новые модели шейдеров и этапы рендеринга, будут доступны только на оборудовании более высокого уровня. [64] [66] Существует три профиля «10 уровня 9», которые инкапсулируют различные возможности популярных карт DirectX 9.0a, и Direct3D 10, 10.1 и 11 имеют отдельный уровень функций; каждый верхний уровень является строгим надмножеством нижнего уровня. [67]
Тесселяция ранее рассматривалась для Direct3D 10, но позже была заброшена. Такие графические процессоры, как Radeon R600, оснащены движком тесселяции, который может использоваться с Direct3D 9/10/10.1 [68] [69] [70] и OpenGL, [71], но он несовместим с Direct3D 11 (согласно Microsoft). Старое графическое оборудование, такое как Radeon 8xxx, GeForce 3/4, поддерживало другую форму тесселяции (RT-патчи, N-патчи), но эти технологии никогда не находили существенного применения. Таким образом, их поддержка была прекращена в более новом оборудовании.
Microsoft также намекнула на другие функции, такие как прозрачность , не зависящая от порядка, которая никогда не была представлена API Direct3D, но поддерживалась почти прозрачно ранним оборудованием Direct3D, таким как линейка чипов PowerVR компании Videologic.
Возможности Direct3D 11.0 включают: поддержку Shader Model 5.0, динамическое связывание шейдеров, адресуемые ресурсы, дополнительные типы ресурсов, [72] подпрограммы, создание экземпляров геометрии, покрытие в качестве входных данных пиксельного шейдера, программируемая интерполяция входных данных, новые форматы сжатия текстур (1 новый формат LDR и 1 новый формат HDR), текстурные зажимы для ограничения предварительной загрузки WDDM, требование 8-битной точности субтекселя и суб-MIP при фильтрации текстур, ограничения текстур 16K, Gather4 (поддержка многокомпонентных текстур, поддержка программируемых смещений), DrawIndirect, консервативный oDepth, смещение глубины, [73] [74] адресуемый потоковый вывод, зажим MIP-карты для каждого ресурса, области просмотра с плавающей точкой, инструкции преобразования шейдеров, улучшенная многопоточность.
Другими примечательными особенностями являются добавление двух новых алгоритмов сжатия текстур для более эффективной упаковки высококачественных и HDR/альфа-текстур, а также увеличенный кэш текстур .
Впервые представленная в версии Release Candidate , Windows 7 интегрирует первую выпущенную поддержку Direct3D 11. Обновление платформы для Windows Vista включает полнофункциональную среду выполнения Direct3D 11 и обновление DXGI 1.1, а также другие связанные компоненты из Windows 7, такие как WARP , Direct2D , DirectWrite и WIC . [78] [79]
Direct3D 11.1 [80] [81] — это обновление API, поставляемое с Windows 8. [ 82] [83] Среда выполнения Direct3D в Windows 8 включает DXGI 1.2 [84] и требует новых драйверов устройств WDDM 1.2 [85] . [86] Предварительная версия Windows SDK для Windows 8 Developer Preview была выпущена 13 сентября 2011 года.
Новый API включает трассировку шейдеров и улучшения компилятора HLSL, поддержку скалярных типов данных HLSL с минимальной точностью, [87] UAV (Unordered Access Views) на каждом этапе конвейера, целевую независимую растеризацию (TIR), возможность сопоставления SRV динамических буферов с NO_OVERWRITE, шейдерную обработку видеоресурсов, возможность использования логических операций в цели рендеринга, возможность привязки поддиапазона буфера констант к шейдеру и его извлечения, возможность создания буферов констант большего размера, чем может получить шейдер, возможность отбрасывать ресурсы и представления ресурсов, возможность изменять подресурсы с новыми параметрами копирования, возможность принудительного подсчета выборок для создания состояния растеризатора, возможность очистки всего или части представления ресурсов, возможность использования Direct3D в процессах сеанса 0, возможность указания пользовательских плоскостей отсечения в HLSL на уровне объектов 9 и выше, поддержка буфера теней на уровне объектов 9, поддержка воспроизведения видео, расширенная поддержка общих ресурсов Texture2D и «на лету» замена между Контексты и уровни функций Direct3D 10 и 11. Direct3D 11.1 включает новый уровень функций 11_1, который вносит незначительные обновления в язык шейдеров, такие как более крупные буферы констант и дополнительные инструкции двойной точности, а также улучшенные режимы смешивания и обязательную поддержку 16-битных цветовых форматов для повышения производительности графических процессоров начального уровня, таких как Intel HD Graphics . [86] [88] WARP был обновлен для поддержки уровня функций 11_1.
Обновление платформы для Windows 7 включает ограниченный набор функций из Direct3D 11.1, хотя компоненты, зависящие от WDDM 1.2, такие как уровень функций 11_1 и связанные с ним API или четырехъядерная буферизация для стереоскопического рендеринга, отсутствуют. [89] [90]
Direct3D 11.2 [91] [92] [93] поставлялся с Windows 8.1 . [94] [95] Новые аппаратные функции требуют DXGI 1.3 [96] с драйверами WDDM 1.3 [97] и включают в себя модификацию и связывание шейдеров во время выполнения, граф связывания функций (FLG), встроенный компилятор HLSL , возможность аннотировать графические команды. [98] Уровни функций 11_0 и 11_1 вводят дополнительную поддержку мозаичных ресурсов с уровнем шейдера детализации зажима (Tier2). [99] Последняя функция эффективно обеспечивает управление таблицами страниц оборудования , присутствующими во многих современных графических процессорах. [100] WARP был обновлен для полной поддержки новых функций. [94] [101] Однако нет уровня функций 11_2; новые функции распределены по существующим уровням функций. Те, которые зависят от оборудования, можно проверить индивидуально с помощью CheckFeatureSupport
. [95] [102] Некоторые из «новых» функций в Direct3D 11.2 на самом деле раскрывают некоторые старые аппаратные функции более детально; например, D3D11_FEATURE_D3D9_SIMPLE_INSTANCING_SUPPORT
раскрывает частичную поддержку создания экземпляров на уровне функций 9_1 и 9_2, в противном случае полностью поддерживаемую с уровня функций 9_3 и далее. [103]
Direct3D 11.X
Direct3D 11.X — это надстройка DirectX 11.2, работающая на Xbox One . [104] [105] Она включает в себя некоторые функции, такие как пакеты отрисовки, которые позже были анонсированы как часть DirectX 12. [106]
Direct3D 11.3 [107] был выпущен в июле 2015 года вместе с Windows 10; он включает в себя незначительные функции рендеринга из Direct3D 12, сохраняя при этом общую структуру API Direct3D 11.x. [108] [109] [110] Direct3D 11.3 вводит необязательное значение ссылки на трафарет, заданное шейдером, загрузки видов с неупорядоченным доступом, упорядоченные виды растеризатора (ROV), необязательный стандартный Swizzle, необязательное отображение текстуры по умолчанию, консервативную растеризацию (из трех уровней), [111] необязательную поддержку унифицированного доступа к памяти (UMA) и дополнительные мозаичные ресурсы (уровень 2) (объемные мозаичные ресурсы). [112]
Direct3D 12 [114] допускает более низкий уровень аппаратной абстракции, чем более ранние версии, что позволяет будущим приложениям значительно улучшить многопоточное масштабирование и снизить загрузку ЦП. Это достигается за счет лучшего соответствия уровня абстракции Direct3D с базовым оборудованием с помощью новых функций, таких как Indirect Drawing, дескрипторные таблицы, краткие объекты состояния конвейера и пакеты вызовов отрисовки. Сокращение накладных расходов драйвера является главной привлекательной чертой Direct3D 12, аналогично Mantle от AMD . [114] По словам его ведущего разработчика Макса МакМаллена, главная цель Direct3D 12 — достичь «эффективности на уровне консоли» и улучшенного параллелизма ЦП. [115] [116] [117]
Хотя Nvidia объявила о широкой поддержке Direct3D 12, они также были несколько сдержаны в отношении универсальной привлекательности нового API, отметив, что, хотя разработчики игровых движков могут быть в восторге от прямого управления ресурсами GPU из кода своего приложения, «многие [другие] люди не были бы» рады делать это. [118]
Некоторые новые аппаратные функции также присутствуют в Direct3D 12, [110] [119] [120], включая Shader Model 5.1, [121] Volume Tiled Resources (Tier 2), [121] Shader Specified Stencil Reference Value, Typed UAV Load, Conservative Rasterization (Tier 1), улучшенные столкновения и отбраковка с Conservative Rasterization, Rasterizer Ordered Views (ROV), Standard Swizzles, Default Texture Mapping, Swap Chains, swizzled resources и compress resources , [122] дополнительные режимы смешивания , [123] программируемое смешивание и эффективная прозрачность, независимая от порядка (OIT), с упорядоченным по пикселям UAV. [124]
Объекты состояния конвейера (PSO) [125] произошли от Direct3D 11, и новые краткие состояния конвейера означают, что процесс был упрощен. DirectX 11 предложил гибкость в том, как его состояния могут быть изменены в ущерб производительности. Упрощение процесса и унификация конвейеров (например, состояний пиксельных шейдеров) привели к более оптимизированному процессу, значительно сократив накладные расходы и позволив графической карте делать больше вызовов для каждого кадра. После создания PSO становится неизменяемым. [126]
Корневые сигнатуры вводят конфигурации для связывания списков команд с ресурсами, необходимыми шейдерам. Они определяют структуру ресурсов, которые будут использовать шейдеры, и указывают, какие ресурсы будут привязаны к конвейеру. Список графических команд имеет как графическую, так и вычислительную корневую сигнатуру, в то время как список вычислительных команд будет иметь только вычислительную корневую сигнатуру. Эти корневые сигнатуры полностью независимы друг от друга. Хотя корневая сигнатура определяет типы данных для использования шейдерами, она не определяет и не отображает фактическую память или данные. [127]
Корневые параметры — это один из типов записи в корневой сигнатуре. Фактические значения корневых параметров, которые изменяются во время выполнения, называются корневыми аргументами. Это данные, которые считывают шейдеры. [127]
В Direct3D 11 команды отправляются от CPU к GPU по одной, и GPU последовательно обрабатывает эти команды. Это означает, что команды являются узким местом из-за скорости, с которой CPU может отправлять эти команды линейно. В DirectX 12 эти команды отправляются в виде списков команд, содержащих всю необходимую информацию в одном пакете. Затем GPU способен вычислять и выполнять эту команду в одном процессе, не дожидаясь какой-либо дополнительной информации от CPU.
В этих списках команд есть пакеты. Если раньше команды просто брались, использовались и забывались графическим процессором, то пакеты могут использоваться повторно. Это снижает нагрузку на графический процессор и означает, что повторяющиеся активы могут использоваться гораздо быстрее.
Хотя привязка ресурсов в Direct3D 11 в настоящее время довольно удобна для разработчиков, ее неэффективность означает, что несколько современных аппаратных возможностей используются крайне недостаточно. Когда игровому движку требовались ресурсы в DX11, ему приходилось каждый раз рисовать данные с нуля, что означало повторные процессы и ненужное использование. В Direct3D 12 кучи дескрипторов и таблицы означают, что наиболее часто используемые ресурсы могут быть выделены разработчиками в таблицах, к которым графический процессор может быстро и легко получить доступ. Это может способствовать повышению производительности по сравнению с Direct3D 11 на эквивалентном оборудовании, но также влечет за собой больше работы для разработчика.
Динамические кучи также являются функцией Direct3D 12. [128]
Direct3D 12 имеет явную поддержку нескольких адаптеров, что позволяет явно контролировать системы конфигурации нескольких графических процессоров. Такие конфигурации могут быть построены с графическим адаптером как одного и того же поставщика оборудования, так и разных поставщиков оборудования вместе. [129]
Экспериментальная поддержка D3D 12 для Windows 7 SP1 была выпущена Microsoft в 2019 году через специальный пакет NuGet. [130] [131] [132]
Direct3D — компонент подсистемы Microsoft DirectX API. Цель Direct3D — абстрагировать связь между графическим приложением и драйверами графического оборудования. Он представлен как тонкий абстрактный слой на уровне, сопоставимом с GDI (см. прилагаемую диаграмму). Direct3D содержит множество функций, которых нет в GDI.
Direct3D — это API графики режима Immediate . Он предоставляет низкоуровневый интерфейс для каждой 3D-функции видеокарты ( преобразования, обрезка, освещение , материалы , текстуры , буферизация глубины и т. д.). Когда-то он имел компонент режима Retained более высокого уровня , который теперь официально прекращен.
Direct3D immediately mode представляет три основные абстракции: устройства , ресурсы и цепочки обмена (см. прилагаемую схему). Устройства отвечают за рендеринг 3D-сцены. Они предоставляют интерфейс с различными возможностями рендеринга. Например, моноустройство обеспечивает черно-белый рендеринг, а RGB- устройство — цветной. Существует четыре типа устройств:
Каждое устройство содержит по крайней мере одну цепочку обмена . Цепочка обмена состоит из одной или нескольких поверхностей заднего буфера . Рендеринг происходит в заднем буфере .
Более того, устройства содержат набор ресурсов ; конкретные данные, используемые во время рендеринга. Каждый ресурс имеет четыре атрибута:
Direct3D реализует два режима отображения:
Microsoft Direct3D 11 API определяет процесс преобразования группы вершин, текстур, буферов и состояния в изображение на экране. Этот процесс описывается как конвейер рендеринга с несколькими отдельными этапами. Различные этапы конвейера Direct3D 11: [143]
Этапы конвейера, показанные круглым ящиком, полностью программируемы. Приложение предоставляет шейдерную программу, которая описывает точные операции, которые должны быть выполнены для этого этапа. Многие этапы являются необязательными и могут быть полностью отключены.
В Direct3D 5–9, когда новые версии API вводили поддержку новых аппаратных возможностей, большинство из них были необязательными — каждый поставщик графики поддерживал собственный набор поддерживаемых функций в дополнение к базовым требуемым функциям. Поддержка отдельных функций должна была определяться с помощью «битов возможностей» или «caps», что делало программирование графики для разных поставщиков сложной задачей.
Direct3D 10 представил значительно упрощенный набор обязательных требований к оборудованию, основанный на самых популярных возможностях Direct3D 9, которым должны были соответствовать все поддерживающие видеокарты, с несколькими дополнительными возможностями для поддерживаемых форматов текстур и операций.
Direct3D 10.1 добавил несколько новых обязательных требований к оборудованию, и для сохранения совместимости с оборудованием и драйверами 10.0 эти функции были инкапсулированы в два набора, называемых «уровнями функций», при этом уровень 10.1 образовывал надмножество уровня 10.0. Поскольку Direct3D 11.0, 11.1 и 12 добавляли поддержку нового оборудования, новые обязательные возможности были дополнительно сгруппированы в верхних уровнях функций. [56]
Direct3D 11 также представил «10level9», подмножество API Direct3D 10 с тремя уровнями функций, инкапсулирующими различные карты Direct3D 9 с драйверами WDDM , а Direct3D 11.1 вновь представил несколько дополнительных функций для всех уровней, [155] которые были расширены в Direct3D 11.2 и более поздних версиях.
Такой подход позволяет разработчикам унифицировать конвейер рендеринга и использовать одну версию API как на новом, так и на старом оборудовании, используя преимущества улучшений производительности и удобства использования в новой среде выполнения. [60]
Новые уровни функций вводятся с обновленными версиями API и обычно включают в себя:
Каждый верхний уровень представляет собой строгое надмножество нижнего уровня, с несколькими новыми или ранее необязательными функциями, которые перемещаются в основную функциональность на верхнем уровне. [67] Более продвинутые функции в крупной редакции API Direct3D, такие как новые модели шейдеров и этапы рендеринга, доступны только на оборудовании верхнего уровня. [65] [66]
Существуют отдельные возможности для указания поддержки определенных операций с текстурами и форматов ресурсов; они указываются для каждого формата текстуры с помощью комбинации флагов возможностей. [156] [157]
Уровни функций используют в качестве разделителя подчеркивание (например, «12_1»), тогда как версии API/среды выполнения используют точку (например, «Direct3D 11.4»).
В Direct3D 11.4 для Windows 10 существует девять уровней функций, предоставляемых D3D_FEATURE_LEVEL
структурой; уровни 9_1, 9_2 и 9_3 (совместно известные как Direct3D 10 Level 9 ) повторно инкапсулируют различные функции популярных карт Direct3D 9, уровни 10_0, 10_1 относятся к соответствующим устаревшим версиям Direct3D 10, [65] 11_0 и 11_1 отражают функции, представленные в API и средах выполнения Direct3D 11 и Direct3D 11.1, в то время как уровни 12_0 и 12_1 соответствуют новым уровням функций, представленным в API Direct3D 12.
Direct3D 12 для Windows 10 требует графического оборудования, соответствующего уровням функций 11_0 и 11_1, которые поддерживают трансляции адресов виртуальной памяти и требуют драйверов WDDM 2.0. Существует два новых уровня функций, 12_0 и 12_1, которые включают некоторые новые функции, представленные Direct3D 12, которые являются необязательными на уровнях 11_0 и 11_1. [158] Некоторые ранее необязательные функции перестраиваются в качестве базовых на уровнях 11_0 и 11_1. Shader Model 6.0 был выпущен с Windows 10 Creators Update и требует Windows 10 Anniversary Update, драйверов WDDM 2.1.
Direct3D 12 представляет обновленную модель привязки ресурсов, которая позволяет явно контролировать память. Абстрактные объекты «представления ресурсов» [160] теперь представлены дескрипторами ресурсов, которые выделяются с использованием куч памяти и таблиц. [161] Уровни привязки ресурсов определяют максимальное количество ресурсов, к которым можно обратиться с помощью CBV (представление постоянного буфера), SRV (представление ресурса шейдера) и UAV (представление неупорядоченного доступа), а также блоков сэмплера текстур. Аппаратное обеспечение уровня 3 допускает полностью несвязанные ресурсы, ограниченные только размером кучи дескриптора, в то время как оборудование уровня 1 и уровня 2 накладывает некоторые ограничения на количество дескрипторов («представлений»), которые могут использоваться одновременно. [162] [163]
Модель драйвера WDDM в Windows Vista и выше поддерживает произвольно большое количество контекстов выполнения (или потоков) в оборудовании или программном обеспечении. Windows XP поддерживала только многозадачный доступ к Direct3D, где отдельные приложения могли выполняться в разных окнах и ускоряться аппаратно, а ОС имела ограниченный контроль над тем, что мог делать графический процессор, а драйвер мог произвольно переключать потоки выполнения.
Возможность выполнения среды выполнения в многопоточном режиме была введена в среду выполнения Direct3D 11. Каждый контекст выполнения представлен с представлением ресурсов графического процессора. Контексты выполнения защищены друг от друга, однако мошенническое или плохо написанное приложение может взять под контроль выполнение в драйвере пользовательского режима и потенциально может получить доступ к данным из другого процесса в памяти графического процессора, отправив измененные команды. Хотя приложение защищено от доступа другого приложения, хорошо написанное приложение все равно должно защищать себя от сбоев и потери устройства, вызванных другими приложениями.
Операционная система управляет потоками самостоятельно, позволяя оборудованию переключаться с одного потока на другой при необходимости, а также управляет памятью и подкачкой страниц (в системную память и на диск) с помощью интегрированного управления памятью ядра ОС.
Более детальное переключение контекста, то есть возможность переключать два потока выполнения на уровне инструкций шейдера вместо уровня отдельной команды или даже пакета команд, было введено в WDDM/DXGI 1.2, который поставлялся с Windows 8. [86] Это решает потенциальную проблему планирования, когда приложение будет иметь очень долгое выполнение одной команды/пакета команд и должно быть завершено сторожевым таймером ОС. [164]
WDDM 2.0 и DirectX 12 были переработаны для обеспечения полностью многопоточных вызовов отрисовки. Это было достигнуто путем создания всех ресурсов неизменяемыми (т. е. только для чтения), сериализации состояний отрисовки и использования пакетов вызовов отрисовки. Это позволяет избежать сложного управления ресурсами в драйвере режима ядра, делая возможными множественные повторные вызовы драйвера режима пользователя через параллельные контексты выполнения, предоставляемые отдельными потоками отрисовки в одном приложении.
Direct3D Mobile является производным от Direct3D, но имеет меньший объем памяти . Windows CE обеспечивает поддержку Direct3D Mobile. [165]
Существуют следующие альтернативные реализации API Direct3D. Они полезны для платформ, отличных от Windows, и для оборудования без поддержки некоторых версий DX:
Direct3D поставляется с D3DX, библиотекой инструментов, предназначенных для выполнения общих математических вычислений над векторами , матрицами и цветами, вычисления матриц взгляда и проекции , сплайн-интерполяции и нескольких более сложных задач, таких как компиляция или сборка шейдеров, используемых для программирования 3D-графики, сжатого хранилища скелетной анимации и стеков матриц. Существует несколько функций, которые обеспечивают сложные операции над 3D- сетками , такие как вычисление касательного пространства, упрощение сетки, предварительно вычисленная передача излучения , оптимизация для удобства кэширования вершин и полосатости, а также генераторы для 3D-текстовых сеток. 2D-функции включают классы для рисования линий экранного пространства, текстовых и спрайтовых систем частиц . Пространственные функции включают различные процедуры пересечения, преобразование из/в барицентрические координаты и генераторы ограничивающих рамок /сфер. D3DX предоставляется как динамическая библиотека (DLL). D3DX устарел с Windows 8 и более поздних версий и не может использоваться в приложениях Магазина Windows. [180]
Некоторые функции, представленные в предыдущих версиях D3DX, были удалены в Direct3D 11 и теперь предоставляются в виде отдельных источников: [181]
DXUT (также называемый образцом фреймворка) — это слой, построенный поверх Direct3D API. Фреймворк разработан, чтобы помочь программисту тратить меньше времени на рутинные задачи, такие как создание окна, создание устройства, обработка сообщений Windows и обработка событий устройства. DXUT был удален с Windows SDK 8.0 и теперь распространяется как исходный код через CodePlex. [189]
{{cite web}}
: CS1 maint: bot: original URL status unknown (link){{cite web}}
: CS1 maint: unfit URL (link)и самой важной из новых функций Maxwell 2 является включение полной совместимости с Direct3D 11.2/11.3.
{{cite web}}
: CS1 maint: archived copy as title (link)