Files
HauntedBloodlines/Assets/Obi/Resources/ObiMaterials/URP/SimpleParticleShaderURP.shader
2025-05-29 22:31:40 +03:00

146 lines
3.5 KiB
Plaintext

Shader "Obi/URP/Simple Particles" {
Properties {
_Color ("Particle color", Color) = (1,1,1,1)
}
SubShader {
Tags{"RenderPipeline" = "UniversalRenderPipeline"}
Pass {
Name "ParticleFwdBase"
Tags {"Queue"="Geometry" "IgnoreProjector"="True" "RenderType"="Opaque" "LightMode" = "UniversalForward"}
Blend SrcAlpha OneMinusSrcAlpha
HLSLPROGRAM
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma target 2.0
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
#pragma multi_compile _ _SHADOWS_SOFT
#include "../ObiUtils.cginc"
#include "ObiLightingURP.cginc"
#include "../ObiParticles.cginc"
float4 _Color;
float4 _LightColor0;
struct vin{
float4 vertex : POSITION;
float3 corner : NORMAL;
float4 color : COLOR;
float4 t0 : TEXCOORD0; // ellipsoid t1 vector
};
struct v2f
{
float4 pos : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
float3 lightDir : TEXCOORD1;
};
v2f vert(vin v)
{
v2f o;
// particle positions are passed in world space, no need to use modelview matrix, just view.
float radius = v.t0.w * _RadiusScale;
float4 viewpos = mul(UNITY_MATRIX_V, v.vertex) + float4(v.corner.x, v.corner.y, 0, 0) * radius; // multiply by size.
o.pos = mul(UNITY_MATRIX_P, viewpos);
o.texcoord = float3(v.corner.x*0.5+0.5, v.corner.y*0.5+0.5, radius);
o.color = v.color * _Color;
o.lightDir = mul ((float3x3)UNITY_MATRIX_MV, ObjSpaceLightDir(v.vertex));
return o;
}
float4 frag(v2f i) : SV_Target
{
// generate sphere normals:
float3 n = BillboardSphereNormals(i.texcoord);
// simple lighting: ambient
half3 amb = SampleSphereAmbient(n);
// simple lighting: diffuse
float ndotl = saturate( dot( n, normalize(i.lightDir) ) );
// final lit color:
return float4(i.color.rgb * (_LightColor0 * ndotl + amb),i.color.a);
}
ENDHLSL
}
Pass {
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
Offset 1, 1
Fog {Mode Off}
ZWrite On ZTest LEqual
HLSLPROGRAM
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma target 2.0
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile_shadowcaster
#include "../ObiUtils.cginc"
#include "ObiLightingURP.cginc"
#include "../ObiParticles.cginc"
struct vin{
float4 vertex : POSITION;
float3 corner : NORMAL;
float4 t0 : TEXCOORD0; // ellipsoid t1 vector
};
struct v2f {
float4 pos : POSITION;
float3 texcoord : TEXCOORD0;
};
v2f vert( vin v )
{
v2f o;
float radius = v.t0.w * _RadiusScale;
float4 viewpos = mul(UNITY_MATRIX_V, v.vertex) + float4(v.corner.x, v.corner.y, 0, 0) * radius;
o.pos = mul(UNITY_MATRIX_P, viewpos);
o.texcoord = float3(v.corner.x*0.5+0.5, v.corner.y*0.5+0.5, radius);
return o;
}
float4 frag( v2f i ) : SV_Target
{
float3 n = BillboardSphereNormals(i.texcoord);
return float4(0,0,0,0);
}
ENDHLSL
}
}
}