Files
beyond/Assets/ThirdParty/Lux URP Essentials/Shaders/Outline/Lux URP Fast Outline.shader
2024-11-20 15:21:28 +01:00

147 lines
4.8 KiB
GLSL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Shader "Lux URP/Fast Outline"
{
Properties
{
[HeaderHelpLuxURP_URL(gpukpasbzt01)]
[Header(Surface Options)]
[Space(5)]
[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Int) = 4
[Enum(UnityEngine.Rendering.CullMode)] _Cull ("Culling", Float) = 2
[Space(5)]
[IntRange] _StencilRef ("Stencil Reference", Range (0, 255)) = 0
[IntRange] _ReadMask (" Read Mask", Range (0, 255)) = 255
[Enum(UnityEngine.Rendering.CompareFunction)] _StencilCompare ("Stencil Comparison", Int) = 6
[Header(Outline)]
_Color ("Color", Color) = (1,1,1,1)
_Border ("Width", Float) = 3
[Space(5)]
[Toggle(_APPLYFOG)] _ApplyFog("Enable Fog", Float) = 0.0
}
SubShader
{
Tags
{
"RenderPipeline" = "UniversalPipeline"
"RenderType"="Opaque"
"Queue"= "Transparent+59" // +59 smalltest to get drawn on top of transparents
}
Pass
{
Name "StandardUnlit"
Tags{"LightMode" = "UniversalForward"}
Stencil {
Ref [_StencilRef]
ReadMask [_ReadMask]
Comp [_StencilCompare]
Pass Keep
}
Blend SrcAlpha OneMinusSrcAlpha
// We only use backfaces here so we do not need a stencil test. Well - now we use stencil. so only front faces.
// Cull Back
Cull [_Cull]
ZTest [_ZTest]
// Make sure we do not get overwritten
ZWrite On
HLSLPROGRAM
// Required to compile gles 2.0 with standard srp library
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma target 2.0
#pragma shader_feature_local _APPLYFOG
// -------------------------------------
// Lightweight Pipeline keywords
// -------------------------------------
// Unity defined keywords
#pragma multi_compile_fog
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#pragma vertex vert
#pragma fragment frag
// Lighting include is needed because of GI
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitInput.hlsl"
CBUFFER_START(UnityPerMaterial)
half4 _Color;
half _Border;
CBUFFER_END
struct VertexInput
{
float4 vertex : POSITION;
float3 normal : NORMAL;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct VertexOutput
{
float4 position : POSITION;
#if defined(_APPLYFOG)
half fogCoord : TEXCOORD0;
#endif
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
VertexOutput vert (VertexInput v)
{
VertexOutput o = (VertexOutput)0;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_TRANSFER_INSTANCE_ID(v, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.position = TransformObjectToHClip(v.vertex.xyz);
#if defined(_APPLYFOG)
o.fogCoord = ComputeFogFactor(o.position.z);
#endif
// Extrude
if (_Border > 0.0h) {
float3 normal = mul(UNITY_MATRIX_MVP, float4(v.normal, 0)).xyz; // to clip space
//float3 normal = mul(GetWorldToHClipMatrix(), mul(GetObjectToWorldMatrix(), float4(v.normal, 0.0)));
float2 offset = normalize(normal.xy);
float2 ndc = _ScreenParams.xy * 0.5;
o.position.xy += ((offset * _Border) / ndc * o.position.w);
}
return o;
}
half4 frag (VertexOutput input ) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(input);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
#if defined(_APPLYFOG)
_Color.rgb = MixFog(_Color.rgb, input.fogCoord);
#endif
return half4(_Color);
}
ENDHLSL
}
}
FallBack "Hidden/InternalErrorShader"
}