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,去掉显示增益,就能看到平均运算如何把亮点能量分摊到更大范围。

用到的内置函数

一步步学会这个效果