您是否为多个纹理使用多个SamplerStates

时间:2012-12-20 22:10:13

标签: directx hlsl

如果我将两个纹理传递给HLSL着色器,我还需要两个SamplerState吗?我对SamplerStates的实际工作方式感到有些困惑。我从来没有实例化它们或任何东西,我只是打电话给

Tex.Sample(sampler, pos);

我正在为配置文件9.3编译我的着色器(WP8,如果这有任何区别)

示例着色器:

Texture2D InputTexture;
SamplerState Sampler;

float4 PSMain(float2 pos: TEXCOORD, float4 SVP : SV_POSITION) : SV_TARGET {  
    float4 image = InputTexture.Sample(Sampler, pos);   
    return image;   
}

technique  {
    pass {
        Profile = 9.3;
        PixelShader = PSMain;
    }
}

1 个答案:

答案 0 :(得分:3)

你想做什么叫做多纹理。

SamplerState对象包含采样和过滤选项,采样器允许您使用该选项从纹理中读取数据。

您可以设置许多采样器状态:

Filter
AddressU
AddressV
AddressW
MipLODBias
MaxAnisotropy
ComparisonFunc
BorderColor
MinLOD
MaxLOD

在Direct3D 10中,语法如下:

//example
SamplerState mySampler{
    Filter = MIN_MAG_MIP_LINEAR; //sets min/mag/mip filter to linear
    AddressU = Wrap;
    AddressV = Wrap;
};

Here您可以找到默认值和here州的一些含义。

毕竟我可以说你需要SamplerState的数量取决于你想要达到什么样的效果。但实际上,您的代码可能就像:

Texture2D InputTextures[2];
SamplerState Sampler;

float4 PSMain(float2 pos: TEXCOORD, float4 SVP : SV_POSITION) : SV_TARGET {
    float4 color = InputTexture[0].Sample(Sampler, pos) * InputTexture[1].Sample(Sampler, pos);
    return color;  
}

事实上你可以看到你只需要将纹理的两种颜色相乘就可以得到一个多纹理对象。