在着色器上使用卷积矩阵的高斯模糊

时间:2013-04-24 21:13:06

标签: c++ filter shader blur gaussian

我正在尝试在着色器上使用卷积矩阵实现高斯模糊。

这是我的代码:

float4 ppPS(float2 uv : TEXCOORD0, uniform sampler2D t1) : COLOR { 
  //kernel matrix
  float3x3 kernel={1*(1/16),2*(1/16),1*(1/16),
  2*(1/16),4*(1/16),2*(1/16),
  1*(1/16),2*(1/16),1*(1/16)
  };

  int x,y;
  float2 sum = 0;
  for (x = -1; x <= 1; x++)
  {
    for (y = -1; y <= 1; y++)
    {
      float2 fl;
      fl.x = uv.x+x;
      fl.y = uv.y+y; 
      sum += (fl)*(kernel[x+1][y+1]);
    }
  }
  return tex2D(t1, sum);
 }

但出于某种原因,我得到一张纯色的照片。

这是没有模糊的图像:

non blur

这是带有所谓模糊的图像:

with blur

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

尝试将 float3x3 初始化值更改为浮点格式(。0f),否则所有值都将以0结尾。

 //kernel matrix
 static const float3x3 kernel={1*(1.0f/16.0f),2*(1.0f/16.0f),1*(1.0f/16.0f),
 2*(1.0f/16.0f),4*(1.0f/16.0f),2*(1.0f/16.0f),
 1*(1.0f/16.0f),2*(1.0f/16.0f),1*(1.0f/16.0f)
};

在此更改后,您将看不到空白输出图像!!!