Init
This commit is contained in:
@@ -0,0 +1,203 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user