Сверточный фильтр выводит неправильные значения цвета
Я только начал изучать 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 )