Shader "Hidden/BlendOpsNode" { Properties { _A ("_Source", 2D) = "white" {} _B ("_Destiny", 2D) = "white" {} } SubShader { Pass //colorburn { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( 1.0 - ( ( 1.0 - des) / src) ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //colordodge { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( des/ ( 1.0 - src ) ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //darken { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( min( src , des ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //divide { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( des / src ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //difference { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( abs( src - des ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //exclusion { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( 0.5 - 2.0 * ( src - 0.5 ) * ( des - 0.5 ) ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //softlight { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( 2.0f*src*des + src*src*(1.0f - 2.0f*des) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //hardlight { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( src > 0.5 ? ( 1.0 - ( 1.0 - 2.0 * ( src - 0.5 ) ) * ( 1.0 - des ) ) : ( 2.0 * src * des ) ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //hardmix { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( round( 0.5 * ( src + des ) ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //lighten { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( max( src, des ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //linearburn { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( src + des - 1.0 ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //lineardodge { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( src + des ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //linearlight { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( src > 0.5 ? ( des + 2.0 * src - 1.0 ) : ( des + 2.0 * ( src - 0.5 ) ) ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //multiply { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( src * des ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //overlay { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( des > 0.5 ? ( 1.0 - ( 1.0 - 2.0 * ( des - 0.5 ) ) * ( 1.0 - src ) ) : ( 2.0 * des * src ) ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //pinlight { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( src > 0.5 ? max( des, 2.0 * ( src - 0.5 ) ) : min( des, 2.0 * src ) ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //subtract { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( des - src ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //screen { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( 1.0 - ( 1.0 - src ) * ( 1.0 - des ) ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } Pass //vividlight { CGPROGRAM #include "UnityCG.cginc" #pragma vertex vert_img #pragma fragment frag sampler2D _A; sampler2D _B; int _Sat; float4 frag(v2f_img i) : SV_Target { float4 src = tex2D( _A, i.uv ); float4 des = tex2D( _B, i.uv ); float4 c = ( ( src > 0.5 ? ( des / ( ( 1.0 - src ) * 2.0 ) ) : ( 1.0 - ( ( ( 1.0 - des ) * 0.5 ) / src ) ) ) ); if( _Sat == 1 ) c = saturate( c ); return c; } ENDCG } } }