0

我試圖通過將紋理(myTexture)附加到我的幀緩衝區對象來在片段着色器中執行模糊操作。它的工作原理與此代碼:帶有浮點值的片段着色器中的模糊操作

vec3 blur(float depth){ 
float dx = 1.0f/800; 
float dy = 1.0f/800; 
vec3 sum = vec3(0,0,0); 
int dep=depth*10; 
for(int i=-dep;i<dep;i++) 
for(int j=-dep;j<dep;j++) 
    sum += texture(myTexture, otex + vec2(i * dx, j * dy)).xyz; 
return sum/40; 
} 

但如果我把它改成下面的代碼,它不工作(在屏幕變白出於某種原因,可能是它的讀取距離我的深度紋理,但我不知道爲什麼)

vec3 blur(float depth){ 
float dx = 1.0f/800; 
float dy = 1.0f/800; 
vec3 sum = vec3(0,0,0); 
float dep=depth*10; 
for(float i=dep;i<dep;i+=0.2f) 
for(float j=dep;j<dep;j+=0.2f) 
    sum += texture(myTexture, otex + vec2(i * dx, j * dy)).xyz; 
return sum/40; 
} 

我試圖這樣做的原因是因爲我想根據對象的深度值模糊。如果物體很遠,模糊更多。如果靠近,模糊較少。 如果我使用第一個代碼,我得到一個階梯模糊,即,如果深度是0.3模糊三次,如果深度是0.2模糊兩次....... 我想使用浮點值,以便我得到一個模糊值之間的平滑過渡而不是步進值

我在做什麼錯?另外,還有什麼其他方式可以在模糊值之間獲得平滑過渡。

謝謝。

回答

0

你有2個問題:

  1. 正常化sum/40

    ,而不是不斷40你應該增加的數量是在第一代碼~(2*10*depth)^2劃分。第二個代碼是錯誤的...

  2. 錯環排在第二碼

    產生的第二個塊的sum(0,0,0)所以它應該是黑色的,除非你正在做的在此之上的東西。因爲你有錯誤:

    for(float i=dep;i<dep;i+=0.2f) 
    for(float j=dep;j<dep;j+=0.2f) 
    

    它永遠不會進去。我假設你想這個:在這種情況下

    for(float i=-dep;i<dep;i+=0.2f) 
    for(float j=-dep;j<dep;j+=0.2f) 
    

    你應該正常化~(2*10*5*depth)^2

相關問題