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 }