Created
March 5, 2023 13:53
-
-
Save laicasaane/b879b3dddcc477e897666db8116fc95b to your computer and use it in GitHub Desktop.
A modification of "Universal Render Pipeline/2D/Sprite-Unlit-Default" to make it SRP Batching compatible, according to URP 2D 15.0.4
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Shader "URP 2D/Sprite-Unlit-SRP-Batching" | |
{ | |
Properties | |
{ | |
_MainTex ("Sprite Texture", 2D) = "white" {} | |
// Legacy properties. They're here so that materials using this shader can gracefully fallback to the legacy sprite shader. | |
[HideInInspector] _Color ("Tint", Color) = (1,1,1,1) | |
[HideInInspector] PixelSnap ("Pixel snap", Float) = 0 | |
[HideInInspector] _RendererColor ("RendererColor", Color) = (1,1,1,1) | |
[HideInInspector] _Flip ("Flip", Vector) = (1,1,1,1) | |
[HideInInspector] _AlphaTex ("External Alpha", 2D) = "white" {} | |
[HideInInspector] _EnableExternalAlpha ("Enable External Alpha", Float) = 0 | |
} | |
SubShader | |
{ | |
Tags {"Queue" = "Transparent" "RenderType" = "Transparent" "RenderPipeline" = "UniversalPipeline" } | |
Blend SrcAlpha OneMinusSrcAlpha | |
Cull Off | |
ZWrite Off | |
Pass | |
{ | |
Tags { "LightMode" = "Universal2D" } | |
HLSLPROGRAM | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" | |
#if defined(DEBUG_DISPLAY) | |
#include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/InputData2D.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/SurfaceData2D.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/Debugging2D.hlsl" | |
#endif | |
#pragma vertex UnlitVertex | |
#pragma fragment UnlitFragment | |
#pragma multi_compile _ DEBUG_DISPLAY | |
struct Attributes | |
{ | |
float3 positionOS : POSITION; | |
float4 color : COLOR; | |
float2 uv : TEXCOORD0; | |
UNITY_VERTEX_INPUT_INSTANCE_ID | |
}; | |
struct Varyings | |
{ | |
float4 positionCS : SV_POSITION; | |
half4 color : COLOR; | |
float2 uv : TEXCOORD0; | |
#if defined(DEBUG_DISPLAY) | |
float3 positionWS : TEXCOORD2; | |
#endif | |
UNITY_VERTEX_OUTPUT_STEREO | |
}; | |
TEXTURE2D(_MainTex); | |
SAMPLER(sampler_MainTex); | |
// NOTE: Do not ifdef the properties here as SRP batcher can not handle different layouts. | |
CBUFFER_START(UnityPerMaterial) | |
half4 _MainTex_ST; | |
half4 _Color; | |
half4 _Flip; | |
CBUFFER_END | |
float3 UnityFlipSprite(in float3 pos, in float2 flip) | |
{ | |
return float3(pos.xy * flip, pos.z); | |
} | |
Varyings UnlitVertex(Attributes v) | |
{ | |
Varyings o = (Varyings)0; | |
UNITY_SETUP_INSTANCE_ID(v); | |
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); | |
v.positionOS = UnityFlipSprite(v.positionOS, _Flip.xy); | |
o.positionCS = TransformObjectToHClip(v.positionOS); | |
#if defined(DEBUG_DISPLAY) | |
o.positionWS = TransformObjectToWorld(v.positionOS); | |
#endif | |
o.uv = TRANSFORM_TEX(v.uv, _MainTex); | |
o.color = v.color * _Color; | |
return o; | |
} | |
half4 UnlitFragment(Varyings i) : SV_Target | |
{ | |
float4 mainTex = i.color * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv); | |
#if defined(DEBUG_DISPLAY) | |
SurfaceData2D surfaceData; | |
InputData2D inputData; | |
half4 debugColor = 0; | |
InitializeSurfaceData(mainTex.rgb, mainTex.a, surfaceData); | |
InitializeInputData(i.uv, inputData); | |
SETUP_DEBUG_DATA_2D(inputData, i.positionWS); | |
if(CanDebugOverrideOutputColor(surfaceData, inputData, debugColor)) | |
{ | |
return debugColor; | |
} | |
#endif | |
return mainTex; | |
} | |
ENDHLSL | |
} | |
Pass | |
{ | |
Tags { "LightMode" = "UniversalForward" "Queue"="Transparent" "RenderType"="Transparent"} | |
HLSLPROGRAM | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" | |
#if defined(DEBUG_DISPLAY) | |
#include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/InputData2D.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/SurfaceData2D.hlsl" | |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Debug/Debugging2D.hlsl" | |
#endif | |
#pragma vertex UnlitVertex | |
#pragma fragment UnlitFragment | |
#pragma multi_compile_fragment _ DEBUG_DISPLAY | |
struct Attributes | |
{ | |
float3 positionOS : POSITION; | |
float4 color : COLOR; | |
float2 uv : TEXCOORD0; | |
UNITY_VERTEX_INPUT_INSTANCE_ID | |
}; | |
struct Varyings | |
{ | |
float4 positionCS : SV_POSITION; | |
float4 color : COLOR; | |
float2 uv : TEXCOORD0; | |
#if defined(DEBUG_DISPLAY) | |
float3 positionWS : TEXCOORD2; | |
#endif | |
UNITY_VERTEX_OUTPUT_STEREO | |
}; | |
TEXTURE2D(_MainTex); | |
SAMPLER(sampler_MainTex); | |
// NOTE: Do not ifdef the properties here as SRP batcher can not handle different layouts. | |
CBUFFER_START( UnityPerMaterial ) | |
half4 _MainTex_ST; | |
half4 _Color; | |
half4 _Flip; | |
CBUFFER_END | |
float3 UnityFlipSprite(in float3 pos, in float2 flip) | |
{ | |
return float3(pos.xy * flip, pos.z); | |
} | |
Varyings UnlitVertex(Attributes attributes) | |
{ | |
Varyings o = (Varyings)0; | |
UNITY_SETUP_INSTANCE_ID(attributes); | |
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); | |
attributes.positionOS = UnityFlipSprite(attributes.positionOS, _Flip.xy); | |
o.positionCS = TransformObjectToHClip(attributes.positionOS); | |
#if defined(DEBUG_DISPLAY) | |
o.positionWS = TransformObjectToWorld(attributes.positionOS); | |
#endif | |
o.uv = TRANSFORM_TEX(attributes.uv, _MainTex); | |
o.color = attributes.color * _Color; | |
return o; | |
} | |
float4 UnlitFragment(Varyings i) : SV_Target | |
{ | |
float4 mainTex = i.color * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv); | |
#if defined(DEBUG_DISPLAY) | |
SurfaceData2D surfaceData; | |
InputData2D inputData; | |
half4 debugColor = 0; | |
InitializeSurfaceData(mainTex.rgb, mainTex.a, surfaceData); | |
InitializeInputData(i.uv, inputData); | |
SETUP_DEBUG_DATA_2D(inputData, i.positionWS); | |
if(CanDebugOverrideOutputColor(surfaceData, inputData, debugColor)) | |
{ | |
return debugColor; | |
} | |
#endif | |
return mainTex; | |
} | |
ENDHLSL | |
} | |
} | |
Fallback "Universal Render Pipeline/2D/Sprite-Unlit-Default" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment