Практическое руководство. Проектирование шейдера домена
Шейдер домена является третьим из трех этапов, которые работают вместе для реализации тесселяции. Шейдер домена создает геометрию поверхности из преобразованных контрольных точек шейдера корпуса и UV-координат. В этом разделе показано, как создать шейдер домена.
Шейдер домена вызывается один раз для каждой точки, сгенерированной фиксированной функцией tessellator. Входные данные — это UV[W] координаты точки на патче, а также все выходные данные из шейдера оболочки, включая контрольные точки и константы патча. Выходные данные — это вершина, определенная любым желаемым способом. Если выходные данные отправляются в шейдер пикселей, выходные данные должны содержать позицию (обозначенную семантикой 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; };
Функция принимает каждый входной UV (из тесселятора) и оценивает участок Безье в этой точке.
[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 в этом примере.
После разработки шейдера домена см. раздел "Практическое руководство: создание шейдера домена".
Связанные разделы