片段着色器模糊......这是如何工作的?

时间:2010-03-13 10:24:24

标签: fragment-shader

uniform sampler2D sampler0;
uniform vec2 tc_offset[9];
void blur()
{
  vec4 sample[9];
  for(int i = 0; i < 9; ++i)
    sample[i] = texture2D(sampler0, gl_TexCoord[0].st + tc_offset[i]);

  gl_FragColor = (sample[0] + (2.0 * sample[1]) + sample[2] +
      (2.0 * sample[3]) + sample[4] + 2.0 * sample[5] +
      sample[6] + 2.0 * sample[7] + sample[8] ) / 13.0;
}

样本[i] = texture2D(sample0,...)行是如何工作的?

似乎模糊图像,我必须首先生成图像,但在这里,我在某种程度上试图查询我正在生成的iamge。这是如何工作的?

3 个答案:

答案 0 :(得分:6)

它将模糊内核应用于图像。应用程序需要正确初始化tc_offset,以在实际纹理坐标周围形成3x3的采样点区域:

0   0   0
0   x   0
0   0   0

(假设x是原始坐标)。左上采样点的偏移量为-1/width,-1/height。中心点的偏移需要仔细对齐纹理中心(0.5度问题)。此外,硬件双线性滤波器可用于廉价地增加模糊量(通过在纹素之间采样)。

着色器的其余部分按照距离缩放样本。通常,这也是预先计算的:

for(int i = 0; i < NUM_SAMPLES; ++i) {
    result += texture2D(sampler,texcoord+offsetscaling[i].xy)*offsetscaling[i].z;
}

答案 1 :(得分:5)

一种方法是生成原始图像以渲染纹理,而不是屏幕。 然后使用此着色器绘制全屏四边形,并使用纹理作为后处理图像的输入。

答案 2 :(得分:4)

如您所知,为了制作模糊图像,您首先需要制作图像,然后将其模糊。此着色器(仅)执行第二步,拍摄先前生成的图像并使其模糊。其他地方需要额外的代码来生成原始的非模糊图像。