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


Как: Проектировать шейдер оболочки

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

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

После того как вы разработали шейдер корпуса, см. Как создать шейдер корпуса, чтобы узнать, как его создать.

Проектирование шейдера корпуса

  1. Определение входных и выходных точек управления шейдером корпуса.

    // Input control point
    struct VS_CONTROL_POINT_OUTPUT
    {
        float3 vPosition : WORLDPOS;
        float2 vUV       : TEXCOORD0;
        float3 vTangent  : TANGENT;
    };
    
    // Output control point
    struct BEZIER_CONTROL_POINT
    {
        float3 vPosition    : BEZIERPOS;
    };
    
  2. Определите выходные данные констант исправлений.

    // Output patch constant data.
    struct HS_CONSTANT_DATA_OUTPUT
    {
        float Edges[4]        : SV_TessFactor;
        float Inside[2]       : SV_InsideTessFactor;
    
        float3 vTangent[4]    : TANGENT;
        float2 vUV[4]         : TEXCOORD;
        float3 vTanUCorner[4] : TANUCORNER;
        float3 vTanVCorner[4] : TANVCORNER;
        float4 vCWts          : TANWEIGHTS;
    };
    

    Для квадратичного домена SV_TessFactor определяет 4 фактора тесселяции границ (чтобы тесселировать ребра), так как фиксированная функция тесселятора должна знать, насколько тесселировать. Необходимые выходные данные отличаются для областей треугольника и изолинии.

    Фиксированная функция tessellator не обращает внимание на другие выходные данные шейдера оболочки, такие как другие постоянные данные патча или какие-либо из контрольных точек. Шейдер домена, который вызывается для каждой точки, сгенерированной фиксированной функцией tessellator, получает на вход все точки управления, выходящие из шейдера корпуса, и все константные данные для патча; шейдер оценивает патч в его расположении.

  3. Определите функцию постоянного значения патча. Функция константы исправлений выполняется один раз для каждого исправления, чтобы вычислить все данные, которые являются константой для всего исправления (в отличие от данных точки управления, вычисляемых в шейдере корпуса).

    
    #define MAX_POINTS 32
    
    // Patch Constant Function
    HS_CONSTANT_DATA_OUTPUT SubDToBezierConstantsHS( 
        InputPatch<VS_CONTROL_POINT_OUTPUT, MAX_POINTS> ip,
        uint PatchID : SV_PrimitiveID )
    {   
        HS_CONSTANT_DATA_OUTPUT Output;
    
        // Insert code to compute Output here
    
        return Output;
    }
    

    Свойства функции константы исправлений включают:

    • Один вход указывает переменную, содержащую идентификатор исправления, и определяется системным значением SV_PrimitiveID (см. семантики в модели шейдера 4).
    • Один из входных параметров — это входные точки управления, объявленные в VS_CONTROL_POINT_OUTPUT в этом примере. Функция патча может видеть все входные контрольные точки для каждого патча, в этом примере есть 32 контрольные точки на патч.
    • Как минимум, функция должна вычислять факторы тесселяции для каждого патча на этапе тесселлятора, который определяется SV_TessFactor. Для четырехдоменной области требуются четыре фактора тесселляции для ребер и два дополнительных фактора (обозначенных SV_InsideTessFactor) для тесселляций внутри участка. Исправленная функция фиксированной обработки тесселятора не обращает внимания на выходные данные других шейдеров корпуса, такие как данные констант патча или любые другие контрольные точки.
    • Выходные данные обычно определяются структурой и опознаются как HS_CONSTANT_DATA_OUTPUT в этом примере; структура зависит от типа домена и будет отличаться для доменов треугольника или доменов изолиний.

    Шейдер домена, с другой стороны, вызывается для каждой точки, которую генерирует фиксированная функция тесселятора, и ему необходимо учитывать выходные точки управления и данные констант патча (оба поступают из шейдера корпуса) для оценки патча в его точке расположения.

  4. Определите шейдер корпуса. Шейдер корпуса определяет свойства патча, включая константную функцию патча. Шейдер корпуса вызывается один раз для каждой выходной точки управления.

    [domain("quad")]
    [partitioning("integer")]
    [outputtopology("triangle_cw")]
    [outputcontrolpoints(16)]
    [patchconstantfunc("SubDToBezierConstantsHS")]
    BEZIER_CONTROL_POINT SubDToBezierHS( 
        InputPatch<VS_CONTROL_POINT_OUTPUT, MAX_POINTS> ip, 
        uint i : SV_OutputControlPointID,
        uint PatchID : SV_PrimitiveID )
    {
        VS_CONTROL_POINT_OUTPUT Output;
    
        // Insert code to compute Output here.
    
        return Output;
    }
    

    Шейдер корпуса использует следующие атрибуты:

    • Атрибут домена .
    • Атрибут секционирования ,.
    • Атрибут выходной топологии.
    • Атрибут outputcontrolpoints.
    • Атрибут patchconstantfunc. Шейдер корпуса вычисляет выходные точки управления, в этом примере есть 16 выходных точек управления Bezier.

Все входные точки управления (идентифицированные VS_CONTROL_POINT_OUTPUT) видимы для каждого вызова шейдера корпуса. В этом примере имеется 32 входные точки управления.

Шейдер корпуса вызывается один раз на выходную точку управления (идентифицируется с SV_OutputControlPointID) для каждого исправления (идентифицируется с SV_PrimitiveID). Цель этого конкретного шейдера — вычислить контрольные точки на выходе i, которые были определены как точки управления BEZIER (в этом примере определено 16 контрольных точек на выходе).

Шейдер корпуса выполняет подпрограмму один раз на исправление (функция константы исправлений) для вычисления данных константы исправлений (факторы тесселяции как минимум). Отдельно шейдер корпуса запускает функцию константы исправлений (называется SubDToBezierConstantsHS) на каждом исправлении для вычисления данных константы исправлений, таких как факторы тесселлатора для этапа тесселлатора.

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

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