Search Unity

  1. If you have experience with import & exporting custom (.unitypackage) packages, please help complete a survey (open until May 15, 2024).
    Dismiss Notice
  2. Unity 6 Preview is now available. To find out what's new, have a look at our Unity 6 Preview blog post.
    Dismiss Notice

Outline shader not working for non standard shader

Discussion in 'Shaders' started by MikeyJY, Feb 26, 2020.

  1. MikeyJY

    MikeyJY

    Joined:
    Mar 2, 2018
    Posts:
    530
    I have this outline shader:
    Code (CSharp):
    1. Shader "Outline/Outline"
    2. {
    3.     Properties
    4.     {
    5.         [LM_Albedo] [LM_Transparency] _Color("Color", Color) = (1,1,1,1)
    6.         [LM_MasterTilingOffset] [LM_Albedo] _MainTex("Albedo", 2D) = "white" {}
    7.  
    8.         [LM_TransparencyCutOff] _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
    9.         [LM_Glossiness] _Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5
    10.         [LM_Metallic] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
    11.         [LM_Metallic] [LM_Glossiness] _MetallicGlossMap("Metallic", 2D) = "white" {}
    12.          _BumpScale("Scale", Float) = 1.0
    13.         [LM_NormalMap] _BumpMap("Normal Map", 2D) = "bump" {}
    14.         _Parallax ("Height Scale", Range (0.005, 0.08)) = 0.02
    15.         _ParallaxMap ("Height Map", 2D) = "black" {}
    16.         _OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
    17.         _OcclusionMap("Occlusion", 2D) = "white" {}
    18.         [LM_Emission] _EmissionColor("Color", Color) = (0,0,0)
    19.         [LM_Emission] _EmissionMap("Emission", 2D) = "white" {}
    20.  
    21.         _DetailMask("Detail Mask", 2D) = "white" {}
    22.         _DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {}
    23.         _DetailNormalMapScale("Scale", Float) = 1.0
    24.         _DetailNormalMap("Normal Map", 2D) = "bump" {}
    25.         [Enum(UV0,0,UV1,1)] _UVSec ("UV Set for secondary textures", Float) = 0
    26.         // UI-only data
    27.         [KeywordEnum(None, Realtime, Baked)]  _Lightmapping ("GI", Int) = 1
    28.         [HideInInspector] _EmissionScaleUI("Scale", Float) = 0.0
    29.         [HideInInspector] _EmissionColorUI("Color", Color) = (1,1,1)
    30.         // Blending state
    31.         [HideInInspector] _Mode ("__mode", Float) = 0.0
    32.         [HideInInspector] _SrcBlend ("__src", Float) = 1.0
    33.         [HideInInspector] _DstBlend ("__dst", Float) = 0.0
    34.         [HideInInspector] _ZWrite ("__zw", Float) = 1.0
    35.         // Outline
    36.         _Outline ("Outline Extrusion", Range(-1,1)) = 0.05
    37.         _OutColor ("Outline Color", Color) = (1,1,1,1)
    38.     }
    39.     CGINCLUDE
    40.         //@TODO: should this be pulled into a shader_feature, to be able to turn it off?
    41.         #define _GLOSSYENV 1
    42.         #define UNITY_SETUP_BRDF_INPUT MetallicSetup
    43.     ENDCG
    44.     SubShader
    45.     {
    46.         Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
    47.         LOD 300
    48.         // Outline addition starts here
    49.         Cull Off
    50.         ZWrite Off
    51.         //ZTest Always // Uncomment for "see through"
    52.         CGPROGRAM
    53.             #pragma surface surf Solid vertex:vert
    54.             struct Input {
    55.                 float4 color : COLOR;
    56.             };
    57.             fixed4 _OutColor;
    58.             float _Outline;
    59.         fixed4 LightingSolid (SurfaceOutput s, half3 lightDir, half atten) {
    60.         return _OutColor;
    61.         }
    62.             void vert (inout appdata_full v) {
    63.                 v.vertex.xyz += v.normal * _Outline;
    64.             }
    65.             void surf (Input IN, inout SurfaceOutput o) {
    66.                 o.Albedo = _OutColor.rgb;
    67.             }
    68.         ENDCG
    69.         Cull Back
    70.         ZWrite On
    71.         ZTest LEqual
    72.         // Outline addition ends here
    73.         // ------------------------------------------------------------------
    74.         //  Base forward pass (directional light, emission, lightmaps, ...)
    75.         Pass
    76.         {
    77.             Name "FORWARD"
    78.             Tags { "LightMode" = "ForwardBase" }
    79.             Blend [_SrcBlend] [_DstBlend]
    80.             ZWrite [_ZWrite]
    81.             CGPROGRAM
    82.             #pragma target 3.0
    83.             // TEMPORARY: GLES2.0 temporarily disabled to prevent errors spam on devices without textureCubeLodEXT
    84.             #pragma exclude_renderers gles
    85.      
    86.             // -------------------------------------
    87.              
    88.             #pragma shader_feature _NORMALMAP
    89.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    90.             #pragma shader_feature _EMISSION
    91.             //ALWAYS ON shader_feature _GLOSSYENV
    92.             #pragma shader_feature _METALLICGLOSSMAP
    93.             #pragma shader_feature ___ _DETAIL_MULX2
    94.             #pragma shader_feature _PARALLAXMAP
    95.      
    96.             #pragma multi_compile_fwdbase
    97.             #pragma multi_compile_fog
    98.          
    99.             #pragma vertex vertForwardBase
    100.             #pragma fragment fragForwardBase
    101.             #include "UnityStandardCore.cginc"
    102.             ENDCG
    103.         }
    104.         // ------------------------------------------------------------------
    105.         //  Additive forward pass (one light per pass)
    106.         Pass
    107.         {
    108.             Name "FORWARD_DELTA"
    109.             Tags { "LightMode" = "ForwardAdd" }
    110.             Blend [_SrcBlend] One
    111.             Fog { Color (0,0,0,0) } // in additive pass fog should be black
    112.             ZWrite Off
    113.             ZTest LEqual
    114.             CGPROGRAM
    115.             #pragma target 3.0
    116.             // GLES2.0 temporarily disabled to prevent errors spam on devices without textureCubeLodEXT
    117.             #pragma exclude_renderers gles
    118.             // -------------------------------------
    119.      
    120.             #pragma shader_feature _NORMALMAP
    121.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    122.             #pragma shader_feature _METALLICGLOSSMAP
    123.             #pragma shader_feature ___ _DETAIL_MULX2
    124.             #pragma shader_feature _PARALLAXMAP
    125.      
    126.             #pragma multi_compile_fwdadd_fullshadows
    127.             #pragma multi_compile_fog
    128.      
    129.             #pragma vertex vertForwardAdd
    130.             #pragma fragment fragForwardAdd
    131.             #include "UnityStandardCore.cginc"
    132.             ENDCG
    133.         }
    134.         // ------------------------------------------------------------------
    135.         //  Shadow rendering pass
    136.         Pass {
    137.             Name "ShadowCaster"
    138.             Tags { "LightMode" = "ShadowCaster" }
    139.      
    140.             ZWrite On ZTest LEqual
    141.             CGPROGRAM
    142.             #pragma target 3.0
    143.             // TEMPORARY: GLES2.0 temporarily disabled to prevent errors spam on devices without textureCubeLodEXT
    144.             #pragma exclude_renderers gles
    145.      
    146.             // -------------------------------------
    147.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    148.             #pragma multi_compile_shadowcaster
    149.             #pragma vertex vertShadowCaster
    150.             #pragma fragment fragShadowCaster
    151.             #include "UnityStandardShadow.cginc"
    152.             ENDCG
    153.         }
    154.         // ------------------------------------------------------------------
    155.         //  Deferred pass
    156.         Pass
    157.         {
    158.             Name "DEFERRED"
    159.             Tags { "LightMode" = "Deferred" }
    160.             CGPROGRAM
    161.             #pragma target 3.0
    162.             // TEMPORARY: GLES2.0 temporarily disabled to prevent errors spam on devices without textureCubeLodEXT
    163.             #pragma exclude_renderers nomrt gles
    164.      
    165.             // -------------------------------------
    166.             #pragma shader_feature _NORMALMAP
    167.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    168.             #pragma shader_feature _EMISSION
    169.             //ALWAYS ON shader_feature _GLOSSYENV
    170.             #pragma shader_feature _METALLICGLOSSMAP
    171.             #pragma shader_feature ___ _DETAIL_MULX2
    172.             #pragma shader_feature _PARALLAXMAP
    173.             #pragma multi_compile ___ UNITY_HDR_ON
    174.             #pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON
    175.             #pragma multi_compile DIRLIGHTMAP_OFF DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
    176.             #pragma multi_compile DYNAMICLIGHTMAP_OFF DYNAMICLIGHTMAP_ON
    177.      
    178.             #pragma vertex vertDeferred
    179.             #pragma fragment fragDeferred
    180.             #include "UnityStandardCore.cginc"
    181.             ENDCG
    182.         }
    183.         // ------------------------------------------------------------------
    184.         // Extracts information for lightmapping, GI (emission, albedo, ...)
    185.         // This pass it not used during regular rendering.
    186.         Pass
    187.         {
    188.             Name "META"
    189.             Tags { "LightMode"="Meta" }
    190.             Cull Off
    191.             CGPROGRAM
    192.             #pragma vertex vert_meta
    193.             #pragma fragment frag_meta
    194.             #pragma shader_feature _EMISSION
    195.             #pragma shader_feature _METALLICGLOSSMAP
    196.             #pragma shader_feature ___ _DETAIL_MULX2
    197.             #include "UnityStandardMeta.cginc"
    198.             ENDCG
    199.         }
    200.     }
    201.     SubShader
    202.     {
    203.         Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
    204.         LOD 150
    205.         // ------------------------------------------------------------------
    206.         //  Base forward pass (directional light, emission, lightmaps, ...)
    207.         Pass
    208.         {
    209.             Name "FORWARD"
    210.             Tags { "LightMode" = "ForwardBase" }
    211.             Blend [_SrcBlend] [_DstBlend]
    212.             ZWrite [_ZWrite]
    213.             CGPROGRAM
    214.             #pragma target 2.0
    215.      
    216.             #pragma shader_feature _NORMALMAP
    217.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    218.             #pragma shader_feature _EMISSION
    219.             // ALWAYS ON shader_feature _GLOSSYENV
    220.             #pragma shader_feature _METALLICGLOSSMAP
    221.             #pragma shader_feature ___ _DETAIL_MULX2
    222.             // SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
    223.             #pragma skip_variants SHADOWS_SOFT DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
    224.             #pragma multi_compile_fwdbase
    225.             #pragma multi_compile_fog
    226.             #pragma vertex vertForwardBase
    227.             #pragma fragment fragForwardBase
    228.             #include "UnityStandardCore.cginc"
    229.             ENDCG
    230.         }
    231.         // ------------------------------------------------------------------
    232.         //  Additive forward pass (one light per pass)
    233.         Pass
    234.         {
    235.             Name "FORWARD_DELTA"
    236.             Tags { "LightMode" = "ForwardAdd" }
    237.             Blend [_SrcBlend] One
    238.             Fog { Color (0,0,0,0) } // in additive pass fog should be black
    239.             ZWrite Off
    240.             ZTest LEqual
    241.      
    242.             CGPROGRAM
    243.             #pragma target 2.0
    244.             #pragma shader_feature _NORMALMAP
    245.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    246.             #pragma shader_feature _METALLICGLOSSMAP
    247.             #pragma shader_feature ___ _DETAIL_MULX2
    248.             // SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
    249.             #pragma skip_variants SHADOWS_SOFT
    250.      
    251.             #pragma multi_compile_fwdadd_fullshadows
    252.             #pragma multi_compile_fog
    253.      
    254.             #pragma vertex vertForwardAdd
    255.             #pragma fragment fragForwardAdd
    256.             #include "UnityStandardCore.cginc"
    257.             ENDCG
    258.         }
    259.         // ------------------------------------------------------------------
    260.         //  Shadow rendering pass
    261.         Pass {
    262.             Name "ShadowCaster"
    263.             Tags { "LightMode" = "ShadowCaster" }
    264.      
    265.             ZWrite On ZTest LEqual
    266.             CGPROGRAM
    267.             #pragma target 2.0
    268.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    269.             #pragma skip_variants SHADOWS_SOFT
    270.             #pragma multi_compile_shadowcaster
    271.             #pragma vertex vertShadowCaster
    272.             #pragma fragment fragShadowCaster
    273.             #include "UnityStandardShadow.cginc"
    274.             ENDCG
    275.         }
    276.         // ------------------------------------------------------------------
    277.         // Extracts information for lightmapping, GI (emission, albedo, ...)
    278.         // This pass it not used during regular rendering.
    279.         Pass
    280.         {
    281.             Name "META"
    282.             Tags { "LightMode"="Meta" }
    283.             Cull Off
    284.             CGPROGRAM
    285.             #pragma vertex vert_meta
    286.             #pragma fragment frag_meta
    287.             #pragma shader_feature _EMISSION
    288.             #pragma shader_feature _METALLICGLOSSMAP
    289.             #pragma shader_feature ___ _DETAIL_MULX2
    290.             #include "UnityStandardMeta.cginc"
    291.             ENDCG
    292.         }
    293.     }
    294.     FallBack "VertexLit"
    295.     //CustomEditor "StandardShaderGUI"
    296. }
    Look at the leaf. It is unoutlined now:
    upload_2020-2-26_21-57-34.png

    When I apply outline shader:
    upload_2020-2-26_21-57-49.png

    It is breaking its default material.
    I want a shader that outline for all shaders.
    As you can see it works for the axe.
    (I want to specify that I'm a shader noob, I don't know anything about shaders)
     
    Last edited: Feb 26, 2020