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

问题描述:

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。这个怎么用?

+0

@skaffman:为什么c标签? – anon 2010-03-13 23:11:23

正如您所看到的,为了制作出模糊的图像,您首先需要制作图像,然后将其模糊。这个着色器确实(仅)第二步,拍摄先前生成的图像并将其模糊。在其他地方需要额外的代码来生成原始的非模糊图像。

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

0 0 0 
0 x 0 
0 0 0 

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

着色器的其余部分按比例缩放样本。通常情况下,这是预先计算以及:

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

的方法之一是生成你的原始图像渲染到纹理,而不是到屏幕上。 然后,使用此着色器和纹理输入后处理图像,然后绘制全屏四边形。