ToriaAssets/Sources/Shaders/MobShader.shader
2026-05-19 15:33:18 +02:00

220 lines
6.1 KiB
GLSL

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"
}