在 Direct3D 10 (效果中組織狀態)
使用 Direct3D 10 時,特定管線階段的效果狀態是由下列結構所組織:
管線狀態 | 結構 |
---|---|
輸入組合器 | D3D10_INPUT_ELEMENT_DESC |
點陣化 | D3D10_RASTERIZER_DESC |
輸出合併 | D3D10_BLEND_DESC 和 D3D10_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 語法 中更完整地詳細說明。
相關主題