Поделиться через


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

Шейдер домена является третьим из трех этапов, которые работают вместе для реализации тесселяции. Шейдер домена создает геометрию поверхности из преобразованных контрольных точек шейдера корпуса и 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

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