GLSL 效果示例

雷达扫描:旋转的光束扫亮目标再慢慢淡出

各目标按扇叶上次经过的角度衰减,单帧即可计算余辉。

在线示例

修改右侧代码,左侧预览会实时更新。

观察什么

各目标按扇叶上次经过的角度衰减,单帧即可计算余辉。

实现原理

以当前扫描角与目标角的模差计算距上次扫过的时间,因此静态目标的余辉不需要上一帧缓冲。

找到控制效果的代码

float ang=atan(p.y,p.x),r=length(p),sweep=u_time*(.3+u_parameter);float age=mod(sweep-ang+6.28318,6.28318);float grid=exp(-abs(fract(r*5.)-.5)*90.);c+=vec3(.05,.6,.25)*(exp(-age*2.)*.55+grid*.15)*step(r,.85);for(int i=0;i<6;i++){float fi=float(i);vec2 pt=(.25+.08*fi)*vec2(cos(fi*2.3),sin(fi*2.3));float a=atan(pt.y,pt.x);c+=vec3(.3,1.,.5)*exp(-length(p-pt)*160.)*exp(-mod(sweep-a+6.28318,6.28318)*1.4);}

动手修改

把两处余辉指数中的 *1.4 改为 *3.。扫描扇区和目标亮点会在光束扫过后更快淡去,目标位置仍保持固定。

调试与成本

循环计算六个目标位置,余辉来自角度差表示的时间,而非反馈缓冲。把 i<6 改为 i<3,只保留三个目标后,扫描网格本身仍不受目标数量影响。

用到的内置函数

一步步学会这个效果