Files
ichni_Creator_Studio/Assets/Shaders/ScriptablePostProcessor/Shaders/RadialBlur.shader
SoulliesOfficial aee62cd637 大修
2026-03-14 02:30:26 -04:00

117 lines
3.7 KiB
Plaintext

Shader "SLS/Postprocessing/RadialBlur"
{
SubShader
{
Tags
{
"RenderType" = "Opaque"
"RenderPipeline" = "UniversalPipeline"
}
ZWrite Off
Cull Off
HLSLINCLUDE
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl"
// 变量定义
float4 _RadialBlurParams;
#define _BlurRadius _RadialBlurParams.x
#define _RadialCenter _RadialBlurParams.yz
// --- 具体实现函数 ---
half4 RadialBlurPassFragment_4Tap(Varyings input): SV_Target
{
float2 uv = input.texcoord - _RadialCenter;
half scale = 1;
half4 color = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv * scale + _RadialCenter);
scale = _BlurRadius + 1;
color += SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv * scale + _RadialCenter);
scale = 2 * _BlurRadius + 1;
color += SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv * scale + _RadialCenter);
scale = 3 * _BlurRadius + 1;
color += SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv * scale + _RadialCenter);
color *= 0.25f; // 1/4
return color;
}
half4 RadialBlurPassFragment_8Tap(Varyings input): SV_Target
{
float2 uv = input.texcoord - _RadialCenter;
half4 color = 0;
// 为了代码简洁,这里可以使用循环,但在 Shader 中手动展开(Unroll)通常性能更好或便于控制
// 这里保留你原本的展开逻辑
[unroll]
for(int i=0; i<8; i++)
{
half scale = i * _BlurRadius + 1;
color += SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv * scale + _RadialCenter);
}
return color * 0.125f;
}
half4 RadialBlurPassFragment_12Tap(Varyings input): SV_Target
{
float2 uv = input.texcoord - _RadialCenter;
half4 color = 0;
for(int i=0; i<12; i++) {
half scale = i * _BlurRadius + 1;
color += SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv * scale + _RadialCenter);
}
return color * 0.0833f;
}
half4 RadialBlurPassFragment_16Tap(Varyings input): SV_Target
{
float2 uv = input.texcoord - _RadialCenter;
half4 color = 0;
for(int i=0; i<16; i++) {
half scale = i * _BlurRadius + 1;
color += SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv * scale + _RadialCenter);
}
return color * 0.0625f;
}
ENDHLSL
Pass
{
Name "Radial Blur 4 Tap"
HLSLPROGRAM
#pragma vertex Vert
#pragma fragment RadialBlurPassFragment_4Tap
ENDHLSL
}
Pass
{
Name "Radial Blur 8 Tap"
HLSLPROGRAM
#pragma vertex Vert
#pragma fragment RadialBlurPassFragment_8Tap
ENDHLSL
}
Pass
{
Name "Radial Blur 12 Tap"
HLSLPROGRAM
#pragma vertex Vert
#pragma fragment RadialBlurPassFragment_12Tap
ENDHLSL
}
Pass
{
Name "Radial Blur 16 Tap"
HLSLPROGRAM
#pragma vertex Vert
#pragma fragment RadialBlurPassFragment_16Tap
ENDHLSL
}
}
}