GLSL 效果示例
景深模糊:让焦平面从前景移到远景
提供颜色图与深度图,移动焦点时前后景交换清晰程度。
在线示例
修改右侧代码,左侧预览会实时更新。
观察什么
提供颜色图与深度图,移动焦点时前后景交换清晰程度。
实现原理
深度测试图从左到右变化,焦点参数决定哪一带清晰;散焦半径由深度差驱动。本例不处理前景遮挡泄漏。
找到控制效果的代码
float depth=texture2D(u_depth,uv).r,radius=abs(depth-u_parameter)*.045;vec3 sum=vec3(0.);float w=0.;for(int y=-3;y<=3;y++)for(int x=-3;x<=3;x++){vec2 o=vec2(float(x),float(y))/3.;if(dot(o,o)<=1.){sum+=texture2D(u_texture,uv+o*radius).rgb;w++;}}c=sum/w;
动手修改
把 u_parameter 先设为 0.25,再设为 0.75。深度测试图从左侧黑色渐变到右侧白色,因此 abs(depth-u_parameter)*.045 会让清晰竖带从左向右移动。
调试与成本
从 -3 到 3 的循环测试 49 个位置,只读取圆盘内的点,另读一次深度。把 .045 改成 .09,失焦半径会加倍;采样仍不检查邻点深度,因此不会解决前后景串色。