Pixel Shader单元需要一个采样器

时间:2014-06-20 08:44:24

标签: hlsl

我有一个HLSL像素着色器:

struct PixelShaderInput
{
    float4 pos : SV_POSITION;   
    float2 texCoord : TEXCOORD0;
};

Texture2D s_texture : register(t0);

cbuffer ColorConstantBuffer : register(b1)
{
    float4 m_color;
};

SamplerState s_sampleParams
{
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = CLAMP;
    AddressV = CLAMP;
};

float4 main(PixelShaderInput input) : SV_TARGET
{
    float4 t = s_texture.Sample(s_sampleParams, input.texCoord);
    return t * m_color;
}

它在视觉上很好用,但是垃圾邮件输出时带有警告:

D3D11警告:ID3D11DeviceContext :: Draw:Pixel Shader单元期望Sampler设置为Slot 0,但没有绑定。这是完全有效的,因为NULL Sampler映射到默认的Sampler状态。但是,开发人员可能不希望依赖默认值。 [执行警告#352:DEVICE_DRAW_SAMPLER_NOT_SET]

正如您所看到的,我已设置s_sampleParams所以有人可以解释出错了吗?

1 个答案:

答案 0 :(得分:6)

除非你使用效果框架,它将为你创建一个采样器(并在你在EffectPass上调用Apply时绑定它),使用普通的hlsl默认情况下不会创建采样器状态,所以你需要创建一个(如上所述{ {3}})

这里有一个详细版本,与您需要的采样器相匹配;

D3D11_SAMPLER_DESC samplerDesc;
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
samplerDesc.MipLODBias = 0.0f;
samplerDesc.MaxAnisotropy = 1;
samplerDesc.ComparisonFunc= D3D11_COMPARISON_NEVER;
samplerDesc.MinLOD = -FLT_MAX;
samplerDesc.MaxLOD = FLT_MAX;

请注意我将边框颜色保留为任何东西,因为你想要包裹它会使用它。

创建您的采样器:

ID3D11SamplerState* myLinearWrapSampler;
HRESULT hr = d3dDevice->CreateSamplerState(&samplerDesc, &myLinearWrapSampler);

然后致电:

deviceContext->PSSetSamplers(0,1, myLinearWrapSampler);

为了将采样器连接到像素着色器。

由于在您的情况下您的采样器设置与默认设置匹配,因此将采样器状态设置为null也是有效的(但我仍然建议创建一个以阐明意图,并避免运行时警告)