微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Unity Shader 自制无光照的光晕效果

这个光晕效果的关键是检测物体边缘,利用模型顶点到摄像机对象的方向和模型法线的夹角大小来判断,不多说上代码

Shader "Unlit/HaloShader"
{
  Properties
  {
    // 指定颜色,认为红色信号灯     halo_color("Color", Color) = (1, 0, 0, 1)
    // 手动调节闪烁频率     flicker("flicker", float) = 4.0   }   SubShader   {     Tags { "Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True" }     Pass     {       // 关闭深度写入       ZWrite Off       // 生成的颜色乘以 src,屏幕已有颜色乘以 dst       Blend SrcAlpha OneMinusSrcAlpha       CGPROGRAM       #include"UnityCG.cginc"       #pragma vertex vert       #pragma fragment frag       #define PI 3.14159265359       struct a2v       {         float4 pos : POSITION;         float3 n : norMAL;       };       struct v2f       {
        float4 pos : SV_POSITION;         float3 n : norMAL;         float3 dir : TEXCOORD0;       };       fixed4 halo_color;       float flicker;       v2f vert(a2v data)       {         v2f f;

        f.pos = UnityObjectToClipPos(data.pos);         f.n = data.n;         f.dir = normalize(ObjSpaceViewDir(data.pos));         return f;       }       fixed4 frag(v2f f) : SV_Target       {         // 计算 cos( x ) cos(x) 越接近1,则渲染的像素则越处于模型中心         float c = abs(dot(f.n, f.dir));         float pct = abs(sin(_Time * flicker * PI));         // 采用造型函数 y = abs(sin(x)) 得到一个闪烁的信号灯效果         // 调整 x 可以调解闪烁频率abs(sin(x * _Time * PI))         return pct * c * halo_color;       }       ENDCG     }   } }

 效果如下:

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐