Cara: Mendesain Shader Domain

Shader domain adalah yang ketiga dari tiga tahap yang bekerja sama untuk mengimplementasikan tessellation. Shader domain menghasilkan geometri permukaan dari titik kontrol yang diubah dari shader lambung dan koordinat UV. Topik ini menunjukkan cara mendesain shader domain.

Shader domain dipanggil sekali untuk setiap titik yang dihasilkan oleh tessellator fungsi tetap. Input adalah koordinat UV[W] dari titik pada patch, serta semua data output dari shader lambung termasuk titik kontrol dan konstanta patch. Output adalah puncak yang didefinisikan dengan cara apa pun yang diinginkan. Jika output dikirim ke shader piksel, output harus menyertakan posisi (ditandai dengan semantik SV_Position).

Untuk mendesain shader domain

  1. Tentukan atribut domain.

    [domain("quad")]
    

    Domain didefinisikan untuk patch quad.

  2. Nyatakan lokasi di lambung kapal dengan nilai sistem lokasi domain .

    • Untuk patch quad, gunakan float2.
    • Untuk patch tri, gunakan float3 (untuk koordinat barycentric)
    • Untuk isoline, gunakan float2.

    Oleh karena itu, lokasi domain untuk patch quad terlihat seperti ini:

    float2 UV : SV_DomainLocation
    
  3. Tentukan input lainnya.

    Input lain berasal dari shader lambung dan didefinisikan pengguna. Ini termasuk titik kontrol input untuk patch, yang mungkin ada antara 1 dan 32 titik, dan data konstanta patch input.

    Titik kontrol ditentukan pengguna, biasanya dengan struktur seperti ini (didefinisikan dalam Cara: Mendesain Hull Shader):

    const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
    

    Data konstanta patch juga ditentukan pengguna, dan mungkin terlihat seperti ini (didefinisikan dalam Cara: Mendesain Hull Shader):

    HS_CONSTANT_DATA_OUTPUT input
    
  4. Tambahkan kode yang ditentukan pengguna untuk menghitung output; ini membentuk isi shader domain.

    Struktur ini berisi output shader domain yang ditentukan pengguna.

    struct DS_OUTPUT
    {
        float3 vNormal    : NORMAL;
        float2 vUV        : TEXCOORD;
        float3 vTangent   : TANGENT;
        float3 vBiTangent : BITANGENT;
    
        float4 vPosition  : SV_POSITION;
    };
    

    Fungsi ini mengambil setiap UV input (dari tesselator) dan mengevaluasi patch Bezier pada posisi ini.

    [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;    
    }
    

    Fungsi ini dipanggil sekali untuk setiap titik yang dihasilkan oleh tessellator fungsi tetap. Karena contoh ini menggunakan patch quad, lokasi domain input (SV_DomainLocation) adalah float2 (UV); patch tri akan memiliki lokasi input float3 (koordinat barycentric UVW), dan isoline akan memiliki lokasi domain input float2.

    Input lain untuk fungsi berasal dari shader lambung secara langsung. Dalam contoh ini adalah 16 titik kontrol yang masing-masing menjadi BEZIER_CONTROL_POINT, serta data konstanta patch (HS_CONSTANT_DATA_OUTPUT). Output adalah vertex yang berisi data apa pun yang diinginkan - DS_OUTPUT dalam contoh ini.

Setelah merancang shader domain, lihat Cara: Membuat Shader Domain.

Cara Menggunakan Direct3D 11

Gambaran Umum Tessellation