|
|
@@ -0,0 +1,132 @@
|
|
|
+#include "Uniforms.hlsl"
|
|
|
+#include "Samplers.hlsl"
|
|
|
+#include "Transform.hlsl"
|
|
|
+#include "ScreenPos.hlsl"
|
|
|
+#include "Fog.hlsl"
|
|
|
+
|
|
|
+#if defined(COMPILEPS) && defined(SOFTPARTICLES)
|
|
|
+#ifndef D3D11
|
|
|
+// D3D9 uniform
|
|
|
+uniform float cSoftParticleFadeScale;
|
|
|
+#else
|
|
|
+// D3D11 constant buffer
|
|
|
+cbuffer CustomPS : register(b6)
|
|
|
+{
|
|
|
+ float cSoftParticleFadeScale;
|
|
|
+}
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
+void VS(float4 iPos : POSITION,
|
|
|
+ #ifndef NOUV
|
|
|
+ float2 iTexCoord : TEXCOORD0,
|
|
|
+ #endif
|
|
|
+ #ifdef VERTEXCOLOR
|
|
|
+ float4 iColor : COLOR0,
|
|
|
+ #endif
|
|
|
+ #ifdef SKINNED
|
|
|
+ float4 iBlendWeights : BLENDWEIGHT,
|
|
|
+ int4 iBlendIndices : BLENDINDICES,
|
|
|
+ #endif
|
|
|
+ #ifdef INSTANCED
|
|
|
+ float4x3 iModelInstance : TEXCOORD4,
|
|
|
+ #endif
|
|
|
+ #if defined(BILLBOARD) || defined(DIRBILLBOARD)
|
|
|
+ float2 iSize : TEXCOORD1,
|
|
|
+ #endif
|
|
|
+ #if defined(DIRBILLBOARD) || defined(TRAILBONE)
|
|
|
+ float3 iNormal : NORMAL,
|
|
|
+ #endif
|
|
|
+ #if defined(TRAILFACECAM) || defined(TRAILBONE)
|
|
|
+ float4 iTangent : TANGENT,
|
|
|
+ #endif
|
|
|
+ out float2 oTexCoord : TEXCOORD0,
|
|
|
+ #ifdef SOFTPARTICLES
|
|
|
+ out float4 oScreenPos : TEXCOORD1,
|
|
|
+ #endif
|
|
|
+ out float4 oWorldPos : TEXCOORD2,
|
|
|
+ #ifdef VERTEXCOLOR
|
|
|
+ out float4 oColor : COLOR0,
|
|
|
+ #endif
|
|
|
+ #if defined(D3D11) && defined(CLIPPLANE)
|
|
|
+ out float oClip : SV_CLIPDISTANCE0,
|
|
|
+ #endif
|
|
|
+ out float4 oPos : OUTPOSITION)
|
|
|
+{
|
|
|
+ // Define a 0,0 UV coord if not expected from the vertex data
|
|
|
+ #ifdef NOUV
|
|
|
+ float2 iTexCoord = float2(0.0, 0.0);
|
|
|
+ #endif
|
|
|
+
|
|
|
+ float4x3 modelMatrix = iModelMatrix;
|
|
|
+ float3 worldPos = GetWorldPos(modelMatrix);
|
|
|
+ oPos = GetClipPos(worldPos);
|
|
|
+ oTexCoord = GetTexCoord(iTexCoord);
|
|
|
+ oWorldPos = float4(worldPos, GetDepth(oPos));
|
|
|
+
|
|
|
+ #if defined(D3D11) && defined(CLIPPLANE)
|
|
|
+ oClip = dot(oPos, cClipPlane);
|
|
|
+ #endif
|
|
|
+
|
|
|
+ #ifdef SOFTPARTICLES
|
|
|
+ oScreenPos = GetScreenPos(oPos);
|
|
|
+ #endif
|
|
|
+
|
|
|
+ #ifdef VERTEXCOLOR
|
|
|
+ oColor = iColor;
|
|
|
+ #endif
|
|
|
+}
|
|
|
+
|
|
|
+void PS(float2 iTexCoord : TEXCOORD0,
|
|
|
+ #ifdef SOFTPARTICLES
|
|
|
+ float4 iScreenPos: TEXCOORD1,
|
|
|
+ #endif
|
|
|
+ float4 iWorldPos: TEXCOORD2,
|
|
|
+ #ifdef VERTEXCOLOR
|
|
|
+ float4 iColor : COLOR0,
|
|
|
+ #endif
|
|
|
+ #if defined(D3D11) && defined(CLIPPLANE)
|
|
|
+ float iClip : SV_CLIPDISTANCE0,
|
|
|
+ #endif
|
|
|
+ out float4 oColor : OUTCOLOR0)
|
|
|
+{
|
|
|
+ // Get material diffuse albedo
|
|
|
+ #ifdef DIFFMAP
|
|
|
+ float4 diffColor = cMatDiffColor * Sample2D(DiffMap, iTexCoord);
|
|
|
+ #ifdef ALPHAMASK
|
|
|
+ if (diffColor.a < 0.5)
|
|
|
+ discard;
|
|
|
+ #endif
|
|
|
+ #else
|
|
|
+ float4 diffColor = cMatDiffColor;
|
|
|
+ #endif
|
|
|
+
|
|
|
+ #ifdef VERTEXCOLOR
|
|
|
+ diffColor *= iColor;
|
|
|
+ #endif
|
|
|
+
|
|
|
+ // Get fog factor
|
|
|
+ #ifdef HEIGHTFOG
|
|
|
+ float fogFactor = GetHeightFogFactor(iWorldPos.w, iWorldPos.y);
|
|
|
+ #else
|
|
|
+ float fogFactor = GetFogFactor(iWorldPos.w);
|
|
|
+ #endif
|
|
|
+
|
|
|
+ // Soft particle fade
|
|
|
+ #ifdef SOFTPARTICLES
|
|
|
+ float particleDepth = iWorldPos.w;
|
|
|
+ float depth = Sample2DProj(DepthBuffer, iScreenPos).r;
|
|
|
+ #ifdef HWDEPTH
|
|
|
+ depth = ReconstructDepth(depth);
|
|
|
+ #endif
|
|
|
+ float diffZ = abs(depth - particleDepth) * (cFarClipPS - cNearClipPS);
|
|
|
+ float fade = saturate(1.0 - diffZ * cSoftParticleFadeScale);
|
|
|
+ #ifndef ADDITIVE
|
|
|
+ diffColor.a -= fade;
|
|
|
+ #else
|
|
|
+ diffColor.rgb -= fade;
|
|
|
+ #endif
|
|
|
+ #endif
|
|
|
+
|
|
|
+ oColor = float4(GetFog(diffColor.rgb, fogFactor), diffColor.a);
|
|
|
+}
|