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

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

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

    Функция принимает каждый входной УФ (из тесселлатора) и оценивает исправление Безье в этой позиции.

    [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

Общие сведения о тесселяции