RhinoFreak 发表于 2022-1-27 21:05

unity 里常用的 shader 特效

总结一些在 unity 里比较常用的特效,并给出核心代码,不定时更新。总得来说都不复杂,适合新人学习。
一、死亡溶解特效


shader 属性为:
        Properties
        {
                _MainTex ("Texture", 2D) = "white" {}//主纹理
                _NoiseTex("Noise", 2D) = "white" {}//噪声纹理
                _Threshold("Threshold", Range(0.0, 1.0)) = 0.5//消融阀值
                _EdgeLength("Edge Length", Range(0.0, 0.2)) = 0.1//边缘宽度
                _EdgeFirstColor("First Edge Color", Color) = (1,1,1,1)//边缘颜色值1
                _EdgeSecondColor("Second Edge Color", Color) = (1,1,1,1)//边缘颜色值2
        }Tags 为常规设置
Tags { "Queue"="Geometry" "RenderType"="Opaque" }//标签进入Pass
Cull Off //要渲染背面保证效果正确
核心代码:
struct a2v//顶点着色器输入结构体
                        {
                                float4 vertex : POSITION;
                                float2 uv : TEXCOORD0;
                        };

                        struct v2f
                        {
                                float4 vertex : SV_POSITION;
                                float2 uvMainTex : TEXCOORD0;
                                float2 uvNoiseTex : TEXCOORD1;
                        };

                        sampler2D _MainTex;
                        float4 _MainTex_ST;
                        sampler2D _NoiseTex;
                        float4 _NoiseTex_ST;
                        float _Threshold;
                        float _EdgeLength;
                        fixed4 _EdgeFirstColor;
                        fixed4 _EdgeSecondColor;
                       
                        v2f vert (a2v v)//顶点着色器
                        {
                                v2f o;
                                o.vertex = UnityObjectToClipPos(v.vertex);//将顶点坐标变化到剪裁坐标系
                                o.uvMainTex = TRANSFORM_TEX(v.uv, _MainTex);//进行主纹理坐标变换
                                o.uvNoiseTex = TRANSFORM_TEX(v.uv, _NoiseTex);//进行噪声纹理坐标变换
                                return o;
                        }
                       
                        fixed4 frag (v2f i) : SV_Target//片元着色器
                        {
                                fixed cutout = tex2D(_NoiseTex, i.uvNoiseTex).r;//获取灰度图的R通道
                                clip(cutout - _Threshold);//根据消融阀值裁剪片元

                                float degree = saturate((cutout - _Threshold) / _EdgeLength);//规范化
                                fixed4 edgeColor = lerp(_EdgeFirstColor, _EdgeSecondColor, degree);//对颜色值进行插值

                                fixed4 col = tex2D(_MainTex, i.uvMainTex);//对主纹理进行采样

                                fixed4 finalColor = lerp(edgeColor, col, degree);//对边缘颜色与片元颜色进行插值
                                return fixed4(finalColor.rgb, 1);
                        }
二、常用于新手引导界面里的:


这种效果看起来是在 image 里扣个洞,允许一部分区域能被点击到。这种其实有两种比较常见的方法。一是继承 Graphics 类,重写 OnPopulateMesh( ) 这个函数,自己组件 mesh 网格,但是我不太喜欢这种方法,麻烦不说,要是遇到圆形区域可点击怎么办?这里介绍第二种,直接用 shader 来实现。同时介绍下如何实现一个新人引导系统,这个很常用而且并不复杂。
首先来看矩形可点区域,这部分代码非常简单,就不给出具体的代码了,核心代码如下:
color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);其中 UnityGet2DClipping 函数位于 UnityUI.cginc 里,用之前记得 include 进来。在这个文件里对 UnityGet2DClipping 的定义如下:
inline float UnityGet2DClipping (in float2 position, in float4 clipRect)
{
    float2 inside = step(clipRect.xy, position.xy) * step(position.xy, clipRect.zw);
    return inside.x * inside.y;
}非常浅显易懂,即当输入点 position 在一个矩形框 Rect 内,返回 1,否则为 0。由于使用了透明效果,记得加上
      ZWrite Off
      Blend SrcAlpha OneMinusSrcAlpha我只需要在 C# 脚本里传入矩形坐标即可。
接下来来看圆形可点区域:
                color.a *= (distance(IN.worldPosition.xy,_Center.xy) > _Radius);只需要设置好圆心 _Center 的坐标和 半径 _Radius 即可。
这里说下如何做一个常见的新手引导功能。先做好一个 UI 面板,背景为一个铺满全屏的 image, 透明黑色,使用上面所述的矩形可点 shader 或圆形可点 shader,再加一个手指的图片,如果有对话框的还要加上对话框UI,然后写一个控制器来控制它的创建、销毁和行为,就叫 TeacherMgr 吧。
然后在 excel 表里进行配置。给每个触发新手引导的地方编号,在 C# 脚本里对应的用个枚举值代替。
新手引导配置表里设置好如下基础数据配置:
手势位置(如果是滑动引导,则可能有两个位置)、可点击区域的大小、对话框位置、对话框里的内容。
然后在每个触发点调用新手引导功能方法

睡觉了,未完待续...

DomDomm 发表于 2022-1-27 21:11

感谢大佬分享,冲
页: [1]
查看完整版本: unity 里常用的 shader 特效