57 lines
2.1 KiB
Plaintext
57 lines
2.1 KiB
Plaintext
Shader "SLS/Postprocessing/RGBSplitGlitch"
|
|
{
|
|
SubShader
|
|
{
|
|
Tags
|
|
{
|
|
"RenderType" = "Opaque"
|
|
"RenderPipeline" = "UniversalPipeline"
|
|
}
|
|
ZWrite Off
|
|
Cull Off
|
|
|
|
HLSLINCLUDE
|
|
// 1. 引入 Unity 核心库 (替代原本的 #include "PostProcessingPass.hlsl")
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
// 引入 Blit 库以获得 Vert 顶点函数和 _BlitTexture
|
|
#include "Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl"
|
|
|
|
// 2. 定义该效果专用的变量
|
|
float4 _RGBSplitGlitchParams;
|
|
#define _RGBSplitGlitchIntensity _RGBSplitGlitchParams.x
|
|
#define _TimeX _RGBSplitGlitchParams.y
|
|
|
|
// 3. 辅助函数 (仅在此 Shader 内部使用)
|
|
float randomNoise(float x, float y)
|
|
{
|
|
return frac(sin(dot(float2(x, y), float2(12.9898, 78.233))) * 43758.5453);
|
|
}
|
|
|
|
// 4. 片段着色器逻辑
|
|
float4 RGBSplitGlitchPassFragment(Varyings input) : SV_Target
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
|
|
|
|
float splitAmount = _RGBSplitGlitchIntensity * randomNoise(_TimeX, 2);
|
|
|
|
// 使用 _BlitTexture 采样当前画面
|
|
half4 colorR = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, input.texcoord);
|
|
half4 colorG = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp,
|
|
float2(input.texcoord.x + splitAmount, input.texcoord.y + splitAmount));
|
|
half4 colorB = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp,
|
|
float2(input.texcoord.x - splitAmount, input.texcoord.y - splitAmount));
|
|
|
|
return half4(colorR.r, colorG.g, colorB.b, 1);
|
|
}
|
|
ENDHLSL
|
|
|
|
Pass
|
|
{
|
|
Name "RGB Split Glitch"
|
|
HLSLPROGRAM
|
|
#pragma vertex Vert // 使用 Blit.hlsl 中的 Vert
|
|
#pragma fragment RGBSplitGlitchPassFragment
|
|
ENDHLSL
|
|
}
|
|
}
|
|
} |