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我生成。这是如何工作的?

有帮助吗?

解决方案

当你注意,为了使模糊的图像,你首先需要做一个图像,然后对其进行模糊处理。此着色器确实(恰好)在第二步骤中,取先前生成的图像和模糊它。需要有额外的代码别处,以产生原始的非模糊图像。

其他提示

它适用模糊核的图像。 tc_offset需要由应用程序进行正确的初始化,以形成的采样点的3×3区域周围的实际纹理坐标:

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

的一种方法是产生原始的图像渲染到纹理,而不是在屏幕上。 然后你使用这种着色以及纹理,因为它的输入到后处理画一个全屏幕的四图像。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top