GLSL 效果示例
散景光斑:把小亮点模糊成六边形
输入黑底亮点图,用光圈形状采样,和高斯模糊作对照。
在线示例
修改右侧代码,左侧预览会实时更新。
观察什么
输入黑底亮点图,用光圈形状采样,和高斯模糊作对照。
实现原理
只累加六边形光圈内的采样点,归一化权重,黑底亮点会扩散成光圈形状。
找到控制效果的代码
vec3 sum=vec3(0.);float w=0.;for(int y=-4;y<=4;y++)for(int x=-4;x<=4;x++){vec2 o=vec2(float(x),float(y))/4.;if(max(abs(o.y),abs(o.x)*.866+abs(o.y)*.5)<1.){sum+=texture2D(u_texture,uv+o*(.01+.07*u_parameter)).rgb;w++;}}c=sum/w;
动手修改
把光圈半径 .01+.07*u_parameter 改为 .06。测试图亮点会扩成固定大小的六边形斑块,拖动滑块不再改变其尺寸。
调试与成本
从 -4 到 4 的嵌套循环测试 81 个候选位置,只采样光圈内的点。把末尾 sum/w*4. 改成 sum/w,去掉显示增益,就能看到平均运算如何把亮点能量分摊到更大范围。