Share via


在 Direct3D 10 (效果中組織狀態)

使用 Direct3D 10 時,特定管線階段的效果狀態是由下列結構所組織:

管線狀態 結構
輸入組合器 D3D10_INPUT_ELEMENT_DESC
點陣化 D3D10_RASTERIZER_DESC
輸出合併 D3D10_BLEND_DESCD3D10_DEPTH_STENCIL_DESC

 

針對著色器階段,其中狀態變更數目需要由應用程式更受控制,狀態已分成常數緩衝區狀態、取樣器狀態和著色器資源狀態。 這可讓仔細設計的應用程式只更新正在變更的狀態,藉由減少需要傳遞至 GPU 的資料量來改善效能。

那麼,您要如何以效果組織管線狀態?

答案是,順序並不重要。 全域變數不一定位於頂端。 不過,SDK 中的所有範例會遵循相同的順序,因為最好以相同方式組織資料。 因此,這是 DirectX SDK 範例中資料排序的簡短描述。

全域變數

就像標準 C 做法一樣,全域變數會先在檔案頂端宣告。 通常,這些是應用程式將初始化的變數,然後用於效果中。 有時候會初始化它們,而且永遠不會變更,其他時候則會更新每個畫面。 就像 C 函式範圍規則一樣,在效果函式範圍之外宣告的效果變數在整個效果中都是可見的;在效果函式內宣告的任何變數,只會在該函式內顯示。

以下是 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;
};

效果變數的 語法在 Direct3D 10 (Direct3D 10) 中更完整地詳細說明。 效果紋理取樣器的語法在 DirectX HLSL () 的 Sampler Type (更詳細。

著色器

著色器是小型可執行檔程式。 您可以將著色器視為封裝著色器狀態,因為 HLSL 程式碼會實作著色器功能。 管線使用三種不同的著色器。

  • 頂點著色器 - 在頂點資料上操作。 中的一個頂點會產生一個頂點。
  • 幾何著色器 - 在基本資料上操作。 中的一個基本類型可能會產生 0、1 或許多基本類型。
  • 圖元著色器 - 對圖元資料進行操作。 中的一個圖元會產生 1 圖元輸出 (,除非圖元從轉譯) 中清除。

著色器是本機函式,並遵循 C 樣式函式規則。 編譯效果時,會編譯每個著色器,並在內部儲存每個著色器函式的指標。 編譯成功時,會傳回 ID3D10Effect 介面。 此時,編譯的效果會是中繼格式。

若要深入瞭解已編譯的著色器,您必須使用著色器反映。 這基本上就像要求執行時間將著色器分解,並將有關著色器程式碼的資訊傳回給您。

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

效果著色器的 語法在 Direct3D 10) 的 Effect 函式語法 (更完整地詳細說明。

技術和傳遞

技術是轉譯階段的集合, (必須至少有一個傳遞) 。 每個效果傳遞 (與轉譯迴圈中的單一傳遞類似,) 定義轉譯幾何所需的著色器狀態和任何其他管線狀態。

以下是一種技術範例, (包含來自 BasicHLSL10.fx 的一個傳遞) 。

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

效果著色器的語法在 Direct3D 10 () 的 Direct3D 10 語法 中更完整地詳細說明。

Direct3D 10 (效果)