Files
Hasebe/Assets/Code/OfficeGame/BattleMode/HitBoxes/HitboxVisualizer.shader
T

89 lines
2.8 KiB
Plaintext

Shader "Custom/HitboxVisualizer"
{
Properties
{
[HDR] _BaseColor ("Color", Color) = (1, 0, 0, 0.7)
_BorderWidth ("Border Width", Range(0.005, 0.15)) = 0.035
}
SubShader
{
Tags
{
"RenderType" = "Transparent"
"Queue" = "Transparent+200"
"RenderPipeline" = "UniversalPipeline"
}
Pass
{
Name "HitboxPass"
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
Cull Off
ZTest LEqual
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
CBUFFER_START(UnityPerMaterial)
float _BorderWidth;
CBUFFER_END
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(float4, _BaseColor)
UNITY_INSTANCING_BUFFER_END(Props)
Varyings vert(Attributes input)
{
Varyings output = (Varyings)0;
UNITY_SETUP_INSTANCE_ID(input);
UNITY_TRANSFER_INSTANCE_ID(input, output);
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.uv = input.uv;
return output;
}
half4 frag(Varyings input) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(input);
half4 baseColor = UNITY_ACCESS_INSTANCED_PROP(Props, _BaseColor);
// Дистанция до края полигона (грани куба)
float2 dist = min(input.uv, 1.0 - input.uv);
float edgeDist = min(dist.x, dist.y);
// 1.0 если пиксель на краю грани, иначе 0.0
float isEdge = step(edgeDist, _BorderWidth);
half4 finalColor = baseColor;
// Внутри объема цвет прозрачный, на гранях — яркий и четкий
finalColor.a = lerp(baseColor.a * 0.25, saturate(baseColor.a * 1.5), isEdge);
finalColor.rgb = lerp(baseColor.rgb, baseColor.rgb * 1.3, isEdge);
return finalColor;
}
ENDHLSL
}
}
FallBack Off
}