2025-09-24 11:24:38 +05:00

123 lines
2.5 KiB
Plaintext

Shader "Hidden/Outline/Outline"
{
HLSLINCLUDE
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
TEXTURE2D_X(_MaskTex);
SAMPLER(sampler_MaskTex);
TEXTURE2D_X(_MainTex);
SAMPLER(sampler_MainTex);
float2 _MainTex_TexelSize;
float4 _Color;
float _Intensity;
int _Width;
float _Samples[32];
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_OUTPUT_STEREO
};
struct Attributes
{
uint vertexID : SV_VertexID;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
Varyings VertexSimple(Attributes input)
{
Varyings output = (Varyings)0;
UNITY_SETUP_INSTANCE_ID(input);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
output.positionCS = GetFullScreenTriangleVertexPosition(input.vertexID);
output.uv = GetFullScreenTriangleTexCoord(input.vertexID);
return output;
}
float CalcIntensity(float2 uv, float2 offset)
{
float intensity = 0;
[unroll(32)]
for (int k = 1; k <= _Width; ++k)
{
intensity += SAMPLE_TEXTURE2D_X(_MainTex, sampler_MainTex, uv + k * offset).r * _Samples[k];
intensity += SAMPLE_TEXTURE2D_X(_MainTex, sampler_MainTex, uv - k * offset).r * _Samples[k];
}
intensity += SAMPLE_TEXTURE2D_X(_MainTex, sampler_MainTex, uv).r * _Samples[0];
return intensity;
}
float4 FragmentH(Varyings i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
float2 uv = UnityStereoTransformScreenSpaceTex(i.uv);
float intensity = CalcIntensity(uv, float2(_MainTex_TexelSize.x, 0));
return float4(intensity, intensity, intensity, 1);
}
float4 FragmentV(Varyings i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
float2 uv = UnityStereoTransformScreenSpaceTex(i.uv);
if (SAMPLE_TEXTURE2D_X(_MaskTex, sampler_MaskTex, uv).r > 0)
discard;
float intensity = CalcIntensity(uv, float2(0, _MainTex_TexelSize.y)) * _Intensity;
return float4(_Color.rgb, saturate(_Color.a * intensity));
}
ENDHLSL
SubShader
{
Tags{ "RenderPipeline" = "UniversalPipeline" }
Cull Off
ZWrite Off
ZTest Always
Lighting Off
Pass
{
Name "HPass"
HLSLPROGRAM
#pragma target 3.5
#pragma multi_compile_instancing
#pragma vertex VertexSimple
#pragma fragment FragmentH
ENDHLSL
}
Pass
{
Name "VPassBlend"
Blend SrcAlpha OneMinusSrcAlpha
HLSLPROGRAM
#pragma target 3.5
#pragma multi_compile_instancing
#pragma vertex VertexSimple
#pragma fragment FragmentV
ENDHLSL
}
}
}