shaoxiadiablo/Assets/AGame/Res/Shaders/MY/MYPlayerSpec.shader
2025-05-18 01:04:31 +08:00

245 lines
6.8 KiB
Plaintext

Shader "MY/PlayerSpec"
{
Properties
{
_Color("Color", Color) = (1,1,1,1)
_MainTex("Albedo (RGBA)", 2D) = "white" {}
_Bright("Bright", Range(0,9)) = 1
_Saturation("Saturation", Range(0,2)) = 1
_Unlit("Unlit", Range(0,1)) = 1
_Cube("Reflection Cubemap", Cube) = "" {}
_ReflectColor("Reflection Color", Color) = (1,1,1,0.5)
[HDR]_SpecColor("Spec Color", Color) = (1,1,1,0.5)
_SpecTex("SpecTex (RGB)", 2D) = "white" { }
[Header(Colour)]
_ColourTex("ColourTex (RGBA)", 2D) = "white" { }
[HDR]_CastColorR("CastColorR", Color) = (1,1,1,1)
[HDR]_CastColorG("CastColorG", Color) = (1,1,1,1)
[HDR]_CastColorB("CastColorB", Color) = (1,1,1,1)
[Header(Rim)]
_RimColor("边光颜色", Color) = (0,0,0,1)
_RimPower("边光强度", Range(-10,10)) = 1
_RimRange("边光范围", Range(1,10)) = 1.8
[Header(Scroll)]
[KeywordEnum(None, Scroll, Flash)] _ScrollMode("_ScrollModel mode", Float) = 0
_ScrollTex("流光贴图(RGB)", 2D) = "black" {}
_ScrollPower("流光强度", Range(-10, 10)) = 1
_ScrollSpeedX("X流光速度", Range(-10, 10)) = 0
_ScrollSpeedY("Y流光速度", Range(-10, 10)) = 0
[Header(Fresnel)]
_FresnelColor("FresnelColor", Color) = (0.345,0.541,0.737,1)
_FresnelExp("FresnelExp", Range(0,10)) = 0.5
[Enum(UnityEngine.Rendering.CullMode)] _Cull("Cull Mode", Float) = 2
}
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 200
Cull[_Cull]
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
Name "Glow"
ColorMask RGB
Blend One One
ZWrite Off
ZTest Greater
Fog {Mode Off}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
fixed4 _FresnelColor;
fixed _FresnelExp;
struct VertexInput
{
half4 vertex : POSITION;
half3 normal : NORMAL;
};
struct VertexOutput
{
half4 pos : SV_POSITION;
half3 color : TEXCOORD0;
};
VertexOutput vert(VertexInput v)
{
VertexOutput o;
o.pos = UnityObjectToClipPos(v.vertex);
half3 normalDir = UnityObjectToWorldNormal(v.normal);
half3 viewDir = normalize(WorldSpaceViewDir(v.vertex));
o.color = _FresnelColor.rgb * pow(1.0 - max(0, dot(normalDir, viewDir)), _FresnelExp);
return o;
}
fixed4 frag(VertexOutput i) : COLOR
{
return fixed4(i.color,1);
}
ENDCG
}
CGPROGRAM
#pragma multi_compile _SCROLLMODE_NONE _SCROLLMODE_SCROLL _SCROLLMODE_FLASH
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf SimpleSpecular vertex:myvert finalcolor:mycolor exclude_path:deferred exclude_path:prepass nometa nolightmap nofog keepalpha noforwardadd
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
struct SurfaceOutput1
{
fixed3 Albedo; // diffuse color
fixed3 Normal; // tangent space normal, if written
fixed3 Emission; //
half3 Specular; // specular power in 0..1 range
fixed Gloss; // specular intensity
fixed Unlit;
fixed Alpha; // alpha for transparencies
};
half3 mix(half3 x, half3 y, half a)
{
return x * (1 - a) + y * a;
}
half4 LightingSimpleSpecular(SurfaceOutput1 s, half3 lightDir, half3 viewDir, half atten)
{
half3 h = normalize(lightDir + viewDir);
half diff = max(0, dot(s.Normal, lightDir));
float nh = max(0, dot(s.Normal, h));
float spec = pow(nh, s.Specular*128.0) * s.Gloss;
half4 c;
c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec)* atten;
h = s.Albedo + spec * atten;
c.rgb = lerp(c.rgb, h, s.Unlit);
c.a = s.Alpha;
return c;
}
struct Input
{
float2 uv_MainTex;
float2 uv_ColourTex;
float2 uv_SpecTex;
float2 uv_ScrollTex;
float2 scrollAdd;
float3 viewDir;
float3 worldNormal;
float3 worldRefl;
};
sampler2D _MainTex;
sampler2D _ColourTex;
sampler2D _SpecTex;
samplerCUBE _Cube;
fixed4 _ReflectColor;
fixed4 _Color;
half _Bright;
half _Saturation;
half _Unlit;
// Scroll
sampler2D _ScrollTex;
half _ScrollPower;
half _ScrollSpeedX;
half _ScrollSpeedY;
fixed3 _RimColor;
half _RimPower;
half _RimRange;
fixed4 _CastColorR;
fixed4 _CastColorG;
fixed4 _CastColorB;
// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
// #pragma instancing_options assumeuniformscaling
UNITY_INSTANCING_BUFFER_START(Props)
// put more per-instance properties here
UNITY_INSTANCING_BUFFER_END(Props)
void myvert(inout appdata_full v, out Input o)
{
UNITY_INITIALIZE_OUTPUT(Input, o);
#ifdef _SCROLLMODE_SCROLL
o.scrollAdd.xy = float2(_ScrollSpeedX, _ScrollSpeedY)*_Time.y;
#elif _SCROLLMODE_FLASH
o.scrollAdd.x = sin(_Time.y * _ScrollSpeedX * 20.0);
o.scrollAdd.y = sin(_Time.y * _ScrollSpeedY * 20.0);
#endif
}
void mycolor(Input IN, SurfaceOutput1 o, inout fixed4 color)
{
fixed3 rim = saturate(1 - saturate(dot(IN.worldNormal, IN.viewDir)) * _RimRange) *_RimPower * _RimColor;
color.rgb += rim;
}
void surf(Input IN, inout SurfaceOutput1 o)
{
// Albedo comes from a texture tinted by color
fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color * (1 + _Bright);
fixed4 m = tex2D(_ColourTex, IN.uv_ColourTex);
fixed4 s = tex2D(_SpecTex, IN.uv_SpecTex);
half3 cc = c.rgb;
cc = mix(cc.rgb, (_CastColorR.rgb * c.rgb), m.r);
cc = mix(cc.rgb, (_CastColorG.rgb * c.rgb), m.g);
cc = mix(cc.rgb, (_CastColorB.rgb * c.rgb), m.b);
half gray = Luminance(cc.rgb);
fixed3 grayColor = fixed3(gray, gray, gray);
cc.rgb = lerp(grayColor, cc.rgb, _Saturation);
cc.rgb = lerp(cc.rgb, _SpecColor, s.b);
o.Albedo = cc.rgb;
// Metallic and smoothness come from slider variables
o.Specular = 0.5f;
o.Gloss = s.b;
o.Unlit = _Unlit;
fixed4 reflcol = texCUBE(_Cube, IN.worldRefl);
reflcol *= m.b;
o.Emission = reflcol.rgb * _ReflectColor.rgb;
#ifdef _SCROLLMODE_SCROLL
cc = tex2D(_ScrollTex, IN.scrollAdd + IN.uv_ScrollTex);
o.Emission += (m.r * _ScrollPower) * cc.rgb;
#elif _SCROLLMODE_FLASH
cc = tex2D(_ScrollTex, IN.uv_ScrollTex);
o.Emission += (m.r * _ScrollPower * step(IN.scrollAdd.x,0))* cc.rgb;
cc = tex2D(_ScrollTex, -IN.uv_ScrollTex);
o.Emission += (m.r * _ScrollPower * step(IN.scrollAdd.y,0))* cc.rgb;
#endif
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}