Bagikan melalui


Mengatur Status dalam Efek (Direct3D 10)

Dengan Direct3D 10, status efek untuk tahap alur tertentu diatur oleh struktur berikut:

Status Alur Struktur
Perakitan Input D3D10_INPUT_ELEMENT_DESC
Rasterisasi D3D10_RASTERIZER_DESC
Penggabungan Output D3D10_BLEND_DESC dan D3D10_DEPTH_STENCIL_DESC

 

Untuk tahap shader, di mana jumlah perubahan status perlu lebih dikontrol oleh aplikasi, status telah dibagi menjadi status buffer konstan, status sampler, dan status sumber daya shader. Ini memungkinkan aplikasi yang dirancang dengan hati-hati untuk memperbarui hanya status yang berubah, yang meningkatkan performa dengan mengurangi jumlah data yang perlu diteruskan ke GPU.

Jadi bagaimana Anda mengatur status alur dalam efek?

Jawabannya adalah, urutannya tidak masalah. Variabel global tidak harus terletak di bagian atas. Namun, semua sampel dalam SDK mengikuti urutan yang sama, karena merupakan praktik yang baik untuk mengatur data dengan cara yang sama. Jadi ini adalah deskripsi singkat tentang urutan data dalam sampel DirectX SDK.

Variabel Global

Sama seperti praktik C standar, variabel global dideklarasikan terlebih dahulu, di bagian atas file. Paling sering, ini adalah variabel yang akan diinisialisasi oleh aplikasi, dan kemudian digunakan dalam efek. Terkadang mereka diinisialisasi dan tidak pernah diubah, di lain waktu mereka diperbarui setiap bingkai. Sama seperti aturan cakupan fungsi C, variabel efek yang dinyatakan di luar lingkup fungsi efek terlihat di seluruh efek; variabel apa pun yang dideklarasikan di dalam fungsi efek hanya terlihat dalam fungsi tersebut.

Berikut adalah contoh variabel yang dideklarasikan dalam BasicHLSL10.fx.

// Global variables
float4 g_MaterialAmbientColor;      // Material's ambient color

Texture2D g_MeshTexture;            // Color texture for mesh

float    g_fTime;                   // App's time in seconds
float4x4 g_mWorld;                  // World matrix for object
float4x4 g_mWorldViewProjection;    // World * View * Projection matrix


// Texture samplers
SamplerState MeshTextureSampler
{
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};

Sintaks untuk variabel efek lebih terperinci dalam Sintaks Variabel Efek (Direct3D 10). Sintaks untuk sampler tekstur efek lebih terperinci dalam Jenis Sampler (DirectX HLSL).

Efek gambar

Shader adalah program kecil yang dapat dieksekusi. Anda dapat menganggap shader sebagai enkapsulasi status shader, karena kode HLSL mengimplementasikan fungsionalitas shader. Alur menggunakan tiga jenis shader yang berbeda.

  • Shader Vertex - Beroperasi pada data vertex. Satu puncak dalam menghasilkan satu puncak keluar.
  • Pemecah geometri - Beroperasi pada data primitif. Satu primitif dalam dapat menghasilkan 0, 1, atau banyak primitif keluar.
  • Pemecah piksel - Beroperasi pada data piksel. Satu piksel dalam menghasilkan 1 piksel keluar (kecuali piksel dimusnahkan dari render).

Shader adalah fungsi lokal dan mengikuti aturan fungsi gaya C. Saat efek dikompilasi, setiap shader dikompilasi dan pointer ke setiap fungsi shader disimpan secara internal. Antarmuka ID3D10Effect dikembalikan ketika kompilasi berhasil. Pada titik ini efek yang dikompilasi dalam format perantara.

Untuk mengetahui informasi lebih lanjut tentang shader yang dikompilasi, Anda harus menggunakan refleksi shader. Ini pada dasarnya seperti meminta runtime untuk mendekompilasi shader, dan mengembalikan informasi kembali kepada Anda tentang kode shader.

struct VS_OUTPUT
{
    float4 Position   : SV_POSITION; // vertex position 
    float4 Diffuse    : COLOR0;      // vertex diffuse color
    float2 TextureUV  : TEXCOORD0;   // vertex texture coords 
};

VS_OUTPUT RenderSceneVS( float4 vPos : POSITION,
                         float3 vNormal : NORMAL,
                         float2 vTexCoord0 : TEXCOORD,
                         uniform int nNumLights,
                         uniform bool bTexture,
                         uniform bool bAnimate )
{
    VS_OUTPUT Output;
    float3 vNormalWorldSpace;
 
    ....    
    
    return Output;    
}


struct PS_OUTPUT
{
    float4 RGBColor : SV_Target;  // Pixel color
};

PS_OUTPUT RenderScenePS( VS_OUTPUT In,
                         uniform bool bTexture ) 
{ 
    PS_OUTPUT Output;

    if( bTexture )
        Output.RGBColor = g_MeshTexture.Sample(MeshTextureSampler, In.TextureUV) * In.Diffuse;
    ....

    return Output;
}

Sintaks untuk shader efek lebih terperinci sepenuhnya dalam Sintaks Fungsi Efek (Direct3D 10).

Teknik dan Pass

Teknik adalah kumpulan pass penyajian (setidaknya harus ada satu pass). Setiap pass efek (yang mirip dalam cakupan ke satu pass dalam perulangan render) menentukan status shader dan status alur lain yang diperlukan untuk merender geometri.

Berikut adalah contoh satu teknik (yang mencakup satu pass) dari BasicHLSL10.fx.

technique10 RenderSceneWithTexture1Light
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0, RenderSceneVS( 1, true, true ) ) );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_4_0, RenderScenePS( true ) ) );
    }
}

Sintaks untuk shader efek lebih terperinci sepenuhnya dalam Sintaks Teknik Efek (Direct3D 10).

Efek (Direct3D 10)