• 带高光的头发shader


    效果如下:

     代码如下:

    Shader "America/Character/America-Diffuse-Specular-Hair2"
    {
        Properties
        {
            _Color ("Main Color", Color) = (1,1,1,1)
            _MainTex ("Base (RGB)", 2D) = "white" {}
            _Ramp ("Toon Ramp (RGB)", 2D) = "gray" {}
            _Cutoff( "Cutoff", Range (0,1)) = 0.5
            
            _OverlyingColor("Overlying Color", Color) = (0.5, 0.5, 0.5, 1)
            
            _SpecularGloss ("Specular Gloss", float) = 20
            _AnisotropyBias("Anisotropy-Bias", Range( -1 , 1)) = -1
            _DiffuseRate ("Diffuse Rate", float) = 2
            _SpecularRate ("Specular Rate", float) = 0.6
        }
    
        SubShader
        {
            Tags 
            {
                "RenderType" = "Transparent"
                "IgnoreProjector" = "True"
                "Queue" = "Transparent+100"
            }
            LOD 200
    
            Pass
            {
                Tags
                {
                    "LightMode" = "ForwardBase"
                }
                Blend SrcAlpha OneMinusSrcAlpha
                Cull Off
    
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #pragma multi_compile_fwdbase
    
                #include "UnityCG.cginc"
                #include "AutoLight.cginc"
                #include "Lighting.cginc"
                
                #include "../AmericaCG.cginc"
    
                fixed4 _Color;
                sampler2D _MainTex;
                sampler2D _Ramp;
                float _Cutoff;
                fixed4 _OverlyingColor;
                float _SpecularGloss;
                half _AnisotropyBias;
                float _DiffuseRate;
                float _SpecularRate;
                
                struct appdata
                {
                    float4 vertex : POSITION;
                    float2 uv : TEXCOORD0;
                    float3 normal : NORMAL;
                    float4 tangent : TANGENT;
                };
    
                struct v2f
                {
                    float4 pos : SV_POSITION;
                    float2 uv : TEXCOORD0;
                    float4 T2W1 : TEXCOORD1;
                    float4 T2W2 : TEXCOORD2;
                    float4 T2W3 : TEXCOORD3;
                };
    
                v2f vert(appdata v)
                {
                    v2f o;
                    o.pos = UnityObjectToClipPos(v.vertex);
                    o.uv = v.uv;
                    
                    float3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);
                    float3 worldNormal = UnityObjectToWorldNormal(v.normal);
                    float3 binormal = cross(normalize(worldNormal), normalize(worldTangent)) * v.tangent.w;
                    float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                    o.T2W1 = float4(worldTangent.x, binormal.x, worldNormal.x, worldPos.x);
                    o.T2W2 = float4(worldTangent.y, binormal.y, worldNormal.y, worldPos.y);
                    o.T2W3 = float4(worldTangent.z, binormal.z, worldNormal.z, worldPos.z);
                    return o;
                }
    
                fixed4 frag(v2f i) : SV_TARGET
                {
                    float3 worldPos = float3(i.T2W1.w, i.T2W2.w, i.T2W3.w);
                    float3 worldNormal = float3(i.T2W1.z, i.T2W2.z, i.T2W3.z);
                    //float3 worldTangent = float3(i.T2W1.x, i.T2W2.x, i.T2W3.x);
                    float3 worldBitangent = float3(i.T2W1.y, i.T2W2.y, i.T2W3.y);
                    
                    float3 worldLight = normalize(UnityWorldSpaceLightDir(worldPos));
                    float3 worldView = normalize(UnityWorldSpaceViewDir(worldPos));
                    
                    fixed4 albedo = tex2D(_MainTex, i.uv) * _Color;
                    clip(albedo.a - _Cutoff);
    
                    fixed3 ambient = albedo.rgb * UNITY_LIGHTMODEL_AMBIENT.rgb;
    
                    float d = dot(worldLight, worldNormal) * 0.5 + 0.5;
                    fixed3 rampCol = tex2D(_Ramp, float2(d, d)).rgb;
                    fixed3 diffuse = albedo.rgb * _LightColor0.rgb * rampCol;
                    
                    // spec
                    float clampSpec = clamp(albedo.r + albedo.g * _AnisotropyBias - 0.2 , -1.0 , 1.33);
                    float dotSpec = dot(worldBitangent + worldNormal * clampSpec, worldView);
                    fixed3 specular = _LightColor0.rgb * pow(1 - dotSpec * dotSpec, _SpecularGloss);
                    specular = clamp(specular, float3(0,0,0), half3(1.51,1.51,1.51));
    
                    fixed4 col = fixed4(ambient + diffuse * _DiffuseRate + specular * _SpecularRate, albedo.a);
                    col.rgb = Overlay(col, _OverlyingColor);
    
                    return col;
                }
    
                ENDCG
            }
    
            Pass
            {
                Tags
                {
                    "LightMode" = "ForwardBase"
                }
                Blend SrcAlpha OneMinusSrcAlpha
                ZWrite Off
    
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #pragma multi_compile_fwdbase
    
                #include "UnityCG.cginc"
                #include "AutoLight.cginc"
                #include "Lighting.cginc"
    
                #include "../AmericaCG.cginc"
                
                fixed4 _Color;
                sampler2D _MainTex;
                sampler2D _Ramp;
                float _Cutoff;
                fixed4 _OverlyingColor;
                float _DiffuseRate;
                
                struct appdata
                {
                    float4 vertex : POSITION;
                    float2 uv : TEXCOORD0;
                    float3 normal : NORMAL;
                };
    
                struct v2f
                {
                    float4 pos : SV_POSITION;
                    float2 uv : TEXCOORD0;
                    float3 worldPos : TEXCOORD1;
                    float3 worldNormal : TEXCOORD2;
                };
    
                v2f vert(appdata v)
                {
                    v2f o;
                    o.pos = UnityObjectToClipPos(v.vertex);
                    o.uv = v.uv;
                    o.worldPos = mul(unity_ObjectToWorld, v.vertex);
                    o.worldNormal = UnityObjectToWorldNormal(v.normal);
                    return o;
                }
    
                fixed4 frag(v2f i) : SV_TARGET
                {
                    fixed4 albedo = tex2D(_MainTex, i.uv) * _Color;
                    clip(_Cutoff - albedo.a);
    
                    fixed3 ambient = albedo.rgb * UNITY_LIGHTMODEL_AMBIENT.rgb;
    
                    fixed3 worldLight = normalize(UnityWorldSpaceLightDir(i.worldPos));
                    float d = dot(worldLight, i.worldNormal) * 0.5 + 0.5;
                    fixed3 rampCol = tex2D(_Ramp, float2(d, d)).rgb;
                    fixed3 diffuse = albedo.rgb * _LightColor0.rgb * rampCol;
                    
                    fixed4 col = fixed4(ambient + diffuse * _DiffuseRate, albedo.a);
                    col.rgb = Overlay(col, _OverlyingColor);
    
                    return col;
                }
    
                ENDCG
            }
            
            
        } 
    
        Fallback "Diffuse"
    }

    转载请注明出处:https://www.cnblogs.com/jietian331/p/13345454.html

  • 相关阅读:
    MySQL-Front的安装简介
    【翻译】如何通过使用两台电脑变得更加有效率
    Vim学习资源汇总
    21天战拖记——Day1:不算好的开始(2014-05-04)
    课时97.背景定位上(掌握)
    课时96.背景平铺(掌握)
    课时95.背景图片(掌握)
    课时94.背景颜色(掌握)
    课时93.百度首页(理解)
    课时92.CSS元素显示模式转换(掌握)
  • 原文地址:https://www.cnblogs.com/jietian331/p/13345454.html
Copyright © 2020-2023  润新知