使用浮点值

时间:2017-04-25 15:59:20

标签: floating-point glsl fragment-shader framebuffer depth-buffer

我正在尝试通过将纹理(myTexture)附加到我的framebuffer对象来在片段着色器中执行模糊操作。它适用于此代码:

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模糊两次....... 我想使用浮点值,以便在模糊值之间获得平滑过渡而不是步进值

我做错了什么?此外,还有其他方法可以在模糊值之间进行平滑过渡。

感谢。

1 个答案:

答案 0 :(得分:0)

你有两个问题:

  1. 使用sum/40

    进行标准化

    而不是常量40,您应该除以第一个代码中~(2*10*depth)^2的加法数。第二个代码是错误的......

  2. 第二段
  3. 错误循环

    你的第二个块的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

  4. 进行规范化