片段着色器模糊...这是如何工作的?
问题描述:
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
。中心点的偏移量需要仔细对准texel中心(off-by-0.5问题)。此外,可以使用硬件双线性滤波器来廉价地增加模糊量(通过纹理元素之间的采样)。
着色器的其余部分按比例缩放样本。通常情况下,这是预先计算以及:
for(int i = 0; i < NUM_SAMPLES; ++i) {
result += texture2D(sampler,texcoord+offsetscaling[i].xy)*offsetscaling[i].z;
}
答
的方法之一是生成你的原始图像渲染到纹理,而不是到屏幕上。 然后,使用此着色器和纹理输入后处理图像,然后绘制全屏四边形。
@skaffman:为什么c标签? – anon 2010-03-13 23:11:23