Сверточный фильтр выводит неправильные значения цвета

Я только начал изучать 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 пикселей.

Это мое входное изображение:

Входное изображение

И это вывод, который я получаю:

Выходное изображение

Любая помощь будет принята с благодарностью.

Спасибо

1 ответ

Решение

Вы суммируете только 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 )
Другие вопросы по тегам