卷积滤镜输出错误的颜色值

时间:2014-07-25 17:23:42

标签: directx hlsl directx-11 convolution directcompute

我刚开始学习DirectCompute并且出于学习目的,我想制作一个模糊纹理的简单卷积滤镜。我编写了以下计算着色器来模糊纹理:

Texture2D<float4> inputTex;
RWTexture2D<float4> outputTex;

[numthreads(32, 32, 1)]
void main( uint3 DTid : SV_DispatchThreadID )
{
    float4 totalPixVal = float4( 0.0f, 0.0f, 0.0f, 0.0f );
    for ( int y = -3; y < 3; ++y )
        for ( int x = -3; x < 3; ++x )
            totalPixVal += inputTex.Load( uint3(DTid.x + x, DTid.y + y, DTid.z) );

    totalPixVal = float4( totalPixVal.xyz / 49.0f, 1.0f );

    float4 inPix       = inputTex.Load( DTid );
    outputTex[DTid.xy] = totalPixVal;
}

我使用以下参数调用:

DeviceContext->Dispatch( inputTexture->Width / 32, inputTexture->Height / 32, 1 );

此着色器采用当前像素及其48个邻居的平均颜色值,这会导致模糊效果。

现在模糊部分工作正常,但着色器输出的颜色似乎不正确。为了测试着色器,我在黑色背景上使用了纯白色形状的简单图像。我期望的输出是黑色背景上的模糊纯白色形状,但白色形状不再是白色,它是灰色的。现在我已经多次查看了我的代码,我无法找到问题所在。每个纹理都具有512x512像素的相同大小。

这是我的输入图片:

Input image

这是我得到的输出:

Output image

非常感谢任何帮助。

谢谢:D

1 个答案:

答案 0 :(得分:2)

您只需要总计36个像素,而不是49个。更改:

for ( int y = -3; y < 3; ++y )
    for ( int x = -3; x < 3; ++x )

为:

for ( int y = -3; y <= 3; ++y )
    for ( int x = -3; x <= 3; ++x )