Shader "Custom/MobShader" { Properties { _Color ("Skin Color", Color) = (1,1,1,1) _Shift ("Shift", Range(0,1)) = 0.1 _Brightness ("Brightness", Range(0,1)) = 0.0 _Contrast ("Contrast", Range(0,2)) = 0.0 _MainTex ("Albedo (RGB)", 2D) = "white" {} _TexEquipA ("Equip A (RGB)", 2D) = "" {} _ColEquipA ("Color Equip A", Color ) = (1,1,1,0) _TexEquipB ("Equip B (RGB)", 2D) = "" {} _ColEquipB ("Color Equip B", Color ) = (1,1,1,0) _TexEquipC ("Equip C (RGB)", 2D) = "" {} _ColEquipC ("Color Equip C", Color ) = (1,1,1,0) _TexEquipD ("Equip D (RGB)", 2D) = "" {} _ColEquipD ("Color Equip D", Color ) = (1,1,1,0) _TexEquipE ("Equip E (RGB)", 2D) = "" {} _ColEquipE ("Color Equip E", Color ) = (1,1,1,0) _TexEquipF ("Equip F (RGB)", 2D) = "" {} _ColEquipF ("Color Equip F", Color ) = (1,1,1,0) _TexEquipG ("Equip G (RGB)", 2D) = "" {} _ColEquipG ("Color Equip G", Color ) = (1,1,1,0) } SubShader { Tags {"Queue"="Geometry" "RenderType"="Opaque"} //LOD 200 //Pass { // ZWrite On // ColorMask 0 //} CGPROGRAM // Physically based Standard lighting model, and enable shadows on all light types //fullforwardshadows ? #pragma surface surf Standard fullforwardshadows // Use shader model 3.0 target, to get nicer looking lighting #pragma target 3.0 sampler2D _MainTex; sampler2D _TexEquipA; sampler2D _TexEquipB; sampler2D _TexEquipC; sampler2D _TexEquipD; sampler2D _TexEquipE; sampler2D _TexEquipF; sampler2D _TexEquipG; struct Input { float2 uv_MainTex; }; float _Brightness; float _Contrast; float _Shift; fixed4 _Color; fixed4 _ColEquipA; fixed4 _ColEquipB; fixed4 _ColEquipC; fixed4 _ColEquipD; fixed4 _ColEquipE; fixed4 _ColEquipF; fixed4 _ColEquipG; float3 rgbTohsv(float3 RGB) { float3 HSV; float minChannel, maxChannel; if (RGB.x > RGB.y) { maxChannel = RGB.x; minChannel = RGB.y; } else { maxChannel = RGB.y; minChannel = RGB.x; } if (RGB.z > maxChannel) maxChannel = RGB.z; if (RGB.z < minChannel) minChannel = RGB.z; HSV.xy = 0; HSV.z = maxChannel; float delta = maxChannel - minChannel; //Delta RGB value if (delta != 0) { // If gray, leave H S at zero HSV.y = delta / HSV.z; float3 delRGB; delRGB = (HSV.zzz - RGB + 3*delta) / (6.0*delta); if ( RGB.x == HSV.z ) HSV.x = delRGB.z - delRGB.y; else if ( RGB.y == HSV.z ) HSV.x = ( 1.0/3.0) + delRGB.x - delRGB.z; else if ( RGB.z == HSV.z ) HSV.x = ( 2.0/3.0) + delRGB.y - delRGB.x; } return (HSV); } float3 hsvTorgb(float3 HSV) { float3 RGB = HSV.z; float var_h = HSV.x * 6; float var_i = floor(var_h); // Or ... var_i = floor( var_h ) float var_1 = HSV.z * (1.0 - HSV.y); float var_2 = HSV.z * (1.0 - HSV.y * (var_h-var_i)); float var_3 = HSV.z * (1.0 - HSV.y * (1-(var_h-var_i))); if (var_i == 0) { RGB = float3(HSV.z, var_3, var_1); } else if (var_i == 1) { RGB = float3(var_2, HSV.z, var_1); } else if (var_i == 2) { RGB = float3(var_1, HSV.z, var_3); } else if (var_i == 3) { RGB = float3(var_1, var_2, HSV.z); } else if (var_i == 4) { RGB = float3(var_3, var_1, HSV.z); } else { RGB = float3(HSV.z, var_1, var_2); } return (RGB); } void surf (Input IN, inout SurfaceOutputStandard o) { // Albedo comes from a texture tinted by color //Original //fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; fixed4 c = tex2D (_MainTex, IN.uv_MainTex); float val = ( c.r + c.g + c.b ) / 3; //Manual skin //c = lerp(_ColorDark, _Color, val ); float3 hsv = rgbTohsv( float3(_Color.r, _Color.g, _Color.b) ); hsv.x += val * _Shift; if( val < 0.1 ) hsv.y = 1; else if( val < 0.5 ) hsv.y = lerp( 1, 0.2, (val-0.1)/0.4 ); else if( val < 0.9 ) hsv.y = lerp( 0.2, 0.0, (val-0.5)/0.4 ); else hsv.y = 0; hsv.z = val; float3 col = hsvTorgb(hsv); c.r = col.x; c.g = col.y; c.b = col.z; //Contrast c.rgb = ((c.rgb - 0.5) * max(_Contrast, 0)) + 0.5; // Apply brightness. c.rgb += _Brightness; o.Metallic = 0; o.Smoothness = 0.1; float EquipSmooth = 0; fixed4 e = float4(0,0,0,0); //Auto skin //Equip if( _ColEquipA.a > 0 ) { e = tex2D( _TexEquipA, IN.uv_MainTex); c = lerp(c,e * _ColEquipA, e.a * _ColEquipA.a); o.Smoothness = EquipSmooth; } if( _ColEquipB.a > 0 ) { e = tex2D( _TexEquipB, IN.uv_MainTex); c = lerp(c,e * _ColEquipB, e.a * _ColEquipB.a ); o.Smoothness = EquipSmooth; } if( _ColEquipC.a > 0 ) { e = tex2D( _TexEquipC, IN.uv_MainTex); c = lerp(c,e * _ColEquipC, e.a * _ColEquipC.a); o.Smoothness = EquipSmooth; } if( _ColEquipD.a > 0 ) { e = tex2D( _TexEquipD, IN.uv_MainTex); c = lerp(c,e * _ColEquipD, e.a *_ColEquipD.a); o.Smoothness = EquipSmooth; } if( _ColEquipE.a > 0 ) { e = tex2D( _TexEquipE, IN.uv_MainTex); c = lerp(c,e * _ColEquipE, e.a * _ColEquipE.a); o.Smoothness = EquipSmooth; } if( _ColEquipF.a > 0 ) { e = tex2D( _TexEquipF, IN.uv_MainTex); c = lerp(c,e * _ColEquipF, e.a * _ColEquipF.a); o.Smoothness = EquipSmooth; } if( _ColEquipG.a > 0 ) { e = tex2D( _TexEquipG, IN.uv_MainTex); c = lerp(c,e * _ColEquipG, e.a * _ColEquipG.a ); o.Smoothness = EquipSmooth; } o.Albedo = c.rgb; // Metallic and smoothness come from slider variables //o.Alpha =_msAlpha; } ENDCG } FallBack "Diffuse" }