Практическое руководство. Разработка шейдера предметной области
Шейдер предметной области — это третий из трех этапов, которые совместно работают для реализации тесселяции. Шейдер предметной области создает геометрию поверхности из преобразованных контрольных точек из шейдера корпуса и координат УФ. В этом разделе показано, как создать шейдер предметной области.
Шейдер предметной области вызывается один раз для каждой точки, созданной tessellator фиксированной функции. Входными данными являются координаты УФ[W] точки на патче, а также все выходные данные из шейдера корпуса, включая контрольные точки и константы patch. Выходные данные — это вершина, определенная любым требуемым способом. Если выходные данные отправляются в пиксельный шейдер, выходные данные должны включать позицию (обозначенную SV_Position семантикой).
Разработка шейдера предметной области
Определите атрибут домена.
[domain("quad")]
Домен определяется для четырехугольного исправления.
Объявите расположение на корпусе с помощью значения системы расположения домена .
- Для четырехместных исправлений используйте float2.
- Для три исправления используйте float3 (для барицентрических координат)
- Для изолинии используйте float2.
Таким образом, расположение домена для четырехугольного исправления выглядит следующим образом:
float2 UV : SV_DomainLocation
Определите другие входные данные.
Другие входные данные поступают от шейдера корпуса и определяются пользователем. Сюда входят входные контрольные точки для исправления, из которых может быть от 1 до 32 точек, а также входные данные исправления.
Контрольные точки определяются пользователем, как правило, со структурой, подобной этой (которая определена в разделе Практическое руководство. Разработка шейдера корпуса):
const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
Данные константы исправления также определяются пользователем и могут выглядеть следующим образом (определяется в разделе Практическое руководство. Разработка шейдера корпуса):
HS_CONSTANT_DATA_OUTPUT input
Добавьте пользовательский код для вычисления выходных данных; это составляет тело шейдера предметной области.
Эта структура содержит пользовательские выходные данные шейдера домена.
struct DS_OUTPUT { float3 vNormal : NORMAL; float2 vUV : TEXCOORD; float3 vTangent : TANGENT; float3 vBiTangent : BITANGENT; float4 vPosition : SV_POSITION; };
Функция принимает каждый входной УФ (из тесселлатора) и оценивает исправление Безье в этой позиции.
[domain("quad")] DS_OUTPUT BezierEvalDS( HS_CONSTANT_DATA_OUTPUT input, float2 UV : SV_DomainLocation, const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch ) { DS_OUTPUT Output; // Insert code to compute the output here. return Output; }
Функция вызывается один раз для каждой точки, созданной tessellator фиксированной функции. Так как в этом примере используется четырехугольное исправление, расположением входного домена (SV_DomainLocation) является float2 (UV); три исправления будет иметь расположение ввода float3 (барицентрические координаты UVW), а изолина будет иметь расположение входного домена float2.
Другие входные данные для функции поступают непосредственно от шейдера корпуса. В этом примере это 16 контрольных точек, каждая из которых является BEZIER_CONTROL_POINT, а также константные данные исправления (HS_CONSTANT_DATA_OUTPUT). Выходные данные — это вершина, содержащая все необходимые данные, DS_OUTPUT в этом примере.
После разработки шейдера предметной области см. практическое руководство. Создание шейдера домена.
Связанные темы