Shader攻占笔记(二)全息效果

简单的描边.ver

在这里插入图片描述
不清楚为什么不能加法线,待补充。

Shader "Custom/sd_Silhouette3D"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _NormalMap("Normal Map", 2D) = "white"{}
        _DotProduct("Rim effect 边缘效果", Range(0, 1)) = 0.5
    }
    SubShader
    {
        Tags
        {
            "RenderType" = "Transparent"
            "IgnoreProjector" = "True"
            "Queue" = "Transparent"
        }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert alpha:fade nolighting
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _NormalMap;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_NormalMap;
            float3 worldNormal;
            float3 viewDir;
            INTERNAL_DATA
        };

        fixed _DotProduct;
        fixed4 _Color;
        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            //o.Normal = tex2D(_NormalMap, IN.uv_NormalMap);加上后alpha显示失效
            float border = 1 - (abs(dot(IN.viewDir, IN.worldNormal)));
            float alpha = border * (1 - _DotProduct) + _DotProduct;
            o.Alpha = c.a * alpha;
            
        }
        ENDCG
    }
    FallBack "Diffuse"
}

波纹噪点.ver

在这里插入图片描述
在这里插入图片描述

Shader "Custom/sd_Silhouette3D"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _DotProduct("Rim effect 边缘效果", Range(0, 1)) = 0.5
        //线条
        _LinesMap("线条纹样", 2D) = ""{}
        _LinesDensity("线条速度",Range(0, 5)) = 1
        //噪声扰动
        _NoiseMap("Noise Map", 2D) = ""{}
        _NoiseIntensity("Intensity of Noise", Range(0, 0.5)) = 0.2
        //发光
        _RimPower("Rim Power", Range(0.5, 8.0)) = 3
        _RimColor("Rim Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags
        {
            "RenderType" = "Transparent"
            "IgnoreProjector" = "True"
            "Queue" = "Transparent"
        }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert alpha:fade nolighting
        #pragma target 4.0

        sampler2D _MainTex, _LinesMap;
        sampler2D _NoiseMap;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_LinesMap;
            float2 uv_NoiseMap;
            float3 worldNormal;
            float3 viewDir;
            INTERNAL_DATA
        };
        fixed _DotProduct;
        fixed4 _Color;
        fixed _LinesDensity;
        fixed _NoiseIntensity;
        fixed _RimPower;
        fixed3 _RimColor;

        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutput o)
        {
            //噪声-----------------------------------
            //使用一张滚动的噪声图
            fixed3 noise = tex2D(_NoiseMap, IN.uv_NoiseMap + _Time);

            //颜色-----------------------------------
            //和课本上的全息内容基本一样,留出一个模型边缘
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            float border = 1 - (abs(dot(IN.viewDir, IN.worldNormal)));
            float alpha = border * (1 - _DotProduct) + _DotProduct;
            o.Albedo = c.rgb;

            //纹线------------------------------------
            //将滚动的UV转化为世界坐标,不论怎样翻转,纹线干扰波的方向不变,比较符合投影设备逻辑。
            fixed scrollLine =  _LinesDensity * noise.x *_NoiseIntensity;                 //噪声使用
            fixed3 LineUV = mul(unity_ObjectToWorld, IN.uv_LinesMap + _Time);             //转换为世界空间
            fixed3 lineMap = tex2D(_LinesMap, LineUV + scrollLine);

            //发光------------------------------------
            half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal)); 
            o.Emission = _RimColor.rgb * pow (rim, _RimPower);

            //Alpha最终赋值-------------------------------
            //纹线的部分镂空处理;将纹线的某个值(反正是黑白的所以只使用了r值)四舍五入取整,
            //白色部分和原有的alpha做减法(抠掉)后,再化为0~1范围内的数;0.2为控制图片范围设置的常数
            o.Alpha = saturate(c.a * alpha - round(lineMap.r + 0.2));
            
        }
        ENDCG
    }
    FallBack "Diffuse"
}
     ENDCG
    }
    FallBack "Diffuse"
}

加了点bloom
加了点bloom以表全息图像边缘的闪烁效果

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值