Files
BABA_YAGA/Assets/Shaders/SukunaDistortionTrail.shader
2026-04-26 00:27:35 +07:00

71 lines
2.4 KiB
Plaintext

Shader "Sukuna/DistortionTrail"
{
Properties
{
_DistortionStrength("Distortion Strength", Range(0, 1)) = 0.5
_DistortionMap("Distortion Map", 2D) = "bump" {}
_WidthMask("Width Mask", Range(0, 1)) = 0.5
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent" "RenderPipeline" = "UniversalPipeline" }
LOD 100
Pass
{
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
float4 color : COLOR; // Sử dụng để lấy Alpha từ Trail Renderer
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
float4 screenPos : TEXCOORD1;
float4 color : COLOR;
};
float _DistortionStrength;
sampler2D _DistortionMap;
float _WidthMask;
Varyings vert(Attributes input)
{
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.uv = input.uv;
output.screenPos = ComputeScreenPos(output.positionCS);
output.color = input.color;
return output;
}
half4 frag(Varyings input) : SV_Target
{
// Mask cho trail: mờ ở 2 cạnh và mờ dần theo chiều dài
float mask = (1.0 - abs(input.uv.y - 0.5) * 2.0) * input.uv.x * input.color.a;
float2 noise = tex2D(_DistortionMap, input.uv * 2.0 + _Time.y).rg * 2.0 - 1.0;
float2 screenUV = input.screenPos.xy / input.screenPos.w;
float2 distortedUV = screenUV + noise * _DistortionStrength * 0.1 * mask;
float3 background = SampleSceneColor(distortedUV);
return float4(background, mask);
}
ENDHLSL
}
}
}