Files
Echo/Assets/_Project/Shaders/InteractOutline.shader
T
2026-07-08 20:42:51 +08:00

233 lines
7.2 KiB
Plaintext

Shader "Project/InteractOutline"
{
Properties
{
_OutlineColor ("Outline Color", Color) = (0,1,0,1)
_OutlineWidth ("Outline Width", Float) = 0.02
_Emission ("Emission", Float) = 1
_InnerWidthScale ("Inner Width Scale", Float) = 0.6
_OuterWidthScale ("Outer Width Scale", Float) = 1.2
_InnerAlpha ("Inner Alpha", Range(0, 1)) = 1
_OuterAlpha ("Outer Alpha", Range(0, 1)) = 0
}
SubShader
{
Tags { "RenderPipeline"="UniversalPipeline" "Queue"="Transparent" "RenderType"="Transparent" }
Pass
{
Name "OutlineLayer3"
Tags { "LightMode"="UniversalForward" }
Cull Front
ZWrite Off
ZTest LEqual
Blend SrcAlpha One
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
float4 _OutlineColor;
float _OutlineWidth;
float _Emission;
float _InnerWidthScale;
float _OuterWidthScale;
float _InnerAlpha;
float _OuterAlpha;
CBUFFER_END
struct Attributes
{
float4 positionOS : POSITION;
float3 normalOS : NORMAL;
};
struct Varyings
{
float4 positionHCS : SV_POSITION;
};
Varyings vert (Attributes input)
{
Varyings output;
float t = 1.0;
float widthScale = lerp(_InnerWidthScale, _OuterWidthScale, t);
float3 posOS = input.positionOS.xyz + input.normalOS * (_OutlineWidth * widthScale);
output.positionHCS = TransformObjectToHClip(posOS);
return output;
}
half4 frag (Varyings input) : SV_Target
{
float t = 1.0;
float alpha = lerp(_InnerAlpha, _OuterAlpha, t);
return half4(_OutlineColor.rgb * _Emission, _OutlineColor.a * alpha);
}
ENDHLSL
}
Pass
{
Name "OutlineLayer0"
Tags { "LightMode"="UniversalForward" }
Cull Front
ZWrite Off
ZTest LEqual
Blend SrcAlpha One
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
float4 _OutlineColor;
float _OutlineWidth;
float _Emission;
float _InnerWidthScale;
float _OuterWidthScale;
float _InnerAlpha;
float _OuterAlpha;
CBUFFER_END
struct Attributes
{
float4 positionOS : POSITION;
float3 normalOS : NORMAL;
};
struct Varyings
{
float4 positionHCS : SV_POSITION;
};
Varyings vert (Attributes input)
{
Varyings output;
float t = 0.0;
float widthScale = lerp(_InnerWidthScale, _OuterWidthScale, t);
float3 posOS = input.positionOS.xyz + input.normalOS * (_OutlineWidth * widthScale);
output.positionHCS = TransformObjectToHClip(posOS);
return output;
}
half4 frag (Varyings input) : SV_Target
{
float t = 0.0;
float alpha = lerp(_InnerAlpha, _OuterAlpha, t);
return half4(_OutlineColor.rgb * _Emission, _OutlineColor.a * alpha);
}
ENDHLSL
}
Pass
{
Name "OutlineLayer1"
Tags { "LightMode"="UniversalForward" }
Cull Front
ZWrite Off
ZTest LEqual
Blend SrcAlpha One
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
float4 _OutlineColor;
float _OutlineWidth;
float _Emission;
float _InnerWidthScale;
float _OuterWidthScale;
float _InnerAlpha;
float _OuterAlpha;
CBUFFER_END
struct Attributes
{
float4 positionOS : POSITION;
float3 normalOS : NORMAL;
};
struct Varyings
{
float4 positionHCS : SV_POSITION;
};
Varyings vert (Attributes input)
{
Varyings output;
float t = 0.3333333;
float widthScale = lerp(_InnerWidthScale, _OuterWidthScale, t);
float3 posOS = input.positionOS.xyz + input.normalOS * (_OutlineWidth * widthScale);
output.positionHCS = TransformObjectToHClip(posOS);
return output;
}
half4 frag (Varyings input) : SV_Target
{
float t = 0.3333333;
float alpha = lerp(_InnerAlpha, _OuterAlpha, t);
return half4(_OutlineColor.rgb * _Emission, _OutlineColor.a * alpha);
}
ENDHLSL
}
Pass
{
Name "OutlineLayer2"
Tags { "LightMode"="UniversalForward" }
Cull Front
ZWrite Off
ZTest LEqual
Blend SrcAlpha One
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
float4 _OutlineColor;
float _OutlineWidth;
float _Emission;
float _InnerWidthScale;
float _OuterWidthScale;
float _InnerAlpha;
float _OuterAlpha;
CBUFFER_END
struct Attributes
{
float4 positionOS : POSITION;
float3 normalOS : NORMAL;
};
struct Varyings
{
float4 positionHCS : SV_POSITION;
};
Varyings vert (Attributes input)
{
Varyings output;
float t = 0.6666667;
float widthScale = lerp(_InnerWidthScale, _OuterWidthScale, t);
float3 posOS = input.positionOS.xyz + input.normalOS * (_OutlineWidth * widthScale);
output.positionHCS = TransformObjectToHClip(posOS);
return output;
}
half4 frag (Varyings input) : SV_Target
{
float t = 0.6666667;
float alpha = lerp(_InnerAlpha, _OuterAlpha, t);
return half4(_OutlineColor.rgb * _Emission, _OutlineColor.a * alpha);
}
ENDHLSL
}
}
}