Shader学习21——基于菲涅尔透明的扫描线

看到人家这样的一个效果,于是想自己也复制一个

Mar-26-2021 17-16-26.gif

想了一下思路,应该是菲涅尔的做的一个透明效果(单纯的菲涅尔透明可以看这篇),再去做了一个线的效果,线应该可以用纹理做性能更好,但本篇用计算做了个线。最终效果如下
Mar-26-2021 17-21-35.gif

代码如下:

Shader "Class/简单应用/扫描线透明菲涅尔"
{
    Properties{
        _Speed("Speed", Float) = 1  //扫描线移动速度
        //扫描线位置
        _DiscardFactor("DiscardFactor",Range(-2,2)) = 0.0
        //扫描线移动方向
        [KeywordEnum(LeftRight, UpDown, Around)] _Dir("Dir", Float) = 0
        //扫描线移动顺序-正反
        [KeywordEnum(JUST, BACK)] _ORDER("ORDER", Float) = 0
        //切口光的颜色
        _LightColor("LightColor",Color) = (1,1,1,1)
        //光的宽度
        _LightWidth("LightWidth",Range(0.0,0.1))=0.05

        _RimColor("RimColor", Color) = (1,1,1,1) //边缘光颜色
        _RimPower("RimPower",Range(0,2)) =0 //边缘光强度
    }
    SubShader{
        Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
        Pass {
            // 只有定义了正确的LightMode才能得到一些Unity的内置光照变量
            Tags { "LightMode"="ForwardBase"}

            LOD 200

            Blend SrcAlpha One //开启Blend混合,设置源颜色和目标颜色混合因子,混合模式可以多尝试,会有不同的效果


            CGPROGRAM
            #include "UnityCG.cginc"
            // 包含unity的内置的文件,才可以使用Unity内置的一些变量
            #pragma vertex vert
            #pragma fragment frag
            //设定宏定义
            #pragma multi_compile _DIR_LEFTRIGHT  _DIR_UPDOWN  _DIR_AROUND
            #pragma multi_compile _ORDER_JUST  _ORDER_BACK

            float _Speed;
            float _DiscardFactor;
            float4 _LightColor;
            float _LightWidth;

            fixed4 _RimColor;
            float _RimPower;
            struct a2v
            {
                float4 vertex : POSITION;    // 告诉Unity把模型空间下的顶点坐标填充给vertex属性
                float3 normal : NORMAL;        // 不再使用模型自带的法线。保留该变量是因为切线空间是通过(模型里的)法线和(模型里的)切线确定的。
            };

            struct v2f
            {
                float4 vertex : SV_POSITION; // 声明用来存储顶点在裁剪空间下的坐标
                float3 normal : NORMAL;  
                float3 worldPos:TEXCOORD0;
                float3 viewDir : TEXCOORD1;

            };

            // 计算顶点坐标从模型坐标系转换到裁剪面坐标系
            v2f vert(a2v v)
            {
                v2f o;
                //顶点坐标转换
                // 该步骤用来把一个坐标从模型空间转换到剪裁空间
                o.vertex = UnityObjectToClipPos(v.vertex); 

                //获取法线(把法线方向从模型空间转换到世界空间)。
                o.normal = UnityObjectToWorldNormal(v.normal);

                //顶点坐标转世界坐标
                o.worldPos= mul(unity_ObjectToWorld, v.vertex).xyz;

                //世界空间中从该点到摄像机的观察方向
                o.viewDir = normalize(UnityWorldSpaceViewDir(o.worldPos));
                return o;
            }

            fixed4 frag(v2f i) : SV_Target 
            {
                /**************************根据时间移动线******************************/
                float time = 2-fmod(_Time.z*_Speed , 4);  
                _DiscardFactor=time;
                /********************************************************/

                /**************************扫描线位置******************************/
                float factor =0;

                #if defined(_DIR_LEFTRIGHT)
                    factor = i.worldPos.x;
                #elif defined(_DIR_UPDOWN)
                    factor = i.worldPos.y;
                #elif defined(_DIR_AROUND)
                    factor = i.worldPos.z;
                #endif
                /********************************************************/
                
                /**************************实现扫描线******************************/
                fixed4 linecol=fixed4(0.0,0.0,0.0,0.0);
                #if defined(_ORDER_JUST)
                    //factor<_DiscardFactor的部分已经被裁减,剩下的部分在加个边界做切面的描边
                    if (factor>_DiscardFactor&&factor < _DiscardFactor+_LightWidth)
                    //从边界逐渐过度
                    linecol= _LightColor*smoothstep(_DiscardFactor+_LightWidth,_DiscardFactor,factor);
                #elif defined(_ORDER_BACK)
                    if (factor*-1>_DiscardFactor&&factor*-1< _DiscardFactor+_LightWidth)
                    linecol= _LightColor*(1-smoothstep(_DiscardFactor+_LightWidth,_DiscardFactor,factor*-1));
                #endif
                /********************************************************/

                /**************************边缘光实现******************************/
                //摄像机角度
                float3 view = normalize(i.viewDir);
                //摄像机入射角度和法线点乘,得出摄像机和法线的角度关系
                float NdotV = dot(i.normal,view);
                //菲涅尔 越接近边缘_RimPower - NdotV越大,然后筛除<0的数,乘以颜色
                float3 fresnel = _RimColor * saturate(_RimPower - NdotV)+linecol;
                /********************************************************/
                float alpha=smoothstep(0.0,0.5,(fresnel.r+fresnel.g+fresnel.b)*0.333);
                return fixed4(fresnel,alpha); //色彩叠加后与贴图颜色相乘
            }

            ENDCG
        }
        
    }
    FallBack "Diffuse"
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容