2

如果我将两个纹理传递给 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;
    }
}
4

1 回答 1

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

在这里您可以找到默认值以及状态一些含义。

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

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

事实上,如您所见,您只需将纹理的两种颜色相乘即可获得多纹理对象。

于 2012-12-28T09:10:04.057 回答