Combining two shaders (663421)

Hey guys,
Shader noob here.
I was wondering how it would be possible to combine two shaders.

Shader "Custom/Jelly" {
   Properties {
       _MainTex ("Base (RGB)", 2D) = "white" {}
   }
   SubShader {
       Pass {
           Tags { "RenderType"="Opaque" }
       
           CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag
           #include "UnityCG.cginc"

           sampler2D _MainTex;
           struct v2f {
               float4 pos : SV_POSITION;
               half2 uv : TEXCOORD0;
           };

           v2f vert(appdata_base v) {
               v2f o;
               v.vertex.x += sign(v.vertex.x) * sin(_Time.w)/50;
               v.vertex.y += sign(v.vertex.y) * cos(_Time.w)/50;
               o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
               o.uv = v.texcoord;
               return o;
           }


           half4 frag(v2f i) : COLOR {
               half4 c = tex2D(_MainTex, i.uv);
               return c;
           }

           ENDCG
       }
   }
   FallBack "Diffuse"
}

The second would be:

Shader "Jelly/WithOutline" {
   Properties{
       _Color("Main Color", Color) = (.5,.5,.5,1)
       _OutlineColor("Outline Color", Color) = (0,0,0,1)
       _Outline("Outline width", Range(.002, 1)) = .005
       _MainTex("Base (RGB)", 2D) = "white" { }
   _ToonShade("ToonShader Cubemap(RGB)", CUBE) = "" { Texgen CubeNormal }
   }

       CGINCLUDE
#include "UnityCG.cginc"

   struct appdata {
       float4 vertex : POSITION;
       float3 normal : NORMAL;
   };
   struct v2f {
       float4 pos : POSITION;
       float4 color : COLOR;
   };

   uniform float _Outline;
   uniform float4 _OutlineColor;

   v2f vert(appdata v) {
       v2f o;
       o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
       float3 norm = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
       float2 offset = TransformViewToProjection(norm.xy);
       o.pos.xy += offset * o.pos.z * _Outline;
       o.color = _OutlineColor;
       return o;
   }


   ENDCG
       SubShader{
       Tags{ "RenderType" = "Opaque" "Queue" = "Transparent" }
       UsePass "Toon/Basic-Alpha/BASE"
       Pass{
       Name "OUTLINE"
       Tags{ "LightMode" = "Always" }
       Cull Front
       ZWrite On
       ColorMask RGB
       Blend SrcAlpha OneMinusSrcAlpha
       CGPROGRAM
#pragma vertex vert
#pragma fragment frag
       half4 frag(v2f i) :COLOR{ return i.color; }
       ENDCG
   }
   }

       SubShader{
       Tags{ "RenderType" = "Opaque" "Queue" = "Transparent" }
       UsePass "Toon/Basic-Alpha/BASE"
       Pass{
       Name "OUTLINE"
       Tags{ "LightMode" = "Always" }
       Cull Front
       ZWrite On
       ColorMask RGB
       Blend SrcAlpha OneMinusSrcAlpha
       CGPROGRAM
#pragma vertex vert
#pragma exclude_renderers shaderonly
       ENDCG
       SetTexture[_MainTex]{ combine primary }
   }
   }

       Fallback "Jelly/Basic"
}

If you could leave some comments in the code about what you put where as well then that would be really helpful.
Thanks in advance!

I have tried to combine that for you.
The first Pass is copied from the first shader. If you named it in the first shader then you could use UsePass in the second shader - analogically to how it is done in ToonBasic and ToonBasicOutline shaders in standard assets.

Shader "Custom/Jelly/WithOutline" {
   Properties{
       _Color("Main Color", Color) = (.5,.5,.5,1)
       _OutlineColor("Outline Color", Color) = (0,0,0,1)
       _Outline("Outline width", Range(.002, 1)) = .005
       _MainTex("Base (RGB)", 2D) = "white" { }
       _ToonShade("ToonShader Cubemap(RGB)", CUBE) = "" { Texgen CubeNormal }
   }
      
       SubShader{
       Pass {
           Tags { "RenderType"="Opaque" }
           CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag
           #include "UnityCG.cginc"
           sampler2D _MainTex;
           struct v2f {
               float4 pos : SV_POSITION;
               half2 uv : TEXCOORD0;
           };
           v2f vert(appdata_base v) {
               v2f o;
               v.vertex.x += sign(v.vertex.x) * sin(_Time.w)/50;
               v.vertex.y += sign(v.vertex.y) * cos(_Time.w)/50;
               o.pos = UnityObjectToClipPos(v.vertex);
               o.uv = v.texcoord;
               return o;
           }
           half4 frag(v2f i) : COLOR {
               half4 c = tex2D(_MainTex, i.uv);
               return c;
           }
            ENDCG
        }

        Pass {
            Name "OUTLINE"
            Tags { "LightMode" = "Always" }
            Cull Front
            ZWrite On
            ColorMask RGB
            Blend SrcAlpha OneMinusSrcAlpha

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fog
            #include "UnityCG.cginc"

            struct appdata {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };

            struct v2f {
                float4 pos : SV_POSITION;
                UNITY_FOG_COORDS(0)
                fixed4 color : COLOR;
            };
   
            uniform float _Outline;
            uniform float4 _OutlineColor;
   
            v2f vert(appdata v) {
                v2f o;
                v.vertex.x += sign(v.vertex.x) * sin(_Time.w)/50;
                v.vertex.y += sign(v.vertex.y) * cos(_Time.w)/50;
                o.pos = UnityObjectToClipPos(v.vertex);

                float3 norm   = normalize(mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal));
                float2 offset = TransformViewToProjection(norm.xy);

                #ifdef UNITY_Z_0_FAR_FROM_CLIPSPACE //to handle recent standard asset package on older version of unity (before 5.5)
                    o.pos.xy += offset * UNITY_Z_0_FAR_FROM_CLIPSPACE(o.pos.z) * _Outline;
                #else
                    o.pos.xy += offset * o.pos.z * _Outline;
                #endif
                o.color = _OutlineColor;
                UNITY_TRANSFER_FOG(o,o.pos);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                UNITY_APPLY_FOG(i.fogCoord, i.color);
                return i.color;
            }
            ENDCG
        }
    }
   Fallback "Custom/Jelly"
}
1 Like