203 lines
5.4 KiB
Plaintext
203 lines
5.4 KiB
Plaintext
Shader "PXR/Hand"
|
|
{
|
|
Properties
|
|
{
|
|
[Header(BaseColor)]
|
|
_InnerColor("内部颜色",Color) = (1,1,1,1)
|
|
_OutColor("外部颜色",Color) = (1,1,1,1)
|
|
_FresnelPower("菲涅尔强度",float) = 1
|
|
|
|
[Header(Light)][Space(5)]
|
|
_PressLight("按下光照",Color) = (1,1,1,1)
|
|
_ClickLight("点击光照",Color) = (1,1,1,1)
|
|
_PressRange("按压范围",Range(0,1)) = 0.015
|
|
_ClickRange("点击范围",Range(0,1)) = 0.015
|
|
_ClickPosition("点击位置",Vector)=(1,1,1,1)
|
|
_PressIntensity("按压强度",Range(0,1)) = 1
|
|
|
|
[Header(Wrist)][Space(10)]
|
|
_WristFadeRange("腕部渐变范围",Range(0,1)) = 1
|
|
_MainAlpha("总透明度",Range(0,1)) = 1
|
|
|
|
_FadeIn("透明消隐",Range(0,1))=0
|
|
}
|
|
|
|
CGINCLUDE
|
|
#include "Lighting.cginc"
|
|
#pragma target 3.0
|
|
|
|
float4 _InnerColor;
|
|
float4 _OutColor;
|
|
float _FresnelPower;
|
|
|
|
float4 _PressLight;
|
|
float4 _ClickLight;
|
|
half _PressIntensity;
|
|
float4 _ClickPosition;
|
|
|
|
float _PressRange;
|
|
float _ClickRange;
|
|
|
|
float _WristFadeRange;
|
|
float _FadeIn;
|
|
float _MainAlpha;
|
|
|
|
//-----------------描边参数----------------
|
|
struct OutlineVertexInput
|
|
{
|
|
float4 vertex : POSITION;
|
|
float3 normal : NORMAL;
|
|
float2 texcoord : TEXCOORD0;
|
|
};
|
|
|
|
struct OutlineVertexOutput
|
|
{
|
|
float4 vertex : SV_POSITION;
|
|
float2 uv:TEXCOORD3;
|
|
};
|
|
|
|
//-------------------------------------------
|
|
|
|
//---------------------正常绘制参数-------------------
|
|
struct VertexInput
|
|
{
|
|
float4 vertex : POSITION;
|
|
half3 normal : NORMAL;
|
|
half4 vertexColor : COLOR;
|
|
float2 texcoord : TEXCOORD0;
|
|
};
|
|
|
|
struct VertexOutput
|
|
{
|
|
float4 vertex : SV_POSITION;
|
|
float3 worldPos : TEXCOORD1;
|
|
float3 worldNormal : TEXCOORD2;
|
|
float2 uv:TEXCOORD3;
|
|
};
|
|
|
|
void CustomRemap(in float4 inValue, float2 inMinMax, float2 outMinMax, out float4 outValue)
|
|
{
|
|
outValue = outMinMax.x + (inValue - inMinMax.x) * (outMinMax.y - outMinMax.x) / (inMinMax.y - inMinMax.x);
|
|
}
|
|
|
|
float GetAlpha(float2 uv)
|
|
{
|
|
float dis = distance(float2(0.5, 0), uv * float2(0.9, 1) + float2(0.05, 0));
|
|
float4 s1;
|
|
CustomRemap(_WristFadeRange, float2(0, 1), float2(0.12, 1), s1);
|
|
const float s2 = 0.12;
|
|
float alpha = smoothstep(s2, s1, dis);
|
|
|
|
float s3 = 1 - _FadeIn;
|
|
float4 s4;
|
|
CustomRemap(s3, float2(0, 0.5), float2(0, 1), s4);
|
|
s4 = 1.1 * saturate(s4);
|
|
|
|
return alpha * smoothstep(s3, s4, dis);
|
|
}
|
|
float GetFresnel(float3 viewDir, float3 normal, float power)
|
|
{
|
|
return pow(1 - dot(viewDir, normal), power);
|
|
}
|
|
|
|
//-----------------正常绘制------------------------
|
|
VertexOutput baseVertex(VertexInput v)
|
|
{
|
|
VertexOutput o;
|
|
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
|
|
o.worldNormal = UnityObjectToWorldNormal(v.normal);
|
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
|
o.uv = v.texcoord;
|
|
return o;
|
|
}
|
|
|
|
fixed4 baseFragment(VertexOutput v) : SV_Target
|
|
{
|
|
float3 normalWS = normalize(v.worldNormal);
|
|
float3 viewWS = normalize(UnityWorldSpaceViewDir(v.worldPos));
|
|
float fresnel = saturate(GetFresnel(viewWS, normalWS, _FresnelPower));
|
|
|
|
float4 baseColor = lerp(_InnerColor, _OutColor, fresnel);
|
|
float4 clickColor = lerp(_PressLight, _ClickLight, step(0.99, _PressIntensity));
|
|
|
|
|
|
float3 localClickPos = mul((float3x3)unity_WorldToObject, _ClickPosition);
|
|
float3 vertexPos = mul((float3x3)unity_WorldToObject, v.worldPos);
|
|
float dis = distance(localClickPos, vertexPos);
|
|
|
|
float2 inMinMax = float2(0, lerp(_PressRange, _ClickRange, _PressIntensity));
|
|
float2 outMinMax = float2(1, 0);
|
|
float4 s;
|
|
CustomRemap(dis, inMinMax, outMinMax, s);
|
|
float4 r = smoothstep(0, 1, clamp(s, 0, 1));
|
|
r.a *= _PressIntensity;
|
|
|
|
fixed4 finalCol = lerp(baseColor, clickColor, r.a);
|
|
finalCol.a *= saturate(GetAlpha(v.uv));
|
|
finalCol.a *= _MainAlpha;
|
|
return finalCol;
|
|
}
|
|
|
|
ENDCG
|
|
|
|
SubShader
|
|
{
|
|
Tags
|
|
{
|
|
"RenderPipeline" = "UniversalPipeline"
|
|
"Queue" = "Transparent"
|
|
"RenderType" = "Transparent"
|
|
"IgnoreProjector" = "True"
|
|
}
|
|
Pass
|
|
{
|
|
Name "Depth"
|
|
Tags
|
|
{
|
|
"LightMode" = "SRPDefaultUnlit"
|
|
}
|
|
ZWrite On
|
|
ColorMask 0
|
|
}
|
|
Pass
|
|
{
|
|
Name "BaseColor"
|
|
Tags
|
|
{
|
|
"LightMode" = "UniversalForward"
|
|
}
|
|
Blend SrcAlpha OneMinusSrcAlpha
|
|
Cull Off
|
|
CGPROGRAM
|
|
#pragma vertex baseVertex
|
|
#pragma fragment baseFragment
|
|
ENDCG
|
|
}
|
|
}
|
|
SubShader
|
|
{
|
|
Tags
|
|
{
|
|
"Queue" = "Transparent"
|
|
"RenderType" = "Transparent"
|
|
"IgnoreProjector" = "True"
|
|
}
|
|
LOD 200
|
|
Pass
|
|
{
|
|
Name "Depth"
|
|
ZWrite On
|
|
ColorMask 0
|
|
}
|
|
Pass
|
|
{
|
|
Name "Interior"
|
|
Blend SrcAlpha OneMinusSrcAlpha
|
|
ZWrite On
|
|
CGPROGRAM
|
|
#pragma vertex baseVertex
|
|
#pragma fragment baseFragment
|
|
ENDCG
|
|
}
|
|
}
|
|
} |