我有一个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
所以有人可以解释出错了吗?
答案 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也是有效的(但我仍然建议创建一个以阐明意图,并避免运行时警告)