Практическое руководство. Проектирование шейдера домена

Шейдер домена является третьим из трех этапов, которые работают вместе для реализации тесселяции. Шейдер домена создает геометрию поверхности из преобразованных контрольных точек шейдера корпуса и UV-координат. В этом разделе показано, как создать шейдер домена.

Шейдер домена вызывается один раз для каждой точки, сгенерированной фиксированной функцией tessellator. Входные данные — это UV[W] координаты точки на патче, а также все выходные данные из шейдера оболочки, включая контрольные точки и константы патча. Выходные данные — это вершина, определенная любым желаемым способом. Если выходные данные отправляются в шейдер пикселей, выходные данные должны содержать позицию (обозначенную семантикой SV_Position).

Проектирование шейдера домена

  1. Определите атрибут домена.

    [domain("quad")]
    

    Домен определяется для квадратного патча.

  2. Укажите местоположение на корпусе с использованием домена и значения системы.

    • Для четырехугольной площадки используйте float2.
    • Для троичного патча используйте float3 (для барицентрических координат)
    • Для изолинии используйте float2 (англ.).

    Таким образом, расположение домена для четырехугольного патча выглядит следующим образом:

    float2 UV : SV_DomainLocation
    
  3. Определите другие входные данные.

    Другие входные данные приходят из шейдера корпуса и определяются пользователем. Сюда входят входные опорные точки для пятна, из которых может быть от 1 до 32 точек, а также входные константные данные пятна.

    Контрольные точки определяются пользователем, обычно со структурой, такой как эта (определена в разделе Практическое руководство. Проектирование шейдера корпуса):

    const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
    

    Константные данные патчей также определены пользователем и могут выглядеть следующим образом (определено в разделе Как сделать: Проектирование шейдера корпуса):

    HS_CONSTANT_DATA_OUTPUT input
    
  4. Добавьте определяемый пользователем код для вычисления выходных данных; это составляет тело шейдера домена.

    Эта структура содержит выходные данные шейдера домена, определяемого пользователем.

    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 в этом примере.

После разработки шейдера домена см. раздел "Практическое руководство: создание шейдера домена".

Использование Direct3D 11

Обзор Тесселлации