Тесселяция directx 11 что это
The Direct3D 11 runtime supports three new stages that implement tessellation, which converts low-detail subdivision surfaces into higher-detail primitives on the GPU. Tessellation tiles (or breaks up) high-order surfaces into suitable structures for rendering.
By implementing tessellation in hardware, a graphics pipeline can evaluate lower detail (lower polygon count) models and render in higher detail. While software tessellation can be done, tessellation implemented by hardware can generate an incredible amount of visual detail (including support for displacement mapping) without adding the visual detail to the model sizes and paralyzing refresh rates.
Содержание
Tessellation Benefits
- Saves lots of memory and bandwidth, which allows an application to render higher detailed surfaces from low-resolution models. The tessellation technique implemented in the Direct3D 11 pipeline also supports displacement mapping, which can produce stunning amounts of surface detail.
- Supports scalable-rendering techniques, such as continuous or view dependent levels-of-detail which can be calculated on the fly.
- Improves performance by performing expensive computations at lower frequency (doing calculations on a lower-detail model). This could include blending calculations using blend shapes or morph targets for realistic animation or physics calculations for collision detection or soft body dynamics.
The Direct3D 11 pipeline implements tessellation in hardware, which off-loads the work from the CPU to the GPU. This can lead to very large performance improvements if an application implements large numbers of morph targets and/or more sophisticated skinning/deformation models. To access the new tessellation features, you must learn about some new pipeline stages.
Многопоточность
Многие графические приложения привязаны к ЦП из-за дорогостоящих действий, таких как обход графа сцены, сортировка объектов и моделирование физики. Поскольку многоядерные системы становятся все более доступными, Direct3D 11 улучшила поддержку многопоточности, чтобы обеспечить эффективное взаимодействие между несколькими потоками ЦП и ГРАФИЧЕСКИми API D3D11.
Direct3D 11 позволяет использовать следующие функции для поддержки многопоточности:
- Теперь параллельные объекты создаются в отдельных потоках. Создание функций точек входа, которые создают объекты, свободные потоки, позволяют нескольким потокам одновременно создавать объекты. Например, теперь приложение может скомпилировать шейдер или загрузить текстуру в один поток во время отрисовки на другой.
- Списки команд можно создавать в нескольких потоках. Список команд представляет собой записанную последовательность графических команд. С помощью Direct3D 11 можно создавать списки команд в нескольких потоках ЦП, что позволяет выполнять параллельный обход базы данных сцены или физической обработки в нескольких потоках. Это освобождает основной поток отрисовки для отправки буферов команд на оборудование.
Domain-Shader Stage
A domain shader calculates the vertex position of a subdivided point in the output patch. A domain shader is run once per tessellator stage output point and has read-only access to the tessellator stage output UV coordinates, the hull shader output patch, and the hull shader output patch constants, as the following diagram shows.
Properties of the domain shader include:
- A domain shader is invoked once per output coordinate from the tessellator stage.
- A domain shader consumes output control points from the hull-shader stage.
- A domain shader outputs the position of a vertex.
- Inputs are the hull shader outputs including control points, patch constant data and tessellation factors. The tessellation factors can include the values used by the fixed function tessellator as well as the raw values (before rounding by integer tessellation, for example), which facilitates geomorphing, for example.
After the domain shader completes, tessellation is finished and pipeline data continues to the next pipeline stage (geometry shader, pixel shader etc). A geometry shader that expects primitives with adjacency (for example, 6 vertices per triangle) is not valid when tessellation is active (this results in undefined behavior, which the debug layer will complain about).
Here is an example of a domain shader:
Другие возможности [ ]
Поддержка динамической линковки шейдеров (по аналогии 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 также был представлен слайд с множеством других новшеств, детали которых не были пояснены:
Руководство по программированию содержит сведения о том, как использовать программируемый конвейер Direct3D 11 для создания трехмерной графики в реальном времени для игр, а также для научных и классических приложений.
Шейдер вычислений
Шейдер вычислений — это программируемый шейдер, предназначенный для параллельной обработки данных общего назначения. Другими словами, вычислительные шейдеры позволяют использовать GPU в качестве параллельного процессора общего назначения. Шейдер вычислений аналогичен другим программируемым шейдерам конвейера (например, вершина, пиксель, геометрия) так, как он обращается к входным и выходным данным. Технология шейдера вычислений также известна как технология DirectCompute. Шейдер вычислений интегрирован в Direct3D и доступен через устройство Direct3D. Он может напрямую совместно использовать ресурсы памяти с графическими шейдерами с помощью устройства Direct3D. Однако он не связан напрямую с другими этапами шейдера.
Шейдер вычислений предназначен для приложений массового рынка, которые выполняют вычисления с интерактивными тарифами, когда стоимость перехода между API (и связанным с ним стеком программного обеспечения) и ЦП будет потреблять слишком много накладных расходов.
Шейдер вычислений имеет собственный набор состояний. Вычислительная шейдер не обязательно имеет принудительное сопоставление 1–1 с входными записями (например, вершинным шейдером) или выходными записями (например, пиксельным шейдером). Поддерживаются некоторые функции графического шейдера, но другие были удалены, чтобы можно было добавить новые функции шейдера вычислений.
Для поддержки функций, зависящих от вычислительного шейдера, теперь доступны несколько новых типов ресурсов, таких как буферы чтения и записи, текстуры и структурированные буферы.
Этап Тесселлатора
Tessellator — это этап фиксированной функции, инициализируемый привязкой шейдера корпуса к конвейеру (см. практическое руководство. Инициализация этапа Tessellator). Назначение этапа тесселятора подразделить домен (четырехугольник, треугольник или линию ) на большое число меньших объектов (треугольников, точек или линий). Тесселятор разбивает канонический домен в нормализованной (ноль к единице) системе координат. Например, домен четырехугольника тесселируется в единичный квадрат.
Тесселяция выполняется единожды для каждого участка с использованием факторов тесселяции (указывают тщательность тесселяции домена) и типа секционирования (указывает алгоритм разделения участка на части), переданных с предыдущего этапа шейдера поверхностей. Тесселяция выводит координаты uv (дополнительно — w) и топологию поверхности для этапа шейдера доменов.
Внутри системы тесселлатор работает на двух этапах:
- В ходе первой фазы обрабатываются факторы тесселяции, устраняются ошибки округления, обрабатываются очень маленькие факторы, уменьшаются и объединяются факторы, при этом применяется 32-разрядная арифметика с плавающей запятой.
- На второй фазе формируются списки точек или топологи на основе выбранного типа секционирования. Это основная задача этапа тесселятора, где применяются 16-разрядные дроби с арифметикой фиксированной точки. Арифметику фиксированной точки можно ускорить аппаратно с сохранением допустимый точности. Например, для преобразования шириной 64 метра такая точность позволяет размещать точки с разрешением в 2 мм.
New Pipeline Stages
Tessellation uses the GPU to calculate a more detailed surface from a surface constructed from quad patches, triangle patches or isolines. To approximate the high-ordered surface, each patch is subdivided into triangles, points, or lines using tessellation factors. The Direct3D 11 pipeline implements tessellation using three new pipeline stages:
-
- A programmable shader stage that produces a geometry patch (and patch constants) that correspond to each input patch (quad, triangle, or line). - A fixed function pipeline stage that creates a sampling pattern of the domain that represents the geometry patch and generates a set of smaller objects (triangles, points, or lines) that connect these samples. - A programmable shader stage that calculates the vertex position that corresponds to each domain sample.
The following diagram highlights the new stages of the Direct3D 11 pipeline.
The following diagram shows the progression through the tessellation stages. The progression starts with the low-detail subdivision surface. The progression next highlights the input patch with the corresponding geometry patch, domain samples, and triangles that connect these samples. The progression finally highlights the vertices that correspond to these samples.
Динамическое связывание шейдеров
Системы отрисовки должны иметь значительную сложность при управлении шейдерами, предоставляя возможность оптимизировать код шейдера. Это становится еще более сложной задачей, так как шейдеры должны поддерживать различные материалы в отрисованной сцене в различных конфигурациях оборудования. Для решения этой проблемы разработчики шейдеров часто прибегали к одному из двух общих подходов. Они либо создали полнофункциональное шейдеры общего назначения, которые можно использовать различными элементами сцены, которые позволяют отрегулировать некоторую производительность для гибкости, либо создать отдельные шейдеры для каждого геометрического потока, типа материала или легкого сочетания типов.
Эти крупные шейдеры общего назначения обрабатывают эту проблему путем повторной компиляции одного шейдера с различными определениями препроцессора, а последний метод использует возможности разработчика методом подбора для достижения того же результата. Взрыв перестановки шейдера часто был проблемой для разработчиков, которые теперь должны управлять тысячами различных перестановок шейдеров в рамках их игрового конвейера и конвейера активов.
Direct3D 11 и модель шейдера 5 представляют объектно-ориентированные языковые конструкции и обеспечивают поддержку среды выполнения связывания шейдеров, чтобы помочь разработчикам программировать шейдеры.
Дополнительные сведения см. в разделе "Динамическое связывание ".
How to's:
The documentation also contains examples for initializing the tessellation stages.
Поговорим о тесселяции в DirectX 11
Вы наверняка помните серию недавних скринов. Тогда Кристина Коффин сказала, единственное что я вижу на скринах – так это отключенную тесселяцию…
Tessellator (модуль тесселяции)
Поговорим о тесселяции в DirectX 11
Поговорим о тесселяции в DirectX 11
Тесселяция не является совершенно новой технологией, впервые её стали использовать видеопроцессоры Xenos, которые были разработаны компанией AMD для игровых консолей Xbox 360 в 2005 году. Однако модуль тесселяции использованный в DirectX 11 является более устойчивым и гибким, нежели модуль, использованный в графических процессорах Xenos.
Поговорим о тесселяции в DirectX 11
Тесселяция – увеличения количества полигонов
Тесселяция улучшает процесс создания авторского контента и позволит разработчикам и художникам создавать более реалистичных и сложных персонажей, избегая при этом огромных расходов производительности системы. В основе тесселяции лежит идея о том, что объект, расположенный далеко от точки обозрения, будет менее детализирован, из-за того, что его тяжело рассмотреть, но по мере его приближения количество треугольников в изображении объекта экспоненциально увеличивается с целью улучшения его детализации для того, чтобы он выглядел более реалистично. Совершенством этого метода является то, что, при рассмотрении просчитанного изображения, среднее число обработанных треугольников остается близко к устойчивому значению, так что игроку существенно реже доведется встречаться с резкими падениями производительности его системы. Подобный выигрыш в производительности наиболее подходит для разработки консольных игр, потому что там аппаратные средства часто очень ограничены, но и для платформы ПК тесселяция принесет значительную выгоду.
Поговорим о тесселяции в DirectX 11
Все стадии обрабатываются в графическом процессоре
Процесс тесселяции предмета начинается в Hull Shader (поверхностный шейдер) – он берет контрольные точки и вычисляет нужный уровень тесселяции. После этой базисной реорганизации контрольные точки отправляются в Domain Shader (доменный шейдер) – тесселятор абсолютно ничего не знает о контрольных точках. Вместо этого тесселятору предоставляют некоторое количество параметров тесселяции, которые задают ему требуемый уровень тесселяции на определенном патче (особые минимальные кусочки объекта). Hull Shader сообщает тесселятору, в каком порядке он должен работать – разработчик сможет определить, каким методом произойдет процесс тесселяции, поскольку модуль тесселяции располагает фиксированным комплектом функций, у него есть несколько операционных режимов. Тесселятор берет то, что было подано ему из Hull Shader и действует в патче над формированием требуемой добавочной геометрии. Как только эта стадия будет завершена, он выдаст доменные точки (domain points) и данные топологии. Доменные точки подаются в Domain Shader, который создает на их основе вершины, доступные прочей части конвейера. Одновременно данные топологии адресуются прямо на этап сборки примитивов конвейера – это совершается потому, что данные шейдерам не нужны, они подготовлены для растеризатора. Здесь нужно отметить то, что на всех этапах стадии тесселяции работа ведется не с треугольниками – вместо этого обрабатываются патчи и точки. Патчи представляют собой кривые или области поверхности и практически всегда являются четырехугольниками. Это первый случай, когда DirectX использует в качестве примитивов не треугольники, и это является существенным шагом вперед.
Поговорим о тесселяции в DirectX 11
Минимальный уровень тесселяции
Поговорим о тесселяции в DirectX 11
Максимальный уровень тесселяции
Все описаное выше осуществляется за один проход через конвейер DirectX 11. Исходя из этого, мы видим, что у него есть значительный потенциал стать невообразимо эффективным способом добавления огромного количества деталей в будущие игры.
Поговорим о тесселяции в DirectX 11
Преимущества тесселяции
Поскольку с помощью тесселяции можно не только улучшать форму объектов, но и порою заметно изменять их геометрию, то в ряде источников управляемый процесс тесселяции называют геометрическими шейдерами.
Наиболее существенный вклад в новый уровень графики обеспечивает тесселяция, которую можно будет включить или отключить при необходимости. Именно это нововведение мы рассмотрим повнимательнее. На представленных ниже изображениях, вы сможете увидеть, какие именно изменения вступают в силу при включении и отключении тесселяции.
Без тесселяции
Поговорим о тесселяции в DirectX 11
Тесселяция включена
Поговорим о тесселяции в DirectX 11
Без тесселяции
Поговорим о тесселяции в DirectX 11
Тесселяция включена
Поговорим о тесселяции в DirectX 11
Без тесселяции
Поговорим о тесселяции в DirectX 11
Тесселяция включена
Поговорим о тесселяции в DirectX 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.
Тесселяция
Тесселяции можно использовать для отрисовки одной модели с различными уровнями детализации. Такой подход создает более геометрическую модель, которая зависит от уровня детализации, необходимого для сцены. Используйте тесселяции в сцене, где уровень детализации позволяет более низкой геометрической модели, что снижает спрос на пропускную способность памяти, потребляемую во время отрисовки.
В Direct3D тесселяции реализованы на GPU для вычисления более гладкой изогнутой поверхности из грубого (менее подробного) входного исправления. Каждое лицо (четырехугольник или треугольник) разделено на более мелкие треугольные лица, которые лучше приблизится к нужной поверхности.
Сведения о реализации тесселяции в графическом конвейере см. в разделе "Обзор тесселяции".
Функции, добавленные в предыдущих выпусках
Список функций, добавленных в предыдущих выпусках, см. в следующих разделах:
Среда выполнения Direct3D 11 поддерживает три новых этапа, реализующих тесселяции, которые преобразуют поверхности деления с низкой детализацией в более подробные примитивы на GPU. Тесселяции разбивает на плитки поверхности старшего порядка на структуры, подходящие для прорисовки.
Реализуя тесселяцию на аппаратном оборудовании, графический конвейер может оценить модели низкой детализации (с малым числом полигоном) и прорисовать их более детально. Хоть выполнение тесселяции возможно и программными методами, аппаратная тесселяция может дать огромное число визуальных деталей (включая поддержку карт смещения) без добавления визуальных деталей к размерам моделей и парализации частот обновления.
Hull-Shader Stage
A hull shader -- which is invoked once per patch -- transforms input control points that define a low-order surface into control points that make up a patch. It also does some per patch calculations to provide data for the tessellation stage and the domain stage. At the simplest black-box level, the hull-shader stage would look something like the following diagram.
A hull shader is implemented with an HLSL function, and has the following properties:
- The shader input is between 1 and 32 control points.
- The shader output is between 1 and 32 control points, regardless of the number of tessellation factors. The control-points output from a hull shader can be consumed by the domain-shader stage. Patch constant data can be consumed by a domain shader; tessellation factors can be consumed by the domain shader and the tessellation stage.
- Tessellation factors determine how much to subdivide each patch.
- The shader declares the state required by the tessellator stage. This includes information such as the number of control points, the type of patch face and the type of partitioning to use when tessellating. This information appears as declarations typically at the front of the shader code.
- If the hull-shader stage sets any edge tessellation factor to = 0 or NaN, the patch will be culled. As a result, the tessellator stage may or may not run, the domain shader will not run, and no visible output will be produced for that patch.
At a deeper level, a hull-shader actually operates in two phases: a control-point phase and a patch-constant phase, which are run in parallel by the hardware. The HLSL compiler extracts the parallelism in a hull shader and encodes it into bytecode that drives the hardware.
- The control-point phase operates once for each control-point, reading the control points for a patch, and generating one output control point (identified by a ControlPointID).
- The patch-constant phase operates once per patch to generate edge tessellation factors and other per-patch constants. Internally, many patch-constant phases may run at the same time. The patch-constant phase has read-only access to all input and output control points.
Here's an example of a hull shader:
For an example that creates a hull shader, see How To: Create a Hull Shader.
Этап Hull-Shader
Шейдер корпуса , который вызывается один раз для каждого исправления, преобразует входные контрольные точки, определяющие поверхность низкого порядка в контрольные точки, составляющие исправление. Он также выполняет некоторые вычисления исправлений для предоставления данных для этапа тесселяции и этапа предметной области. На самом простом уровне черного ящика этап шейдера корпуса будет выглядеть примерно так, как на следующей схеме.
Шейдер корпуса реализуется с помощью функции HLSL и имеет следующие свойства:
На более глубоком уровне шейдер корпуса фактически работает на двух этапах: этап точки управления и этап константы исправлений, которые выполняются параллельно оборудованием. Компилятор HLSL извлекает параллелизм в шейдере поверхностей и кодирует его в байт-код, управляющий оборудованием.
- Этап контрольных точек выполняется единожды для каждой контрольной точки. При этом считываются контрольные точки для участка и создается одна выходная контрольная точка (определенная ControlPointID).
- Этап констант участков выполняется единожды для каждого участка. При этом создаются факторы тесселяции ребер и другие константы отдельных участков. Внутри системы может одновременно выполняться множество этапов констант участков. Этап констант участков есть доступ только для чтения ко всем входным и выходным контрольным точкам.
Ниже приведен пример шейдера корпуса:
Преимущества тесселяции
- Экономит много памяти и пропускной способности, что позволяет приложению визуализировать более подробные поверхности из моделей с низким разрешением. Метод тесселяции, реализованный в конвейере Direct3D 11, также поддерживает сопоставление смещения, которое может создавать потрясающие объемы поверхности.
- Поддерживает масштабируемые методы отрисовки, такие как непрерывный или просмотр зависимых уровней детализации, которые можно вычислить на лету.
- Повышает производительность за счет выполнения ресурсоемких вычислений с более низкой частотой (выполнение вычислений в модели с более низкой детализацией). Сюда могут входить расчеты смешения с применением форм наложения и морфинговые цели для реалистичной анимации или физических расчетов для обнаружения столкновений или эмуляции динамики мягких тел.
Конвейер Direct3D 11 реализует тесселяции на оборудовании, которое загрузит работу с ЦП на GPU. Это может дать очень существенный прирост производительности, если в приложение реализуется большое число морфинговых целей и/или более сложные модели деформации/скиннинга. Чтобы получить доступ к новым функциям тесселяции, необходимо узнать о некоторых новых стадиях конвейера.
Этап Domain-Shader
Шейдер домена вычисляет положение вершины разделенной точки в выходном исправлении. Шейдер домена выполняется один раз на точку вывода этапа тесселлатора и имеет доступ только для чтения к координатам УФ-вывода этапа тесселлатора, исправлению вывода шейдера корпуса и константы исправления вывода шейдера корпуса, как показано на следующей схеме.
К свойствам шейдера домена относятся:
После завершения шейдера домена тесселяции завершается, а данные конвейера продолжаются на следующем этапе конвейера (геометрический шейдер, шейдер пикселей и т. д.). Шейдер геометрии, ожидающий примитивы со смежностью (например, 6 вершин на треугольник), недействителен при активной тесселяции (это приводит к неопределенному поведению, о чем будет сообщать уровень отладки).
Ниже приведен пример шейдера домена.
APIs for initializing Tessellation Stages
Enable tessellation by creating a hull shader and binding it to the hull-shader stage (this automatically sets up the tessellator stage). To generate the final vertex positions from the tessellated patches, you will also need to create a domain shader and bind it to the domain-shader stage. Once tessellation is enabled, the data input to the input-assembler stage must be patch data. That is, the input assembler topology must be a patch constant topology from D3D11_PRIMITIVE_TOPOLOGY set with IASetPrimitiveTopology.
To disable tessellation, set the hull shader and the domain shader to NULL. Neither the geometry-shader stage nor the stream-output stage can read hull-shader output-control points or patch data.
New topologies for the input-assembler stage, which are extensions to this enumeration.
The topology is set to the input-assembler stage using IASetPrimitiveTopology
Of course, the new programmable shader stages require other state to be set, to bind constant buffers, samples, and shader resources to the appropriate pipeline stages. These new ID3D11Device methods are implemented for setting this state.
Вычислительные шейдеры и неупорядоченная память [ ]
Direct3D 11 вводит новый тип шейдера — вычислительный шейдер (Compute Shader). Вычислительный шейдер вызывается как регулярный массив потоков. Потоки делятся на группы. Каждая группа имеет 32 Кб памяти, разделяемой между потоками группы. Таким образом потоки в группе могут обмениваться результатами, улучшая свою производительность. Также потоки могут производить чтения и записи с произвольным доступом к графическим ресурсам: текстурам, массивам вершин, рендер таргетам. Эти доступы к памяти неупорядочены, хотя синхронизация различных инструкций осуществляется, когда это действительно необходимо.
Пиксельные (фрагментные) шейдеры могут также читать по произвольному адресу, что позволяет записывать структуры данных, которые могут быть затем использованы в вычислительном шейдере, или наоборот. Стоит отметить, что пиксельные шейдеры всегда имели возможность произвольного доступа на чтение через текстурные лукапы.
Вычислительные шейдеры могут также производить операции такие, как summed-area tables, быстрое Фурье-преобразование значительно быстрее, чем ранее применяемые методы на графическом процессоре. На данный момент Microsoft исследует библиотеки, обеспечивающие подобные расчёты. Microsoft считает, что алгоритмы, такие как A-буфер визуализация и трассировка лучей могут также быть осуществлены эффективно, но на данный момент нет реальных показателей, свидетельствующих об их эффективности.
Вызов вычислительного шейдера заменяет все стадии конвейера визуализации. Тем не менее, можно смешивать вычислительные шейдеры и традиционный рендер путём использования их результатов. Например, обработка изображения после визуализации вычислительным шейдером (можно загружать дополнительные структуры данных).
Новые этапы конвейера
В ходе тесселяции задействуется GPU для расчета более подробной поверхности из поверхности, составленной из преобразований четырехугольников, треугольников и изолиний. Для аппроксимации поверхности высокого порядка, каждое преобразование подразделяется на треугольники, точки и линии согласно факторам тесселяции. Конвейер Direct3D 11 реализует тесселяции с помощью трех новых этапов конвейера:
-
— программируемый этап шейдера, который создает геометрическое исправление (и константы исправлений), соответствующие каждому входному исправлению (четыре, треугольник или линия). — этап фиксированного конвейера функций, создающий шаблон выборки домена, который представляет геометрическое исправление и создает набор небольших объектов (треугольников, точек или линий), которые соединяют эти образцы. — программируемый этап шейдера, который вычисляет положение вершин, соответствующее каждому образцу домена.
На следующей схеме показаны новые этапы конвейера Direct3D 11.
На следующей схеме показано выполнение этапов тесселяции. Выполнение начинается с меньшей поверхности с низкой степенью детализации. Далее рассматривается входное преобразование с соответствующим преобразованием геометрии, выборками домена и треугольниками, которые соединяют эти выборки. Наконец выделяются вершины, которые соответствуют этим выборкам.
API для инициализации этапов тесселяции
Тесселяции реализованы с двумя новыми программируемыми этапами шейдера: шейдером корпуса и шейдером предметной области. Эти новые этапы шейдера программируются с помощью кода HLSL, определенного в модели шейдера 5. Новые целевые объекты шейдера: hs_5_0 и ds_5_0. Как и все программируемые этапы шейдера, код для оборудования извлекается из скомпилированных шейдеров, передаваемых в среду выполнения, когда шейдеры привязаны к конвейеру с помощью API, таких как DSSetShader и HSSetShader. Но сначала необходимо создать шейдер с помощью ТАКИх API, как CreateHullShader и CreateDomainShader.
Включите тесселяцию, создав шейдер поверхности и привязав его к этапу шейдера поверхности (это автоматически настраивает этап тесселятора). Для формирования финальных позиций вершин из тесселированных преобразований также понадобится создать шейдер доменов и привязать его к этапу шейдера доменов. После включения тесселяции входные данные на этапе сборщика входных данных должны быть исправлены. То есть топология сборщика входных данных должна быть топологией констант исправлений из D3D11_PRIMITIVE_TOPOLOGY набором с IASetPrimitiveTopology.
Чтобы отключить тесселяцию, установите для шейдера поверхности и шейдера доменов значение NULL. Ни этап геометрического шейдера, ни этап потокового вывода не могут считывать точки управления выходными данными оболочки или исправления.
Новые топологии для этапа сборщика входных данных, которые являются расширениями для этого перечисления.
Топология задается на этапе сборщика входных данных с помощью IASetPrimitiveTopology
Конечно, для новых программируемых этапов шейдера требуется задать другое состояние, чтобы привязать буферы констант, образцы и ресурсы шейдера к соответствующим этапам конвейера. Эти новые методы ID3D11Device реализуются для настройки этого состояния.
Tessellator Stage
The tessellator is a fixed-function stage initialized by binding a hull shader to the pipeline (see How To: Initialize the Tessellator Stage). The purpose of the tessellator stage is to subdivide a domain (quad, tri, or line) into many smaller objects (triangles, points or lines). The tessellator tiles a canonical domain in a normalized (zero-to-one) coordinate system. For example, a quad domain is tessellated to a unit square.
The tessellator operates once per patch using the tessellation factors (which specify how finely the domain will be tessellated) and the type of partitioning (which specifies the algorithm used to slice up a patch) that are passed in from the hull-shader stage. The tessellator outputs uv (and optionally w) coordinates and the surface topology to the domain-shader stage.
Internally, the tessellator operates in two phases:
- The first phase processes the tessellation factors, fixing rounding problems, handling very small factors, reducing and combining factors, using 32-bit floating-point arithmetic.
- The second phase generates point or topology lists based on the type of partitioning selected. This is the core task of the tessellator stage and uses 16-bit fractions with fixed-point arithmetic. Fixed-point arithmetic allows hardware acceleration while maintaining acceptable precision. For example, given a 64 meter wide patch, this precision can place points at a 2 mm resolution.
Полный список функций
Это полный список функций в Direct3D 11.
Вы можете запустить Direct3D 11 на оборудовании нижнего уровня , определив уровень компонентов при создании устройства.
Вы можете выполнять тесселяции (см. обзор тесселяции) с помощью следующих типов шейдеров:
Direct3D 11 поддерживает многопоточность (см. многопоточность)
- Создание многопоточного ресурса, шейдера или объекта
- Создание многопоточного списка отображения
Direct3D 11 расширяет шейдеры со следующими функциями (см. модель шейдера 5)
Адресные ресурсы — текстуры, буферы констант и образцы
Дополнительные типы ресурсов, такие как буферы чтения и записи и текстуры (см. раздел "Новые типы ресурсов").
Шейдер вычислений (см. общие сведения о шейдере вычислений) — шейдер, который ускоряет вычисления, разделяя проблемное пространство между несколькими программными потоками или группами потоков, а также обмен данными между регистрами шейдеров, чтобы значительно сократить объем данных, необходимых для ввода в шейдер. Алгоритмы, которые шейдер вычислений может значительно улучшить, включают постобработку, анимацию, физику и искусственный интеллект.
- Вставка — позволяет геометрическому шейдеру выводить максимум 1024 вершины или любое сочетание экземпляров и вершин до 1024 (максимум 32 экземпляра из 32 вершин каждый).
Покрытие в качестве входных данных PS
Программируемая интерполяция входных данных . Шейдер пикселей может оценивать атрибуты в пикселе в любом месте многосамплексной сетки
Центроидная выборка атрибутов должна соответствовать следующим правилам:
Если все образцы в примитиве охвачены, атрибут вычисляется в центре пикселей независимо от того, имеет ли образец шаблона расположение выборки в центре пикселей.
В противном случае атрибут вычисляется по первому описанному образцу, то есть выборке с наименьшим индексом среди всех примеров индексов. В этой ситуации выборка покрытия определяется после применения логической операции AND к охвату и состоянию растеризатора выборки маски.
Если образцы не охвачены (например, на вспомогательных пикселях, которые выполняются по границам примитивного элемента для заполнения меток 2x2 пикселей), атрибут вычисляется одним из следующих способов:
- Если состояние растеризатора выборки маски является подмножеством выборок в пикселе, то первым примером, покрываемым состоянием растеризатора выборки маски, является точка оценки.
- В противном случае в полном условии маски выборки центр пикселей является точкой оценки.
Direct3D 11 расширяет текстуры (см. общие сведения о текстурах) со следующими функциями
- Поддержка текстур с несколькими компонентами — указание канала для загрузки из
- Поддержка программируемых смещения
- Зажимы текстуры для ограничения предварительной загрузки WDDM
Ограничения текстуры объемом 16 КБ
Новые форматы сжатия текстур (1 новый формат LDR и 1 новый формат HDR)
Direct3D 11 поддерживает консервативный oDepth. Этот алгоритм позволяет шейдеру пикселей сравнивать значение глубины пикселя шейдера пикселей с этим в растризаторе. Результат позволяет выполнять ранние операции очистки глубины, сохраняя возможность вывода oDepth из пиксельного шейдера.
Direct3D 11 поддерживает большую память
- Разрешить ресурсы > 4 ГБ
- Сохраняйте индексы ресурсов в 32 битах, но ресурсы больше
Direct3D 11 поддерживает улучшения потокового вывода
- Адресируемые выходные данные потока
- Увеличение количества выходных данных потока до 4
- Изменение всех буферов вывода потока на несколько элементов
Direct3D 11 поддерживает модель шейдера 5 (см. модель шейдера 5)
- Двойные значения с денормами
- Инструкция набора битов счетчика
- Поиск инструкции по первому набору битов
- Обработка переноса и переполнения
- Инструкции по развороту битов для FFT
- Встроенная функция условного переключения
- Resinfo в буферах
- Обратная точность с уменьшенной точностью
- Инструкции по преобразованию шейдера — fp16 в fp32 и наоборот
- Структурированный буфер, который является новым типом буфера, содержащего структурированные элементы.
Direct3D 11 поддерживает представления только для чтения или трафаретов
- Отключает операции записи в часть, доступную только для чтения, позволяет использовать текстуру в качестве входных данных и для отбрасывания глубины
Direct3D 11 поддерживает непрямое рисование. Direct3D 10 реализует DrawAuto, который принимает содержимое (генерируется GPU) и отрисовывает его (на GPU). Direct3D 11 обобщит DrawAuto, чтобы его можно было вызывать с помощью шейдера вычислений с помощью DrawInstanced и DrawIndexedInstanced.
Direct3D 11 поддерживает другие функции
- Окна просмотра с плавающей запятой
- Зажимка mipmap для каждого ресурса
- Смещение глубины — этот алгоритм обновляет поведение смещения глубины с помощью состояния растеризатора. Результат устраняет сценарии, в которых вычисляемая предвзятость может быть naN.
- Ограничения ресурсов — индексы ресурсов по-прежнему должны быть
- Точность растеризатора
- Требования MSAA
- Счетчики уменьшены
- Удалены 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).
Многопоточная визуализация [ ]
D3D10 позволяет передавать команды визуализации только из одного потока (на данный момент существует специальный многопоточный режим, но из-за низкой производительности Майкрософт не рекомендует использовать его). Как известно, передача команд визуализации через Direct3D предполагает использование дополнительных вычислительных ресурсов CPU. Учитывая тенденцию увеличения числа ядер центрального процессора, вводится поддержка более продвинутой многопоточности, чтобы распределять эту работу между несколькими потоками, тем самым производя её более эффективно.
Direct3D 11 даёт возможность создавать дисплейные списки из нескольких потоков и выполнять их из главного потока визуализации. Кроме того, устройство, которое создаёт ресурсы, было вынесено из контекста, который передаёт команды визуализации. Это позволяет создавать ресурсы асинхронно. Отложенные контексты (Deferred Contexts) используются для создания дисплейных списков и прямой контекст (Immediate Context) для передачи команд визуализации на GPU, включая обработку дисплейных списков, созданных в отложенных контекстах.
В отличие от других возможностей, в Direct3D 11 многопоточная визуализация реализуется программно через драйвер. Соответствующие драйверы D3D10 (возможно, даже D3D9) позволяют выполнять многопоточную визуализацию гораздо эффективней, чем ранее. Определённый уровень многопоточности будет доступен даже без новых драйверов, однако пока неясно, какие ограничения будут в этом случае.
Читайте также: