2010-03-13 60 views
3
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

回答

4

正如您所看到的,爲了製作出模糊的圖像,您首先需要製作圖像,然後將其模糊。這個着色器確實(僅)第二步,拍攝先前生成的圖像並將其模糊。在其他地方需要額外的代碼來生成原始的非模糊圖像。

6

它將模糊內核應用於圖像。 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; 
} 
5

的方法之一是生成你的原始圖像渲染到紋理,而不是到屏幕上。 然後,使用此着色器和紋理輸入後處理圖像,然後繪製全屏四邊形。