Direct3D 11 (Direct3D 11)

Перейти к навигации Перейти к поиску

Direct3D 11 (D3D11) — компонент интерфейса программирования приложений (англ. API) DirectX 11, 11-я версия Direct3D, преемник Direct3D 10/10.1. Direct3D 11 обеспечивает функции для взаимодействия операционной системы и приложений с драйверами видеокарты. Эти функции не привязаны к следующей операционной системе в линейке Windows (Windows 7) и доступны в Windows Vista. Частично D3D11 работает на видеокартах уровня Direct3D 9-10.

Первые предварительные версии появились в ноябре 2008 года. Официальная финальная версия вышла 22 октября 2009 года в составе Windows 7. 28 октября 2009 года DirectX 11 стал официально доступен для Windows Vista и Windows Server 2008 посредством скачивания через Windows Update.[1]

Тесселяция[править | править код]

В D3D11 добавляется 3 дополнительных стадии конвейера визуализации, целью введения которых является эффективная тесселяция поверхностей.

Конвейер D3D11 включает три новых стадии между стадиями вершинного и геометрического шейдера. Две из них являются программируемыми (стадии оболочечного (hull shader) и domain шейдеров) и одна — конфигурируемая (стадия тесселяции).

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

Оболочечный шейдер вызывается для каждого патча. В качестве входных данных используются контрольные точки патча из вершинного шейдера. Оболочечный шейдер имеет два основных применения. Первое (опционально) — это конвертирование контрольных точек из одного представления в другое. Например, он позволяет реализовать метод, представленный в статье Approximating Catmull-Clark Subdivision Surfaces with Bicubic Patches. После этого шейдера контрольные точки пересылаются напрямую дальше, минуя тесселятор. Другое применение — вычисление подходящего параметра тесселяции, который затем передаётся на стадию тесселяции. Такой подход позволяет делать адаптивную тесселяцию, которая может быть использована в случае видозависимых уровней детализации (LOD). Параметр тесселяции определяется для каждой грани патча и варьируются в диапазоне от 2 до 64. Это означает, что каждая грань треугольного (или квадратного) патча может быть разбита на 2 (или максимум 64) грани.

Стадия тесселятора представлена фиксированным набором функции (хорошо конфигурируема), которые используют параметр тесселяции для подразбиения патча на несколько треугольников или квадов. Тесселятор не имеет доступа к контрольным точкам — все решения о разбиении принимаются на основе конфигурационных и тесселяционных параметров, передаваемых из оболочечного шейдера. Каждая вершина после стадии тесселяции передаётся в domain шейдер, причём передаются только координаты параметризации (parametrization coordinates).

Domain shader оперирует parametrization coordinates патча для каждой вершины раздельно, хотя имеется возможность получить доступ к трансформированным контрольным точкам для всего патча. Domain шейдер отправляет всю информацию о вершине (позицию, текстурные координаты, и т. п.) в геометрический шейдер (или на стадию клипирования, если геометрический шейдер не задан). По сути дела, он оценивает представление поверхности в каждой точке. На данной стадии может быть применён метод карт смещения (displacement mapping).

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

Direct3D 11 вводит новый тип шейдера — вычислительный шейдер (Compute Shader). Вычислительный шейдер вызывается как регулярный массив потоков. Потоки делятся на группы. Каждая группа имеет 32 Кб памяти, разделяемой между потоками группы. Таким образом потоки в группе могут обмениваться результатами, улучшая свою производительность. Также потоки могут производить чтения и записи с произвольным доступом к графическим ресурсам: текстурам, массивам вершин, рендер таргетам. Эти доступы к памяти неупорядочены, хотя синхронизация различных инструкций осуществляется, когда это действительно необходимо.

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

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

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

Многопоточная визуализация[править | править код]

D3D10 позволяет передавать команды визуализации только из одного потока (на данный момент существует специальный многопоточный режим, но из-за низкой производительности Майкрософт не рекомендует использовать его). Как известно, передача команд визуализации через Direct3D предполагает использование дополнительных вычислительных ресурсов CPU. Учитывая тенденцию увеличения числа ядер центрального процессора, вводится поддержка более продвинутой многопоточности, чтобы распределять эту работу между несколькими потоками, тем самым производя её более эффективно.

Direct3D 11 даёт возможность создавать дисплейные списки из нескольких потоков и выполнять их из главного потока визуализации. Кроме того, устройство, которое создаёт ресурсы, было вынесено из контекста, который передаёт команды визуализации. Это позволяет создавать ресурсы асинхронно. Отложенные контексты (Deferred Contexts) используются для создания дисплейных списков и прямой контекст (Immediate Context) для передачи команд визуализации на GPU, включая обработку дисплейных списков, созданных в отложенных контекстах.

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

Другие возможности[править | править код]

Поддержка динамической линковки шейдеров (по аналогии Cg). Это позволяет разделить написание и компиляцию шейдеров света и материалов. Позднее связывание производится при выставлении шейдера. Этот подход является решением проблемы комбинаторного взрыва в случае различных источников света и материалов (он и некоторые другие проблемы обсуждаются в секции 7.9 книги Real-Time Rendering, 3rd Edition)

Добавлены два новых формата сжатых текстур. BC6 поддерживает широкий динамический диапазон RGB текстуры, используя при этом 1 байт на каждый тексель (взамен 6 байт в случае 6-битных RGB вещественных текстуры). BC7 поддерживает узкий динамический диапазон RGB или RGBA текстур. Он также использует 1 байт на тексель (как DXT5/BC3), но предоставляет значительно лучшее качество по сравнению с форматами текстур D3D10. Оба новых формата используют несколько типов блоков — утилита для сжатия выбирает соответствующий тип блока на основе его содержания.

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

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

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

Direct3D 11 позволяет использовать текстуры, имеющие максимальный размер в диапазоне от 8K-16K текселей. Отметим, что 16K х 16K DXT1/BC1 текстура занимает 128MB — не так много игр будет использовать такие большие текстуры, но это может быть подходяще для методик наподобие мегатекстуры. В общем, теперь в D3D11 ресурс может иметь размер до 2 Гб.

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

На Gamefest 2008 также был представлен слайд с множеством других новшеств, детали которых не были пояснены:

  • Адресуемый потоковый вывод (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

DirectX 11 и Управляемый код[править | править код]

SlimDX и SharpDX поддерживают DirectX 11. XNA — нет

Игровые движки с поддержкой DirectX 11[править | править код]

См. также[править | править код]

Примечания[править | править код]

  1. Andrew Burnes. DirectX 11 Released For Windows Vista (англ.). Voodoo Extreme 3D (28 октября 2009). Дата обращения: 29 октября 2009. Архивировано 17 марта 2012 года.
  2. Battlefield Bad Company 2 с поддержкой DirectX 11. GameTech (16 апреля 2009). Дата обращения: 1 ноября 2009. Архивировано 17 марта 2012 года.

Ссылки[править | править код]