반응형
Shader "CatDarkGame/SoftParticle"
{
Properties
{
[Header(Surface Options)] [Space(5)]
[Enum(Additive,1,AlphaBlend,10)] _DstFactor("Blend Mode", float) = 10
[Enum(UnityEngine.Rendering.CullMode)] _Cull("Cull Mode", float) = 2
[Enum(Off,0,On,1)] _ZWrite("Z Write", float) = 0
[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("Z Test", float) = 4
[Space(5)]
[Header(Surface Inputs)] [Space(5)]
[MainTexture] _BaseMap("Texture", 2D) = "white" {}
[MainColor] _BaseColor("Color", Color) = (1, 1, 1, 1)
[Space(10)]
[Toggle(_SOFTPARTICLES_ON)] _SoftParticles_On("Soft Particles", float) = 0
_DepthFadeNear("DepthFade Near", Range(-1, 4)) = 0.0
_DepthFadeFar("DepthFade Far", Range(-1, 8)) = 4.0
}
SubShader
{
Tags { "RenderType" = "Transparent" "Queue"="Transparent" "RenderPipeline" = "UniversalPipeline" }
LOD 100
Pass
{
Name "URPSoftParticle"
Tags {"LightMode" = "SRPDefaultUnlit"}
Blend SrcAlpha [_DstFactor]
Cull[_Cull]
ZTest[_ZTest]
ZWrite[_ZWrite]
HLSLPROGRAM
#pragma target 4.5
#pragma exclude_renderers gles d3d9
#pragma shader_feature_local _SOFTPARTICLES_ON
#pragma multi_compile_fog
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"
CBUFFER_START(UnityPerMaterial)
float4 _BaseMap_ST;
float4 _BaseColor;
half _DepthFadeNear;
half _DepthFadeFar;
CBUFFER_END
TEXTURE2D(_BaseMap); SAMPLER(sampler_BaseMap);
struct Attributes
{
float4 positionOS : POSITION;
half4 color : COLOR;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD0;
float fogFactor : TEXCOORD1;
#if defined(_SOFTPARTICLES_ON)
float4 screenPos : TEXCOORD2;
#endif
};
Varyings vert(Attributes input)
{
Varyings output = (Varyings)0;
float4 positionOS = input.positionOS;
float3 positionWS = TransformObjectToWorld(positionOS.xyz);
// float3 positionVS = TransformWorldToView(positionWS);
float4 positionCS = TransformWorldToHClip(positionWS);
output.fogFactor = ComputeFogFactor(positionCS.z);
#if defined(_SOFTPARTICLES_ON)
output.screenPos = ComputeScreenPos(positionCS); // Calc NDC Position
#endif
output.positionCS = positionCS;
output.uv = input.uv;
output.color = input.color;
return output;
}
float4 frag(Varyings input) : SV_Target
{
float depthFade = 1;
#if defined(_SOFTPARTICLES_ON)
float4 screenPos = input.screenPos;
float rawDepth = SampleSceneDepth(screenPos.xy / screenPos.w);
float sceneDepth = (unity_OrthoParams.w == 0) ? LinearEyeDepth(rawDepth, _ZBufferParams) : LinearDepthToEyeDepth(rawDepth);
float thisDepth = LinearEyeDepth(screenPos.z / screenPos.w, _ZBufferParams);
depthFade = saturate(_DepthFadeFar * ((sceneDepth - _DepthFadeNear) - thisDepth));
#endif
float2 baseMapUV = input.uv.xy * _BaseMap_ST.xy + _BaseMap_ST.zw;
float4 texColor = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, baseMapUV);
float4 finalColor = texColor * _BaseColor * input.color;
finalColor.rgb = MixFog(finalColor.rgb, input.fogFactor);
finalColor.a *= depthFade;
return finalColor;
}
ENDHLSL
}
}
}
포스팅 업데이트
- 23.03.07
URP 쉐이더 코드 스타일로 최신화
MVP 행렬 변환 부분 분할
DepthFade 코드 잘못된 연산 부분 올바르게 수정.
반응형
'Unity > Shader & VFX' 카테고리의 다른 글
LinearEyeDepth와 Linear01Depth (0) | 2023.07.13 |
---|---|
Unity Triplanar Shader 분석 & StaticWorldPosition 응용 (0) | 2023.07.10 |
자동 UV타일링 쉐이더 (1) | 2022.11.11 |
유니티 빌보드 쉐이더 구현 & 분석 (1) | 2022.11.04 |
털(Fur) 쉐이더 R&D - 로스트아크에서 털 표현하는 방법 (0) | 2022.11.01 |
WRITTEN BY
- CatDarkGame
Technical Artist dhwlgn12@gmail.com
,