1. 程式人生 > >HLSL中取樣器關聯紋理的方法

HLSL中取樣器關聯紋理的方法

HLSL中的取樣器實際上一個結構型別,PixelShader程式使用取樣器指定被取樣紋理、紋理過濾方式和紋理定址模式,取樣器的使用語法大致如下: 
texture tex0;   // 宣告一個紋理物件 
sampler2D s_2D = sampler_state  // 宣告一個取樣器物件 

    Texture = <tex0>;         // 指定被取樣的紋理 
    MinFilter = Linear;       // 紋理過濾方式 
    MagFilter = Linear; 
    AddressU = Wrap;          // 紋理定址模式 
    AddressV = Wrap; 

}; 
float4 PS_Main(float2 tex : TEXCOORD0) : COLOR 

return tex2D(s_2D, texcoord); // 畫素渲染程式返回結果為紋理取樣顏色 
} 

    以上畫素渲染程式程式碼中,並沒有明確指定取樣器s_2D對應的是紋理(tex0物件並沒有被賦值),然而在多紋理取樣的程式中,是需要明確指定取樣器所取樣的紋理對應第幾個通道(最多8個通道,通過Device的SetTexture指定)的紋理。 有兩種方法指定取樣器對應的紋理: 
1)通過指定取樣器暫存器來繫結所取樣的紋理: 
sampler2D sColor : register(s0);    // 繫結通道0中的紋理 

sampler2D sNormal : register(s1);   // 繫結通道1中的紋理
2)通過ConstantTable介面獲取畫素渲染程式中全域性texture物件的RegisterIndex,從而把紋理設定到相應的通道: 
LPD3DXCONSTANTTABLE pConstantTable = NULL; 
D3DXCompileShaderFromFile( 
     "ps_multitex.txt", 
     0, 
     0, 
     "PS_Main", 
     "ps_1_1", 
     D3DXSHADER_DEBUG, 
     &shader, 
     &errorBuffer, 

     &pConstantTable); 
D3DXHANDLE hTex0 = pConstantTable->GetConstantByName(0, "tex0"); 
UINT count; 
D3DXCONSTANT_DESC Tex0Desc; 
pConstantTable->GetConstantDesc(hTex0, &Tex0Desc, &count); 
pDevice->SetTexture(Tex0Desc.RegisterIndex, pTexture0);     // 設定紋理到tex0物件對應的通道