【问题标题】:Blur operation in fragment shader with floating point values具有浮点值的片段着色器中的模糊操作
【发布时间】:2017-04-25 15:59:20
【问题描述】:

我正在尝试通过将纹理(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 模糊两次...... 我想使用浮点值,以便在模糊值而不是阶梯值之间获得平滑过渡

我做错了什么?另外,有没有其他方法可以在模糊值之间实现平滑过渡。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    你有 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 进行标准化

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 2013-08-01
      • 1970-01-01
      • 2021-03-31
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      相关资源
      最近更新 更多