常见效果整理

该文章提供了一种UnityShader的实现,用于创建包括天牛质感、藤蔓生长、火焰燃烧等在内的多种视觉特效。Shader使用了包括BaseMap、NormalMap、Specular等贴图以及各种颜色和强度参数,支持自定义控制角色渲染和环境反射效果,适用于游戏或交互式项目的图形增强。
摘要由CSDN通过智能技术生成

1.天牛质感

请添加图片描述

ASE连接图
在这里插入图片描述

2.藤蔓生长

请添加图片描述

ASE连接图
在这里插入图片描述

3.魔镜世界

请添加图片描述

4.火焰燃烧

请添加图片描述
ASE连接图
请添加图片描述

5.钻石渲染

请添加图片描述
请添加图片描述
ASE连接图
请添加图片描述

6.晶体渲染

请添加图片描述
ASE连接图
请添加图片描述

7.星云能量体渲染

请添加图片描述

ASE连接图
请添加图片描述

ASE连接图
请添加图片描述

8.粘液效果渲染

请添加图片描述

ASE连接图
请添加图片描述

9.传送效果

请添加图片描述

ASE连接图
在这里插入图片描述

10.护盾效果

请添加图片描述
请添加图片描述
ASE连接图
请添加图片描述

11.二次元角色渲染

请添加图片描述

Shader "Toon_Standard"
{
    Properties
    {
        _BaseMap ("BaseMap", 2D) = "white" {}
        _NormalMap("NormalMap", 2D) = "bump" {}
        _AoMap("AoMap", 2D) = "white" {}
        _DiffuseRamp("DiffuseRamp", 2D) = "white" {}
        _TintLayer1("TintLayer1 color",color) =(0.5,0.5,0.5,1)
        _TintLayer1_offset("TintLayer1 0ffset", Range(-1,1)) = 0
        _TintLayer2("TintLayer2 color" ,color)= (0.5,0.5,0.5,1)
        _TintLayer2_offset("TintLayer2 0ffset", Range(-1,1)) = 0
        _TintLayer3("TintLayer3 color" ,color)= (0.5,0.5,0.5,1)
        _TintLayer3_offset("TintLayer3 0ffset", Range(-1,1)) = 0

        _SpecColor("Spec Color",color) = (0.5,0.5,0.5,1)
        _SpecIntensity("Spec Intensity",float)= 1
        _SpecShininess("Spec Shininess",float) = 100
        _SpecMap("SpecMap", 2D) = "white" {}

        _EnvMap( "Env Map", Cube)= "white" {}
        _Roughness("Roughness",Range(-1,1))=0
        _FresnelMin("Fresnel Min",Range(-1,2))= 0.5
        _FresnelMax("Fresnel Max" , Range(-1,2))=1
        _EnvIntensity("Env Intensity",float)= 1

        _OutlineColor("Outline Color", color) = (0,0,0,1)
        _Outline (" Outline Width", float) =1


    }
    SubShader
    {
        Tags
        {
            "RenderType"="Opaque"
        }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "Autolight.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 texcoord0 : TEXCOORD0;
                float3 normal :NORMAL;
                float4 tangent :TANGENT;
                float4 color : COLOR;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                float3 normalDir :TEXCOORD1;
                float3 tangentDir :TEXCOORD2;
                float3 binormalDir :TEXCOORD3;
                float3 posWold :TEXCOORD4;
                float3 vertexColor :TEXCOORD5;
            };

            sampler2D _BaseMap;
            sampler2D _NormalMap;
            sampler2D _AoMap;
            sampler2D _DiffuseRamp;
            float4 _TintLayer1;
            float _TintLayer1_offset;
            float4 _TintLayer2;
            float _TintLayer2_offset;
            float4 _TintLayer3;
            float _TintLayer3_offset;
            float _TintLayer3_Softness;

            float4 _SpecColor;
            float _SpecIntensity;
            float _SpecShininess;
            sampler2D _SpecMap;

            samplerCUBE _EnvMap;
            float4 _EnvMap_HDR;
            float _Roughness;
            float _FresnelMin;
            float _FresnelMax;
            float _EnvIntensity;

            v2f vert(appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.normalDir = normalize(UnityObjectToWorldNormal(v.normal));
                o.tangentDir = normalize(mul(unity_ObjectToWorld, float4(v.tangent.xyz, 0.0))).xyz;
                o.binormalDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w);
                o.vertexColor = v.color;
                o.uv = v.texcoord0;
                return o;
            }

            half4 frag(v2f i) : SV_Target
            {
                //向量
                half3 normalDir = i.normalDir;
                half3 tangentDir = i.tangentDir;
                half3 binormalDir = i.binormalDir;
                half3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
                half3 viewDir = normalize(_WorldSpaceCameraPos - i.posWold.xyz);

                //贴图数据
                half3 base_color = tex2D(_BaseMap, i.uv);
                half ao = tex2D(_AoMap, i.uv).r;
                half4 spec_map = tex2D(_SpecMap, i.uv);
                half spec_mask = spec_map.b;
                half spec_smoothness = spec_map.a;
                //法线贴图
                float4 normalMap = tex2D(_NormalMap, i.uv);
                float3 normalData = UnpackNormal(normalMap);
                float3x3 TBN = float3x3(tangentDir, binormalDir, normalDir);
                normalDir = normalize(mul(normalData, TBN));

                //漫反射
                half NdotL = dot(normalDir, lightDir);
                half half_lambert = (NdotL + 1.0) * 0.5;
                half diffuse_term = half_lambert * ao;

                //第一层上色
                half3 final_diffuse = half3(0.0, 0.0, 0.0);
                half2 uv_ramp1 = half2(diffuse_term + _TintLayer1_offset, 0.5);
                half toon_diffuse1 = tex2D(_DiffuseRamp, uv_ramp1).r;
                half3 tint_color1 = lerp(half3(1, 1, 1), _TintLayer1.rgb, toon_diffuse1 * _TintLayer1.a);
                final_diffuse = base_color * tint_color1;

                //第二层上色
                half2 uv_ramp2 = half2(diffuse_term + _TintLayer2_offset, 1 - i.vertexColor.g);
                half toon_diffuse2 = tex2D(_DiffuseRamp, uv_ramp2).g;
                half3 tint_color2 = lerp(half3(1, 1, 1), _TintLayer2.rgb, toon_diffuse2 * _TintLayer2.a);
                final_diffuse = final_diffuse * tint_color2;

                //第三层上色
                half2 uv_ramp3 = half2(diffuse_term + _TintLayer3_offset, 1 - i.vertexColor.b);
                half toon_diffuse3 = tex2D(_DiffuseRamp, uv_ramp3).b;
                half3 tint_color3 = lerp(half3(1, 1, 1), _TintLayer3.rgb, toon_diffuse3 * _TintLayer3.a);
                final_diffuse = final_diffuse * tint_color3;

                //高光反射
                half3 H = normalize(lightDir + viewDir);
                half NdotH = dot(normalDir, H);
                half spec_term = max(0.0001, pow(NdotH, _SpecShininess * spec_smoothness)) * ao;
                half3 final_spec = spec_term * _SpecColor * _SpecIntensity * spec_mask;

                //环境反射/边缘光
                half fresnel = 1.0 - dot(normalDir, viewDir);
                fresnel = smoothstep(_FresnelMin, _FresnelMax, fresnel);
                half3 reflectDir = reflect(-viewDir, normalDir);
                float roughness = lerp(0.0, 0.95, saturate(_Roughness));
                roughness = roughness * (1.7 - 0.7 * roughness);
                float mip_level = roughness * 6.0;
                half4 color_cubemap = texCUBElod(_EnvMap, float4(reflectDir, mip_level));
                half3 env_color = DecodeHDR(color_cubemap, _EnvMap_HDR);
                half3 final_env = env_color * fresnel * _EnvIntensity * spec_mask;
                half3 final_color = final_diffuse + final_spec + final_env;
                return float4(final_color, 1.0);
            }
            ENDCG
        }

        Pass
        {
            Cull Front
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnitycG.cginc"
            sampler2D _BaseMap;
            float _Outline;
            float _OutlineZbias;
            float4 _OutlineColor;

            struct appdata
            {
                float4 vertex: POSITION;
                float3 normal: NORMAL;
                float2 texcoord0: TEXCOORD0;
                float4 color: COLOR;
            };

            struct v2f
            {
                float4 pos: SV_POSITION;
                float2 uv:TEXCOORD0;
                float4 vertex_color : TEXCOORD1;
            };

            v2f vert(appdata v)
            {
                v2f o;
                float3 normal_world = UnityObjectToWorldNormal(v.normal);
                float3 pos_view = UnityObjectToViewPos(v.vertex);
                float3 outline_dir = normalize(mul((float3x3)UNITY_MATRIX_V, normal_world));
                pos_view = pos_view + outline_dir * _Outline * 0.001 * v.color.a;
                o.pos = mul(UNITY_MATRIX_P, float4(pos_view, 1.0));
                o.uv = v.texcoord0.xy;
                o.vertex_color = v.color;
                return o;
            }

            float4 frag(v2f i): COLOR
            {
                float3 basecolor = tex2D(_BaseMap, i.uv.xy).xyz;
                half maxComponent = max(max(basecolor.r, basecolor.g), basecolor.b) - 0.004;
                half3 saturatedcolor = step(maxComponent.rrr, basecolor) * basecolor;
                saturatedcolor = lerp(basecolor.rgb, saturatedcolor, 0.6);
                half3 outlineColor = 0.8 * saturatedcolor * basecolor * _OutlineColor.xyz;
                return float4(outlineColor, 1.0);
            }
            ENDCG
        }
    }
    FallBack "Standard"
}

项目地址 https://gitee.com/yasine/shader

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值