Shader攻占笔记(零)难以分类的效果们

“主角光环”

在这里插入图片描述
实现了基础的圆形遮罩;灯塔使用MagicaVoxel搭建,模仿光柱追踪效果(虽然灯塔本身导入后似乎没有发光效果
在这里插入图片描述
脚本部分核心代码(与教材同):

#region 圆环内容
        radiusMaterial.SetVector("_Center", transform.position);
        radiusMaterial.SetColor("_RadiusColor", color);
        radiusMaterial.SetFloat("_Radius", radius);
#endregion

shader部分核心代码:

//圆环------
            //最后再进行圆环的处理,直接覆盖在原有的地表
            float d = distance(_Center, IN.worldPos);
            if(d<_Radius)  
            {
            	//在半径内的区域显示指定环贴图部分;半径外为地表部分
                finalColor = radiusTex.rgb * _RadiusColor;
            }
            o.Albedo = finalColor;
            o.Alpha = 1;

在这里插入图片描述

完整shader代码:

Shader "Custom/sd_snow"
{
    Properties
    {
        _MainColor("Main Color", Color) = (1,1,1,1)
        _MainTex("Base(RGB)",2D) = "white"{}
        _Bump("Bump", 2D) = "bump"{}
        _Level("Level of Snow", Range(0,1)) = 0.2
        _SnowDepth("Depth of Snow",Range(0,1)) = 0.3
        _SnowDirection("Direction of Snow",Vector) = (0,1,0)

        //角色圆环
        _Center("Center", Vector) = (0,0,0,0)   //player位置
        _Radius("Radius", Float) = 0.5          //图案半径
        _RadiusColor("Radius Color", Color) = (1,0,0,1)     //图案染色
        _RadiusTex("Radius Tex", 2D) = ""{}                 //图案贴图
        
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard vertex:vert
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _Bump;
        sampler2D _RadiusTex;
        struct Input
        {
            float2 uv_MainTex;
            float2 uv_Bump;
            float3 worldNormal;
            INTERNAL_DATA
            float2 uv_RadiusTex;
            float3 worldPos;
        };
        fixed4 _MainColor;
        float _SnowDepth;
        fixed _Level;
        float4 _SnowDirection;
        //圆环
        float3 _Center;
        float _Radius;
        float3 _RadiusColor;

        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            fixed3 radiusTex = tex2D(_RadiusTex, IN.uv_RadiusTex).rgb;  //圆环图案
            float3 finalColor;

            //雪
            if(dot(WorldNormalVector(IN, o.Normal),_SnowDirection.xyz) >= (1 - _Level))
            {
                //有雪的情况
                finalColor = _MainColor;
                o.Normal = UnpackNormal(tex2D(_Bump, IN.uv_Bump));;
            }
            else
                finalColor = c.rgb;

            //圆环------
            //最后再进行圆环的处理,直接覆盖在原有的地表
            float d = distance(_Center, IN.worldPos);
            if(d<_Radius)  
            {
                //在半径内的区域显示指定环贴图部分;半径外为地表部分
                finalColor = radiusTex.rgb * _RadiusColor;
            }
            o.Albedo = finalColor;
            o.Alpha = 1;
        }

        void vert(inout appdata_full v)
        {
            float4 sn = mul(UNITY_MATRIX_IT_MV, _SnowDirection);
            if(dot(v.normal, sn.xyz)>=_Level)
            v.vertex.xyz += (sn.xyz + v.normal) * _SnowDepth * _Level;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

崩坏圈环

姑且先叫这个名字,还没有仔细研究,先放着存档
在这里插入图片描述

Shader "Custom/sd_Gexiangyixing"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _SpecularColor("specular Color", Color) = (1,1,1,1)
        _Specular("Specular Amount", Range(0, 1)) = 0.5
        _Glossiness("Glossiness", Range(0, 1)) = 0.5
        _AnisoDir("Anisotropic Direction", 2D) = ""{}
        _AnisoOffset("Anisotropic Offset", Range(-1, 1)) = -0.2
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Anisotropic
        #pragma target 3.0

        sampler2D _MainTex, _AnisoDir;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_AnisoDir;
        };

        half _Glossiness;
        half4 _SpecularColor;
        half _Specular;
        float _AnisoOffset;
        fixed4 _Color;

        struct SurfaceAnisoOutput
        {
            fixed3 Albedo;
            fixed3 Normal;
            fixed3 Emission;
            fixed3 AnisoDirection;
            half Specular;
            fixed Gloss;
            fixed Alpha;
        };
        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceAnisoOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            float3 anisoTex = UnpackNormal(tex2D(_AnisoDir, IN.uv_AnisoDir));
            o.AnisoDirection = anisoTex;                //Aniso Tex Info
            o.Specular = _Specular;
            o.Gloss = _Glossiness;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }

        half4 LightingAnisotropic(SurfaceAnisoOutput s, float3 lightDir, float3 viewDir, fixed atten)
        {
            //形容该点光照强度
            float NdotL = max(0.01, dot(s.Normal, lightDir));

            //通过 Blinn 半角公式得到高光点
            fixed3 halfVector = normalize(normalize(lightDir) + normalize(viewDir));
            fixed NdotH = dot(normalize(s.Normal + s.AnisoDirection), halfVector);
            //
            //float aniso = max(0, sin(radians(NdotH + _AnisoOffset) * 180));
            float aniso = max(0, sin((NdotH + _AnisoOffset) * 200));

            float spec = saturate(pow(aniso, s.Gloss * 128) * s.Specular);

            fixed4 c;
            c.rgb = ((s.Albedo * _LightColor0.rgb * NdotL) + 
                    (_LightColor0.rgb * _SpecularColor.rgb * spec)) * (atten);
            c.a = 1.0;
            return c;
        }

        ENDCG
    }
    FallBack "Diffuse"
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值