像素着色器中的 SamplerState 问题

Posted

技术标签:

【中文标题】像素着色器中的 SamplerState 问题【英文标题】:SamplerState issue in the pixel shader 【发布时间】:2020-06-15 22:58:00 【问题描述】:

我的像素着色器有问题,它编译但不渲染任何东西,而是 Directx 给出了这个错误: D3D11 错误:ID3D11DeviceContext::DrawIndexed:像素着色器单元期望将配置为默认过滤的采样器设置在插槽 0,但绑定在此插槽的采样器配置为比较过滤。如果使用采样器,这种不匹配将产生未定义的行为(例如,由于着色器代码分支,它不会被跳过)。 [执行错误#390:DEVICE_DRAW_SAMPLER_MISMATCH]。 这是我的着色器:

struct PixelInput

 float4 position: SV_POSITION;
 float4 color : COLOR;
 float2 UV: TEXCOORD0;

;

//globals
SamplerState ss;
Texture2D shaderTex;

float4 TexturePixelShader(PixelInput input) : SV_TARGET

 float4 texColors;

 texColors = shaderTex.Sample(ss, input.UV);

 return texColors;

采样器创建:

samplerDesc.Filter = D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR;
    samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
    samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
    samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
    samplerDesc.MipLODBias = 0.0f;
    samplerDesc.MaxAnisotropy = 1;
    samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
    samplerDesc.BorderColor[0] = 0;
    samplerDesc.BorderColor[1] = 0;
    samplerDesc.BorderColor[2] = 0;
    samplerDesc.BorderColor[3] = 0;
    samplerDesc.MinLOD = 0;
    samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
    result = device->CreateSamplerState(&samplerDesc,  &m_SS);
    if (FAILED(result))
        return false;
    return true;

及渲染功能:

void TextureShader::RenderShader(ID3D11DeviceContext* ctxt, int indexCount)

    ctxt->IASetInputLayout(m_layout);

    ctxt->VSSetShader(m_vertexShader, NULL, 0);
    ctxt->PSSetShader(m_pixelShader, NULL, 0);
    ctxt->PSSetSamplers(0, 1, &m_SS);
    ctxt->DrawIndexed(indexCount, 0, 0);

    return;

【问题讨论】:

【参考方案1】:

您将您的采样器声明为比较采样器:

samplerDesc.Filter = D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR;

应该是:

samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;

比较采样器主要用于阴影贴图,在 hlsl 中声明如下:

SamplerComparisonState myComparisonSampler;
myTexture.SampleCmp(myComparisonSampler, texCoord);

【讨论】:

【参考方案2】:

HLSL 中的SamplerState 是一种“效果”构造,仅适用于fx_* 配置文件并使用EFfects for Direct3D 11 运行时。

对于您的情况下的着色器绑定,请使用:

sampler ss : register(s0);
Texture2D<flaot4> shaderTex : register(t0);

【讨论】:

以上是关于像素着色器中的 SamplerState 问题的主要内容,如果未能解决你的问题,请参考以下文章

此像素着色器中的漫反射和镜面反射

在片段着色器中绘制别名像素完美线?

统一按钮在着色器中丢弃像素

pow(0, 2.2) 在 hlsl 像素着色器中给出 1?

顶点纹理获取(在顶点着色器中读取纹理)

你能改变金属着色器中采样器的边界吗?