我刚刚开始学习 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 像素大小。
这是我的输入图像:
这是我得到的输出:
任何帮助将不胜感激。
感谢:D