220 lines
6.1 KiB
Plaintext
220 lines
6.1 KiB
Plaintext
|
|
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"
|
||
|
|
}
|