Files
ichni_Official/Assets/Shaders/BlendUnlit.shader

388 lines
15 KiB
Plaintext
Raw Normal View History

2026-03-31 07:51:40 -04:00
// BlendUnlit.shader
// Soullies - Hand-written URP 17 Unlit Sprite/Mesh Shader
// Derived from TrackShader (ASE), rewritten for clarity and extensibility.
//
2026-04-06 09:32:56 -04:00
// Core Feature: Base Color * Texture, optionally multiplied by an HDR Emission Color.
2026-03-31 07:51:40 -04:00
// New Feature : Runtime-selectable Blend Mode (Alpha, Additive, Multiply, Premultiplied).
2026-04-06 09:32:56 -04:00
// Updated : Tightly packed Custom Data (Emission RGBA & UV Offset XY) to perfectly match Unity Particle System streams.
2026-03-31 07:51:40 -04:00
Shader "Soullies/BlendUnlit"
{
Properties
{
[Header(Texture)]
2026-04-03 10:53:11 -04:00
_MainTex ("Main Texture", 2D) = "white" {}
2026-03-31 07:51:40 -04:00
[Space(8)]
[Header(Color)]
[MainColor] _BaseColor ("Base Color", Color) = (1, 1, 1, 1)
[Space(8)]
[Header(Emission)]
2026-04-03 10:53:11 -04:00
[Toggle] _EnableEmission ("Enable Emission", Float) = 0
2026-04-06 09:32:56 -04:00
[Toggle] _UseParticleDataForEmission ("Use Particle Data for Emission", Float) = 0
2026-03-31 07:51:40 -04:00
[HDR] _EmissionColor ("Emission Color (HDR)", Color) = (0, 0, 0, 1)
2026-04-06 09:32:56 -04:00
[Space(8)]
[Header(UV Animation)]
[Toggle] _UseParticleDataForUV ("Use Particle Data for UV Panning", Float) = 0
2026-03-31 07:51:40 -04:00
[Space(8)]
[Header(Alpha Source)]
2026-04-03 10:53:11 -04:00
[Toggle] _UseRedAsAlpha ("Use Red Channel as Alpha", Float) = 0
2026-03-31 07:51:40 -04:00
[Space(8)]
[Header(Blend Mode)]
[KeywordEnum(Alpha, Additive, Multiply, Premultiplied)] _BlendMode ("Blend Mode", Float) = 0
[Space(8)]
[Header(Render State)]
2026-04-06 09:32:56 -04:00
[Enum(UnityEngine.Rendering.CullMode)] _CullMode ("Cull Mode", Float) = 2
2026-03-31 07:51:40 -04:00
[Enum(Off, 0, On, 1)] _ZWrite ("Z Write", Float) = 0
[HideInInspector] _SrcBlendRGB ("Src Blend (Internal)", Float) = 5
[HideInInspector] _DstBlendRGB ("Dst Blend (Internal)", Float) = 10
}
SubShader
{
Tags
{
"RenderPipeline" = "UniversalPipeline"
"RenderType" = "Transparent"
"Queue" = "Transparent"
"UniversalMaterialType" = "Unlit"
"IgnoreProjector" = "True"
"PreviewType" = "Plane"
"CanUseSpriteAtlas" = "True"
}
Cull [_CullMode]
ZWrite [_ZWrite]
ZTest LEqual
// ---------------------------------------------------------------------------
2026-04-06 09:32:56 -04:00
// Pass 1 Universal 2D
2026-03-31 07:51:40 -04:00
// ---------------------------------------------------------------------------
Pass
{
Name "BlendUnlit_Universal2D"
Tags { "LightMode" = "Universal2D" }
Blend [_SrcBlendRGB] [_DstBlendRGB]
HLSLPROGRAM
#pragma target 3.5
#pragma prefer_hlslcc gles
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#pragma multi_compile_vertex _ SKINNED_SPRITE
#pragma shader_feature_local _BLENDMODE_ALPHA _BLENDMODE_ADDITIVE _BLENDMODE_MULTIPLY _BLENDMODE_PREMULTIPLIED
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/Core2D.hlsl"
2026-04-06 09:32:56 -04:00
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
2026-03-31 07:51:40 -04:00
CBUFFER_START(UnityPerMaterial)
2026-04-03 10:53:11 -04:00
float4 _MainTex_ST;
2026-03-31 07:51:40 -04:00
half4 _BaseColor;
half4 _EmissionColor;
2026-04-06 09:32:56 -04:00
float _EnableEmission;
float _UseParticleDataForEmission;
float _UseParticleDataForUV;
float _UseRedAsAlpha;
float _BlendMode;
float _CullMode;
2026-03-31 07:51:40 -04:00
float _ZWrite;
float _SrcBlendRGB;
float _DstBlendRGB;
CBUFFER_END
struct Attributes
{
float3 positionOS : POSITION;
2026-04-06 09:32:56 -04:00
float4 uvAndEmissionRG : TEXCOORD0; // xy = Base UV, zw = Custom1.xy (Emission R, G)
float4 emissionBAAndCustomUV: TEXCOORD1; // xy = Custom1.zw (Emission B, Intensity), zw = Custom2.xy (UV Offset)
half4 color : COLOR;
2026-03-31 07:51:40 -04:00
UNITY_SKINNED_VERTEX_INPUTS
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float4 positionCS : SV_POSITION;
2026-04-06 09:32:56 -04:00
float4 uvAndEmissionRG : TEXCOORD0;
float4 emissionBAAndCustomUV: TEXCOORD1;
half4 color : COLOR;
2026-03-31 07:51:40 -04:00
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
2026-04-06 09:32:56 -04:00
half4 ComputeColor(float2 uv, half4 vertexColor, float4 customEmissionData)
2026-03-31 07:51:40 -04:00
{
2026-04-03 10:53:11 -04:00
half4 texSample = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv);
half texAlpha = lerp(texSample.a, texSample.r, _UseRedAsAlpha);
2026-03-31 07:51:40 -04:00
half4 texColor = half4(texSample.rgb, texAlpha);
half4 color = texColor * _BaseColor;
2026-04-06 09:32:56 -04:00
half4 particleEmissionModifier = half4(customEmissionData.rgb * customEmissionData.a, 1.0);
half4 targetEmissionColor = lerp(_EmissionColor, _EmissionColor * particleEmissionModifier, _UseParticleDataForEmission);
half4 emissionMult = lerp(half4(1, 1, 1, 1), targetEmissionColor, _EnableEmission);
2026-04-03 10:53:11 -04:00
color *= emissionMult;
2026-03-31 07:51:40 -04:00
color *= vertexColor;
return color;
}
Varyings vert(Attributes IN)
{
Varyings OUT = (Varyings)0;
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_TRANSFER_INSTANCE_ID(IN, OUT);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
UNITY_SKINNED_VERTEX_COMPUTE(IN);
IN.positionOS = UnityFlipSprite(IN.positionOS, unity_SpriteProps.xy);
VertexPositionInputs vpi = GetVertexPositionInputs(IN.positionOS);
OUT.positionCS = vpi.positionCS;
2026-04-06 09:32:56 -04:00
OUT.uvAndEmissionRG.xy = TRANSFORM_TEX(IN.uvAndEmissionRG.xy, _MainTex);
OUT.uvAndEmissionRG.zw = IN.uvAndEmissionRG.zw;
OUT.emissionBAAndCustomUV = IN.emissionBAAndCustomUV;
OUT.color = IN.color * unity_SpriteColor;
2026-03-31 07:51:40 -04:00
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);
2026-04-06 09:32:56 -04:00
float2 baseUV = IN.uvAndEmissionRG.xy;
float2 uvOffset = IN.emissionBAAndCustomUV.zw;
float2 finalUV = lerp(baseUV, baseUV + uvOffset, _UseParticleDataForUV);
float4 customEmissionData = float4(IN.uvAndEmissionRG.zw, IN.emissionBAAndCustomUV.xy);
2026-03-31 07:51:40 -04:00
2026-04-06 09:32:56 -04:00
return ComputeColor(finalUV, IN.color, customEmissionData);
}
2026-03-31 07:51:40 -04:00
ENDHLSL
}
// ---------------------------------------------------------------------------
2026-04-06 09:32:56 -04:00
// Pass 2 Universal Forward
2026-03-31 07:51:40 -04:00
// ---------------------------------------------------------------------------
Pass
{
Name "BlendUnlit_Forward"
Tags { "LightMode" = "UniversalForwardOnly" }
Blend [_SrcBlendRGB] [_DstBlendRGB]
HLSLPROGRAM
#pragma target 3.5
#pragma prefer_hlslcc gles
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#pragma multi_compile_fog
#pragma shader_feature_local _BLENDMODE_ALPHA _BLENDMODE_ADDITIVE _BLENDMODE_MULTIPLY _BLENDMODE_PREMULTIPLIED
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/Core2D.hlsl"
2026-04-06 09:32:56 -04:00
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
2026-03-31 07:51:40 -04:00
CBUFFER_START(UnityPerMaterial)
2026-04-03 10:53:11 -04:00
float4 _MainTex_ST;
2026-03-31 07:51:40 -04:00
half4 _BaseColor;
half4 _EmissionColor;
2026-04-03 10:53:11 -04:00
float _EnableEmission;
2026-04-06 09:32:56 -04:00
float _UseParticleDataForEmission;
float _UseParticleDataForUV;
2026-04-03 10:53:11 -04:00
float _UseRedAsAlpha;
2026-04-06 09:32:56 -04:00
float _BlendMode;
float _CullMode;
2026-03-31 07:51:40 -04:00
float _ZWrite;
float _SrcBlendRGB;
float _DstBlendRGB;
CBUFFER_END
struct Attributes
{
float3 positionOS : POSITION;
2026-04-06 09:32:56 -04:00
float4 uvAndEmissionRG : TEXCOORD0;
float4 emissionBAAndCustomUV: TEXCOORD1;
half4 color : COLOR;
2026-03-31 07:51:40 -04:00
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float4 positionCS : SV_POSITION;
2026-04-06 09:32:56 -04:00
float4 uvAndEmissionRG : TEXCOORD0;
float4 emissionBAAndCustomUV: TEXCOORD1;
half fogFactor : TEXCOORD2; // 顺延至 TEXCOORD2
half4 color : COLOR;
2026-03-31 07:51:40 -04:00
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
2026-04-06 09:32:56 -04:00
half4 ComputeColor(float2 uv, half4 vertexColor, float4 customEmissionData)
2026-03-31 07:51:40 -04:00
{
2026-04-03 10:53:11 -04:00
half4 texSample = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv);
half texAlpha = lerp(texSample.a, texSample.r, _UseRedAsAlpha);
2026-03-31 07:51:40 -04:00
half4 texColor = half4(texSample.rgb, texAlpha);
half4 color = texColor * _BaseColor;
2026-04-06 09:32:56 -04:00
half4 particleEmissionModifier = half4(customEmissionData.rgb * customEmissionData.a, 1.0);
half4 targetEmissionColor = lerp(_EmissionColor, _EmissionColor * particleEmissionModifier, _UseParticleDataForEmission);
half4 emissionMult = lerp(half4(1, 1, 1, 1), targetEmissionColor, _EnableEmission);
2026-04-03 10:53:11 -04:00
color *= emissionMult;
2026-03-31 07:51:40 -04:00
color *= vertexColor;
return color;
}
Varyings vert(Attributes IN)
{
Varyings OUT = (Varyings)0;
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_TRANSFER_INSTANCE_ID(IN, OUT);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
VertexPositionInputs vpi = GetVertexPositionInputs(IN.positionOS);
OUT.positionCS = vpi.positionCS;
2026-04-06 09:32:56 -04:00
OUT.uvAndEmissionRG.xy = TRANSFORM_TEX(IN.uvAndEmissionRG.xy, _MainTex);
OUT.uvAndEmissionRG.zw = IN.uvAndEmissionRG.zw;
OUT.emissionBAAndCustomUV = IN.emissionBAAndCustomUV;
2026-03-31 07:51:40 -04:00
OUT.fogFactor = ComputeFogFactor(vpi.positionCS.z);
2026-04-06 09:32:56 -04:00
OUT.color = IN.color;
2026-03-31 07:51:40 -04:00
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);
2026-04-06 09:32:56 -04:00
float2 baseUV = IN.uvAndEmissionRG.xy;
float2 uvOffset = IN.emissionBAAndCustomUV.zw;
float2 finalUV = lerp(baseUV, baseUV + uvOffset, _UseParticleDataForUV);
float4 customEmissionData = float4(IN.uvAndEmissionRG.zw, IN.emissionBAAndCustomUV.xy);
half4 color = ComputeColor(finalUV, IN.color, customEmissionData);
2026-03-31 07:51:40 -04:00
color.rgb = MixFog(color.rgb, IN.fogFactor);
return color;
}
ENDHLSL
}
// ---------------------------------------------------------------------------
2026-04-06 09:32:56 -04:00
// Pass 3 Scene Selection
2026-03-31 07:51:40 -04:00
// ---------------------------------------------------------------------------
Pass
{
Name "SceneSelectionPass"
Tags { "LightMode" = "SceneSelectionPass" }
Cull Off
HLSLPROGRAM
#pragma target 3.5
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
2026-04-03 10:53:11 -04:00
float4 _MainTex_ST;
2026-03-31 07:51:40 -04:00
half4 _BaseColor;
half4 _EmissionColor;
2026-04-06 09:32:56 -04:00
float _EnableEmission;
float _UseParticleDataForEmission;
float _UseParticleDataForUV;
float _UseRedAsAlpha;
float _BlendMode;
float _CullMode;
2026-03-31 07:51:40 -04:00
float _ZWrite;
float _SrcBlendRGB;
float _DstBlendRGB;
CBUFFER_END
int _ObjectId;
int _PassValue;
struct Attributes { float3 positionOS : POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID };
struct Varyings { float4 positionCS : SV_POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID };
Varyings vert(Attributes IN)
{
Varyings OUT = (Varyings)0;
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_TRANSFER_INSTANCE_ID(IN, OUT);
OUT.positionCS = TransformObjectToHClip(IN.positionOS);
return OUT;
}
2026-04-06 09:32:56 -04:00
half4 frag(Varyings IN) : SV_Target { return half4(_ObjectId, _PassValue, 1.0, 1.0); }
2026-03-31 07:51:40 -04:00
ENDHLSL
}
// ---------------------------------------------------------------------------
2026-04-06 09:32:56 -04:00
// Pass 4 Scene Picking
2026-03-31 07:51:40 -04:00
// ---------------------------------------------------------------------------
Pass
{
Name "ScenePickingPass"
Tags { "LightMode" = "Picking" }
Cull Off
HLSLPROGRAM
#pragma target 3.5
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
2026-04-03 10:53:11 -04:00
float4 _MainTex_ST;
2026-03-31 07:51:40 -04:00
half4 _BaseColor;
half4 _EmissionColor;
2026-04-06 09:32:56 -04:00
float _EnableEmission;
float _UseParticleDataForEmission;
float _UseParticleDataForUV;
float _UseRedAsAlpha;
float _BlendMode;
float _CullMode;
2026-03-31 07:51:40 -04:00
float _ZWrite;
float _SrcBlendRGB;
float _DstBlendRGB;
CBUFFER_END
float4 _SelectionID;
struct Attributes { float3 positionOS : POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID };
struct Varyings { float4 positionCS : SV_POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID };
Varyings vert(Attributes IN)
{
Varyings OUT = (Varyings)0;
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_TRANSFER_INSTANCE_ID(IN, OUT);
OUT.positionCS = TransformObjectToHClip(IN.positionOS);
return OUT;
}
2026-04-06 09:32:56 -04:00
half4 frag(Varyings IN) : SV_Target { return unity_SelectionID; }
2026-03-31 07:51:40 -04:00
ENDHLSL
}
}
CustomEditor "BlendUnlitShaderGUI"
FallBack "Hidden/Universal Render Pipeline/FallbackError"
2026-04-06 09:32:56 -04:00
}