Этапы тесселяции
Среда выполнения Direct3D 11 поддерживает три новых этапа, реализующих тесселяции, которые преобразуют поверхности с низкой детализацией в более подробные примитивы на GPU. Плитки tessellation (или разбиваются) поверхностей высокого порядка в подходящие структуры для отрисовки.
Реализуя тесселяции в оборудовании, графический конвейер может оценивать модели с более низкой детализацией (более низкое количество многоугольников) и отображать более подробные сведения. Хотя можно сделать программное тесселяции, тесселлирование, реализованное оборудованием, может создать невероятное количество визуальных деталей (включая поддержку сопоставления смещения), не добавляя визуальные детали к размерам модели и парализованным скоростям обновления.
- преимущества Тесселлации
-
новые этапы конвейера
- этап Hull-Shader
- этап Тесселлатор
- этап Domain-Shader
- API для инициализации этапов тесселяции
- Практическое руководство.
- связанные разделы
Преимущества тесселяции
Тесселяции:
- Экономит много памяти и пропускной способности, что позволяет приложению отображать более подробные поверхности из моделей низкого разрешения. Метод тесселяции, реализованный в конвейере Direct3D 11, также поддерживает сопоставление смещения, которое может производить потрясающие объемы поверхности детали.
- Поддерживает масштабируемые методы отрисовки, такие как непрерывный или просмотр зависимых уровней детализации, которые можно вычислить на лету.
- Повышает производительность, выполняя дорогостоящие вычисления с меньшей частотой (выполняя вычисления в модели с более низкой детализацией). Это может включать в себя вычисления смешения с использованием фигур смешения или целевых объектов морфов для реалистичных анимаций или вычислений физики для обнаружения столкновений или мягкой динамики тела.
Конвейер Direct3D 11 реализует тесселяции в оборудовании, которое отключает работу с ЦП на GPU. Это может привести к очень большим улучшениям производительности, если приложение реализует большое количество целевых объектов морфов и /или более сложные модели скининга или деформации. Чтобы получить доступ к новым функциям тесселяции, необходимо узнать о некоторых новых этапах конвейера.
Новые этапы конвейера
Tessellation использует GPU для вычисления более подробной поверхности из поверхности, созданной из четырех исправлений, треугольных исправлений или isolines. Чтобы приблизить высокоупорядоченную поверхность, каждое исправление разделено на треугольники, точки или линии с помощью факторов тесселяции. Конвейер Direct3D 11 реализует тесселяции с помощью трех новых этапов конвейера:
- Hull-Shader этап — программируемый этап шейдера, который создает геометрическое исправление (и константы исправлений), соответствующее каждому входному исправлению (четыре, треугольник или линия).
- этап Tessellator — этап конвейера фиксированной функции, который создает шаблон выборки домена, который представляет геометрическое исправление и создает набор небольших объектов (треугольников, точек или линий), которые подключают эти образцы.
- Domain-Shader этап — программируемый этап шейдера, который вычисляет позицию вершин, соответствующую каждому образцу домена.
На следующей схеме показаны новые этапы конвейера Direct3D 11.
На следующей схеме показана прогрессия на этапах тесселяции. Прогрессия начинается с поверхности деления с низкой детализацией. Следующий прогресс выделяет входной исправление с соответствующими геометрическими исправлениями, примерами домена и треугольниками, которые подключают эти образцы. Прогрессия, наконец, выделяет вершины, соответствующие этим образцам.
схема
этап Hull-Shader
Шейдер корпуса , который вызывается один раз на исправление, преобразует входные контрольные точки, определяющие поверхность с низким порядком в контрольные точки, составляющие исправление. Он также выполняет некоторые вычисления исправлений для предоставления данных для этапа тесселяции и этапа домена. На самом простом черном поле этап шейдера корпуса будет выглядеть примерно так, как на следующей схеме.
Шейдер корпуса реализуется с функцией HLSL и имеет следующие свойства:
- Входные данные шейдера — от 1 до 32 точек управления.
- Выходные данные шейдера между 1 и 32 контрольными точками независимо от количества факторов тесселяции. Выходные данные контрольных точек из шейдера корпуса можно использовать на этапе шейдера домена. Константные данные исправлений могут использоваться шейдером домена; Факторы тесселяции можно использовать шейдером домена и этапом тесселяции.
- Факторы тесселяции определяют, сколько нужно разделить каждое исправление.
- Шейдер объявляет состояние, требуемое этапом tessellator. Сюда входят такие сведения, как количество контрольных точек, тип лица исправления и тип секционирования, используемый при тесселлатинге. Эта информация обычно отображается как объявления в передней части кода шейдера.
- Если этап шейдера корпуса устанавливает любой коэффициент тесселяции ребра = 0 или NaN, исправление будет выброшено. В результате этап tessellator может или не может выполняться, шейдер домена не будет выполняться, а видимые выходные данные не будут созданы для этого исправления.
На более глубоком уровне шейдер корпуса фактически работает на двух этапах: этап точки управления и константный этап исправления, которые выполняются параллельно оборудованием. Компилятор HLSL извлекает параллелизм в шейдере корпуса и кодирует его в байт-код, который управляет оборудованием.
- Этап контрольной точки работает один раз для каждой контрольной точки, считывая контрольные точки для исправления и создавая одну выходную точку управления (определяемую ControlPointID).
- Этап константы исправлений работает один раз на каждый исправление, чтобы создать факторы тесселяции ребер и другие константы для каждого исправления. Во внутреннем режиме многие этапы константы исправлений могут выполняться одновременно. Этап константы исправлений имеет доступ только для чтения ко всем точкам управления входными и выходными данными.
Ниже приведен пример шейдера корпуса:
[patchsize(12)]
[patchconstantfunc(MyPatchConstantFunc)]
MyOutPoint main(uint Id : SV_ControlPointID,
InputPatch<MyInPoint, 12> InPts)
{
MyOutPoint result;
...
result = TransformControlPoint( InPts[Id] );
return result;
}
Пример создания шейдера корпуса см. в разделе Практическое руководство. Создание шейдера корпуса.
Этап Тесселлатора
Tessellator — это этап фиксированной функции, инициализированный путем привязки шейдера корпуса к конвейеру (см. практическое руководство. Инициализация этапа Tessellator). Цель этапа tessellator состоит в том, чтобы разделить домен (четыре, три или линия) на множество небольших объектов (треугольников, точек или линий). Тесселлатор плитки канонического домена в нормализованной (нулевой к одному) системе координат. Например, четырехдоменный домен тесселлирован на единицу квадрата.
Tessellator работает один раз на исправление с помощью факторов тесселяции (которые указывают, как точно домен будет тесселлирован) и тип секционирования (который указывает алгоритм, используемый для среза исправления), которые передаются из этапа шейдера корпуса. Выходные данные tessellator (и при необходимости w) и топология поверхности на стадии шейдера домена.
Внутри системы тесселлатор работает на двух этапах:
- Первый этап обрабатывает факторы тесселяции, устраняя округляющие проблемы, обрабатывая очень небольшие факторы, уменьшая и сочетая факторы, используя арифметическую 32-разрядную арифметику с плавающей запятой.
- Второй этап создает списки точек или топологий на основе выбранного типа секционирования. Это основная задача этапа tessellator и использует 16-разрядные дроби с арифметикой фиксированной точки. Арифметика фиксированной точки обеспечивает аппаратное ускорение при сохранении допустимой точности. Например, учитывая 64-метровую ширину исправления, эта точность может размещать точки в разрешении 2 мм.
Тип секционирования | Диапазон |
---|---|
fractional_odd | [1...63] |
fractional_even | Диапазон TessFactor: [2..64] |
целое число | Диапазон TessFactor: [1..64] |
pow2 | Диапазон TessFactor: [1..64] |
этап Domain-Shader
Шейдер домена вычисляет позицию вершины разделенной точки в выходном исправлении. Шейдер домена запускается один раз на точку вывода стадии tessellator и имеет доступ только для чтения к выходным координатам стадии tessellator, исправлению вывода шейдера корпуса и констант выходного исправления шейдера корпуса, как показано на следующей схеме.
К свойствам шейдера домена относятся:
- Шейдер домена вызывается один раз для каждой выходной координаты из этапа tessellator.
- Шейдер домена использует выходные точки управления с этапа шейдера корпуса.
- Шейдер домена выводит позицию вершины.
- Входные данные — это выходные данные шейдера корпуса, включая контрольные точки, константные данные исправления и факторы тесселяции. Факторы тесселяции могут включать значения, используемые фиксированной функцией tessellator, а также необработанные значения (перед округлением целым числом тесселяции, например), которые упрощают геоморфирование, например.
После завершения шейдера домена выполняется обработка тесселяции и данные конвейера продолжаются на следующем этапе конвейера (шейдер геометрии, шейдер пикселей и т. д.). Шейдер геометрии, ожидающий примитивов с примечаниями (например, 6 вершин на треугольник) недействителен, если тесселлирование активно (это приводит к неопределенному поведению, о котором будет жаловаться слой отладки).
Ниже приведен пример шейдера домена:
void main( out MyDSOutput result,
float2 myInputUV : SV_DomainPoint,
MyDSInput DSInputs,
OutputPatch<MyOutPoint, 12> ControlPts,
MyTessFactors tessFactors)
{
...
result.Position = EvaluateSurfaceUV(ControlPoints, myInputUV);
}
API для инициализации этапов тесселяции
Tessellation реализован с двумя новыми программируемыми этапами шейдера: шейдер корпуса и шейдером домена. Эти новые этапы шейдера программируются с кодом HLSL, определенным в модели шейдера 5. Новые целевые объекты шейдера: hs_5_0 и ds_5_0. Как и все программируемые этапы шейдера, код оборудования извлекается из скомпилированных шейдеров, передаваемых в среду выполнения, когда шейдеры привязаны к конвейеру с помощью API, таких как DSSetShader и HSSetShader. Но сначала необходимо создать шейдер с помощью API, таких как CreateHullShader и CreateDomainShader.
Включите тесселяции, создав шейдер корпуса и привязав его к этапу шейдера корпуса (это автоматически настраивает этап тесселлатора). Чтобы создать конечные позиции вершин из тесселлированных исправлений, вам также потребуется создать шейдер домена и привязать его к этапу шейдера домена. После включения тесселяции входные данные на этапе сборщика входных данных должны быть исправлены. То есть топология входных сборщика должна быть топологией констант исправлений из D3D11_PRIMITIVE_TOPOLOGY набором с IASetPrimitiveTopology.
Чтобы отключить тесселяции, задайте шейдер корпуса и шейдер домена значение NULL. Ни этап геометрии-шейдера, ни этап потокового вывода не может считывать точки управления выходом шейдера корпуса или данные исправления.
Новые топологии для этапа входной сборки, которые являются расширениями для этого перечисления.
enum D3D11_PRIMITIVE_TOPOLOGY
Топология задана на этапе сборщика входных данных с помощью IASetPrimitiveTopology
Конечно, для новых программируемых этапов шейдера требуется задать другое состояние, привязать буферы констант, примеры и ресурсы шейдера к соответствующим этапам конвейера. Эти новые методы ID3D11Device реализуются для настройки этого состояния.
Практическое руководство.
В документации также содержатся примеры для инициализации этапов тесселяции.
Пункт | Описание |
---|---|
Практическое руководство. Создание шейдера корпуса |
Создайте шейдер корпуса. |
практическое руководство. Проектирование шейдера корпуса |
Проектирование шейдера корпуса. |
Практическое руководство. Инициализация этапа Tessellator |
Инициализировать этап тесселяции. |
практическое руководство. Создание шейдера домена |
Создайте шейдер домена. |
Практическое руководство. Проектирование шейдера домена |
Создайте шейдер домена. |