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

4
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;
}

sample[i] = texture2D(sample0, ...) 这行代码是如何工作的?

看起来像是要模糊一张图片,但是在这里,我似乎需要先生成这张图片,然后查询我正在生成的图片。这个是如何运作的呢?

3个回答

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;
}

5

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


4

正如您所提到的,要制作模糊图像,您首先需要制作一张图像,然后再对其进行模糊处理。这个着色器只执行第二步操作,接受之前生成的图像并对其进行模糊处理。其他地方需要有额外的代码来生成原始的非模糊图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接