Search Unity

Question Lightmap mode changes the display of the outline...

Discussion in 'Shaders' started by laurentlavigne, Jun 2, 2020.

  1. laurentlavigne

    laurentlavigne

    Joined:
    Aug 16, 2012
    Posts:
    6,331
    Substractive:
    upload_2020-6-2_3-10-55.png
    Shadowmask:
    upload_2020-6-2_3-11-44.png
    the metallic part loses its outline and I don't know why.
    Anyone has an idea how to fix that?

    Code (CSharp):
    1.   Shader "SG/SG Reflect" {
    2.     Properties {
    3.     [HDR]        _Color ("Color",Color) = (1,1,1,1)
    4.       _MainTex ("Texture", 2D) = "white" {}
    5.       //_Cube ("Cubemap", CUBE) = "" {}
    6.         _Metallic ("Metallic", RANGE(0,1)) = 0.5
    7.         _Smoothness ("Smoothness", RANGE(0,1)) = 1
    8.       _HealColor ("Heal Color", Color) = (0,1,0,1)
    9.       _HealPulseVal ("Heal Pulse", RANGE(0,1)) = 0
    10.       _DamageColor ("Damage Color", Color) = (1,0,0,1)
    11.       _DamagePulseVal ("Damage Pulse", RANGE(0,1)) = 0
    12.      _OutlineColor ("Outline Color", Color) = (0,0,0,1)
    13.     _Outline ("Outline width", float) = .005
    14.         }
    15.    
    16.     SubShader {
    17.             LOD 900
    18.             LOD 800
    19.       Tags { "RenderType" = "Opaque" }
    20.       CGPROGRAM
    21.    
    22.         #pragma surface surf Standard approxview  vertex:vert noforwardadd nodirlightmap
    23.        float4 _Color;
    24.       float4 _RimColor;    
    25.       float _RimPower;
    26.       float _Metallic;
    27.       float _Smoothness;
    28.         uniform float _DamagePulseVal;
    29.       uniform float _HealPulseVal;
    30.       uniform float4 _DamageColor;
    31.       uniform float4 _HealColor;
    32.      
    33.       struct Input
    34.       {
    35.           float2 uv_MainTex;
    36.           float3 worldRefl;
    37.           float3 vertexColor;
    38.           float3 viewDir;
    39.       };
    40.          
    41.       void vert (inout appdata_full v, out Input o)
    42.       {
    43.           UNITY_INITIALIZE_OUTPUT(Input,o);
    44.           o.vertexColor = v.color.rgb;
    45.       }
    46.    
    47.       sampler2D _MainTex;
    48.       samplerCUBE _Cube;
    49.      
    50.       void surf (Input IN, inout SurfaceOutputStandard o)
    51.       {
    52.              half3 c = tex2D (_MainTex, IN.uv_MainTex).rgb * IN.vertexColor *2* _Color;        
    53.              c = c*(1-_DamagePulseVal) + _DamagePulseVal*_DamageColor.rgb;      
    54.             c = c*(1-_HealPulseVal) + _HealPulseVal*_HealColor.rgb;
    55.           c *= IN.vertexColor;
    56.             o.Albedo = c;
    57.           o.Smoothness = _Smoothness;
    58.           o.Metallic = _Metallic;
    59.       }
    60.       ENDCG
    61.      UsePass "Toon/Basic Outline/OUTLINE"
    62.     }
    63.    
    64.     SubShader{
    65.           LOD 700
    66.      Tags { "RenderType" = "Opaque" }
    67.      CGPROGRAM
    68.  
    69.      #pragma surface surf Standard approxview  vertex:vert noforwardadd nodirlightmap
    70.      float4 _Color;
    71.      float4 _RimColor;
    72.      float _RimPower;
    73.      float _Metallic;
    74.      float _Smoothness;
    75.      uniform float _DamagePulseVal;
    76.      uniform float _HealPulseVal;
    77.      uniform float4 _DamageColor;
    78.      uniform float4 _HealColor;
    79.  
    80.      struct Input
    81.      {
    82.          float2 uv_MainTex;
    83.          float3 worldRefl;
    84.          float3 vertexColor;
    85.          float3 viewDir;
    86.      };
    87.  
    88.      void vert(inout appdata_full v, out Input o)
    89.      {
    90.          UNITY_INITIALIZE_OUTPUT(Input,o);
    91.          o.vertexColor = v.color.rgb;
    92.      }
    93.  
    94.      sampler2D _MainTex;
    95.      samplerCUBE _Cube;
    96.  
    97.      void surf(Input IN, inout SurfaceOutputStandard o)
    98.      {
    99.          half3 c = tex2D(_MainTex, IN.uv_MainTex).rgb * IN.vertexColor * 2 * _Color;
    100.          c = c * (1 - _DamagePulseVal) + _DamagePulseVal * _DamageColor.rgb;
    101.          c = c * (1 - _HealPulseVal) + _HealPulseVal * _HealColor.rgb;
    102.          c *= IN.vertexColor;
    103.          o.Albedo = c;
    104.          o.Smoothness = _Smoothness;
    105.          o.Metallic = _Metallic;
    106.      }
    107.      ENDCG
    108.     //UsePass "Toon/Basic Outline/OUTLINE"
    109.       }
    110.  
    111.     Fallback "Diffuse"
    112.   }
    Code (CSharp):
    1. Shader "Toon/Basic Outline" {
    2.     Properties {
    3.         _Color ("Main Color", Color) = (.5,.5,.5,1)
    4.         _OutlineColor ("Outline Color", Color) = (0,0,0,1)
    5.         _Outline ("Outline width", Range (.002, 0.03)) = .005
    6.         _MainTex ("Base (RGB)", 2D) = "white" { }
    7.         _ToonShade ("ToonShader Cubemap(RGB)", CUBE) = ""
    8.     }
    9.    
    10.     CGINCLUDE
    11.     #include "UnityCG.cginc"
    12.    
    13.     struct appdata {
    14.         float4 vertex : POSITION;
    15.         float3 normal : NORMAL;
    16.         float2 texcoord : TEXCOORD0;
    17.         float4 color:TEXCOORD1;          
    18.     };
    19.  
    20.     struct v2f {
    21.         float4 pos : POSITION;
    22.         float2 uv : TEXCOORD0;
    23.          float3 vertexColor:TEXCOORD1;
    24.         UNITY_FOG_COORDS(2)
    25.         fixed3 color : COLOR;
    26.     };
    27.    
    28.     uniform float _Outline;
    29.     uniform float4 _OutlineColor;
    30.     uniform float4 _MainTex_ST;
    31.     float4 _Color;
    32.     float4 _LightColor0;
    33.     sampler2D _MainTex;
    34.    
    35.     v2f vert(appdata v) {
    36.         v2f o;
    37.         o.pos = UnityObjectToClipPos(v.vertex);
    38.         float3 norm   = normalize( mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal));
    39.         float2 offset = TransformViewToProjection(norm.xy);
    40.         float z = 10;//min(o.pos.z*3, max(10, o.pos.z*0.4));
    41.         o.pos.xy += offset * z * _Outline;
    42.        
    43.         o.uv = TRANSFORM_TEX( v.texcoord.xy, _MainTex );
    44.         v.color.a = 1;
    45.         o.vertexColor = v.color.rgba;
    46.         UNITY_TRANSFER_FOG(o, o.pos);
    47.  
    48.         return o;
    49.     }
    50.  
    51.     // Outline thickness multiplier
    52.     #define INV_EDGE_THICKNESS_DIVISOR 0.00285
    53.     // Outline color parameters
    54.     #define SATURATION_FACTOR 0.6
    55.     #define BRIGHTNESS_FACTOR 0.7
    56.    
    57.     ENDCG
    58.    
    59.    
    60.     SubShader
    61.     {  
    62.         LOD 900      
    63.         UsePass "Toon/Basic/BASE"
    64.        
    65.         Pass {  
    66.             LOD 900
    67.     //        Tags { "Queue"="Geometry-1" "RenderType"="Opaque" }
    68.             Name "OUTLINE"
    69.             Tags { "RenderType"="Opaque" }
    70.             Tags { "LightMode" = "Always" }
    71.             Cull Front
    72.             ZWrite On
    73.             ColorMask RGB//
    74.             Blend SrcAlpha OneMinusSrcAlpha//
    75.  
    76.             CGPROGRAM
    77.             #pragma vertex vert
    78.             #pragma fragment frag
    79.             #pragma multi_compile_fog
    80.             half4 frag(v2f i) :SV_Target
    81.             {
    82.                 UNITY_APPLY_FOG(i.fogCoord, i.color);//
    83.                 return _OutlineColor;
    84.             }
    85.             ENDCG
    86.         }
    87.     }
    88.    
    89.     Fallback "Toon/Basic"
    90. }
    91.