1.效果
更改设定的偏移值可以达到光束动起来的效果.
2.原理
首先,将当前uv通过与左乘矩阵绕原点顺时针旋转30度,然后再乘以二,将当前像素点的亮度乘以lerp(1,0,uv.y)(即(1 – f )* a + b * f,旋转过后,处于x轴上的点所得到亮度最大,将得到的值转化为0-1内的变量,乘以当前uv对应的图片上的rgb即可.
除此之外,通过对当前uv乘以2可以让一半儿的uv所对应的插值小于0,只有uv小于0.5的才可能uv值大于0.然后再对uv.y进行相应的加减操作可以让光束出现的图片上任意位置.
3.代码
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 Shader "Custom/闪光" { 2 Properties { 3 _MainTex ("Base (RGB)", 2D) = "white" {} 4 _Percent("Percent",range(-4,3))=0.5 5 } 6 SubShader { 7 Tags { "RenderType"="Opaque" } 8 LOD 200 9 10 CGPROGRAM 11 #pragma surface surf Lambert 12 13 sampler2D _MainTex; 14 float _Percent; 15 16 struct Input { 17 float2 uv_MainTex; 18 }; 19 20 void surf (Input IN, inout SurfaceOutput o) { 21 half4 c = tex2D (_MainTex, IN.uv_MainTex); 22 o.Albedo = c.rgb; 23 o.Alpha = c.a; 24 float2 blink_uv=(IN.uv_MainTex+_Percent)*2; 25 //旋转矩阵 26 fixed2x2 rotMat=fixed2x2(0.866,0.5,-0.5,0.866); 27 blink_uv=mul(rotMat,blink_uv); 28 fixed rgba=lerp(1,0,abs(blink_uv.y)); 29 30 o.Albedo+=saturate(rgba); 31 32 } 33 ENDCG 34 } 35 FallBack "Diffuse" 36 }