Hey guys, Shader noob here. I was wondering how it would be possible to combine two shaders. Code (csharp): 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: Code (csharp): 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. Code (CSharp): 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" }