带有浮点值的片段着色器中的模糊操作

问题描述:

我试图通过将纹理(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模糊两次....... 我想使用浮点值,以便我得到一个模糊值之间的平滑过渡而不是步进值

我在做什么错?另外,还有什么其他方式可以在模糊值之间获得平滑过渡。

谢谢。

你有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