Модуль пиксельного шейдера ожидает сэмплер

#hlsl

#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: модуль пиксельного шейдера ожидает, что сэмплер будет установлен в слот 0, но ни один из них не привязан. Это совершенно справедливо, так как НУЛЕВОЙ сэмплер соответствует состоянию сэмплера по умолчанию. Однако разработчик может не захотеть полагаться на значения по умолчанию. [ПРЕДУПРЕЖДЕНИЕ О ВЫПОЛНЕНИИ #352: DEVICE_DRAW_SAMPLER_NOT_SET]

Как вы можете видеть, я установил s_sampleParams , так что кто-нибудь может объяснить, что не так?

Ответ №1:

Если вы не используете effects framework, который создаст для вас сэмплер (и свяжет его при вызове Apply в EffectPass), использование обычного hlsl не создаст состояние сэмплера по умолчанию, поэтому вам нужно создать его (как описано здесь )

Вот подробная версия, которая соответствует нужному вам сэмплеру;

 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(amp;samplerDesc, amp;myLinearWrapSampler);
 

Затем вызовите:

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

Для того, чтобы подключить сэмплер к вашему пиксельному шейдеру.

Поскольку в вашем случае настройки вашего сэмплера соответствуют настройкам по умолчанию, установка состояния сэмплера равным null также допустима (но я бы все же рекомендовал создать его, чтобы уточнить намерение и избежать предупреждения во время выполнения)

Комментарии:

1. Итак, чтобы быть явным, код в скобках {} после s_sampleParams установки свойств сэмплера игнорируется, не имеет никакого эффекта?

2. Если вы не используете effects framework, он действительно игнорируется