Shader "Hidden/HeadlessHazard/CRT" { Properties { _Intensity ("Intensity", Range(0,1)) = 0.65 _ScanlineDensity ("Scanline Density", Range(0,2)) = 1.2 _ScanlineStrength ("Scanline Strength", Range(0,1)) = 0.18 _Curvature ("Curvature", Range(0,0.2)) = 0.04 _VignetteStrength ("Vignette Strength", Range(0,1)) = 0.28 _ChromaticAberration ("Chromatic Aberration", Range(0,0.05)) = 0.004 _NoiseStrength ("Noise Strength", Range(0,0.2)) = 0.03 _FlickerStrength ("Flicker Strength", Range(0,0.1)) = 0.015 } SubShader { Tags { "RenderPipeline" = "UniversalPipeline" } Pass { Name "CRT" ZWrite Off ZTest Always Cull Off Blend One Zero HLSLPROGRAM #pragma vertex Vert #pragma fragment Frag #pragma target 3.5 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #include "Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl" float _Intensity; float _ScanlineDensity; float _ScanlineStrength; float _Curvature; float _VignetteStrength; float _ChromaticAberration; float _NoiseStrength; float _FlickerStrength; float Random01(float2 seed) { return frac(sin(dot(seed, float2(12.9898, 78.233))) * 43758.5453); } float2 DistortUV(float2 uv, float curvature) { float2 center = uv * 2.0 - 1.0; float radius2 = dot(center, center); center *= 1.0 + (radius2 * curvature); return center * 0.5 + 0.5; } half4 Frag(Varyings input) : SV_Target { float2 uv = input.texcoord; float2 curvedUV = DistortUV(uv, _Curvature); if (curvedUV.x < 0.0 || curvedUV.x > 1.0 || curvedUV.y < 0.0 || curvedUV.y > 1.0) { return half4(0.0, 0.0, 0.0, 1.0); } float2 fromCenter = curvedUV - 0.5; float2 aberrationOffset = fromCenter * _ChromaticAberration; half red = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, curvedUV + aberrationOffset).r; half green = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, curvedUV).g; half blue = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, curvedUV - aberrationOffset).b; half3 color = half3(red, green, blue); float scanlineWave = sin((curvedUV.y * _ScreenParams.y * 0.5 * _ScanlineDensity) + (_Time.y * 18.0)); float scanlineMask = lerp(1.0, saturate(0.7 + 0.3 * scanlineWave), _ScanlineStrength); color *= scanlineMask; float noise = Random01(curvedUV * _ScreenParams.xy + _Time.yy * 37.0) - 0.5; color += noise * _NoiseStrength; float flicker = 1.0 - (_FlickerStrength * (0.5 + 0.5 * sin(_Time.y * 32.0))); color *= flicker; float2 vignetteUV = curvedUV * (1.0 - curvedUV.yx); float vignette = saturate(pow(vignetteUV.x * vignetteUV.y * 18.0, 0.2)); color *= lerp(1.0 - _VignetteStrength, 1.0, vignette); half3 baseColor = SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_LinearClamp, uv).rgb; half3 finalColor = lerp(baseColor, color, _Intensity); return half4(finalColor, 1.0); } ENDHLSL } } }