【发布时间】: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