Files
2026-05-28 16:02:53 +09:00

126 lines
3.7 KiB
Plaintext

Shader "Custom/Kevin Iglesias/Human Melee Animations Scene"
{
Properties
{
_Color ("Base Color", Color) = (1,1,1,1)
_MainTex ("Texture", 2D) = "white" {}
_LightDir ("Light Direction", Vector) = (0.5,1,0,0)
_LightColor ("Light Color", Color) = (1,1,1,1)
_Ambient ("Ambient", Range(0,1)) = 0.2
_Metallic ("Metalness", Range(0,1)) = 0
_Smoothness ("Smoothness", Range(0,1)) = 0.5
_SpecStrength ("Specular Strength", Range(0,2)) = 1
_UVRotation ("UV Rotation", Float) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Color;
float4 _LightDir;
fixed4 _LightColor;
float _Ambient;
float _Metallic;
float _Smoothness;
float _SpecStrength;
float _UVRotation;
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float3 normalWS : TEXCOORD0;
float3 worldPos : TEXCOORD1;
float2 uv : TEXCOORD2;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.normalWS = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
float2 uv = v.uv;
// Rotate around real UV center
float angle = radians(_UVRotation);
float s = sin(angle);
float c = cos(angle);
float2 pivot = float2(0.5, 0.5);
uv -= pivot;
uv = float2(
uv.x * c - uv.y * s,
uv.x * s + uv.y * c
);
uv += pivot;
// Apply texture tiling + offset AFTER rotation
o.uv = uv * _MainTex_ST.xy + _MainTex_ST.zw;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed4 tex = tex2D(_MainTex, i.uv) * _Color;
float3 N = normalize(i.normalWS);
float3 L = normalize(_LightDir.xyz);
float3 V = normalize(_WorldSpaceCameraPos - i.worldPos);
float3 H = normalize(L + V);
float NdotL = saturate(dot(N, L));
float NdotH = saturate(dot(N, H));
float specPower = lerp(8.0, 256.0, _Smoothness);
float spec = pow(NdotH, specPower) * _SpecStrength;
float3 dielectricSpec = float3(0.04, 0.04, 0.04);
float3 metalSpec = tex.rgb;
float3 specColor = lerp(dielectricSpec, metalSpec, _Metallic);
float3 diffuseColor = tex.rgb * (1.0 - _Metallic);
float3 diffuse =
diffuseColor *
_LightColor.rgb *
(_Ambient + NdotL);
float3 specular =
specColor *
_LightColor.rgb *
spec *
NdotL;
float3 finalColor = diffuse + specular;
return fixed4(finalColor, tex.a);
}
ENDCG
}
}
}