HLSL中取樣器關聯紋理的方法
阿新 • • 發佈:2019-02-13
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物件對應的通道
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物件對應的通道