I know how to reconstruct a world-space position from a log-depth value from a previous topic, so I tried several different ways to get it to work for the soft particles.
For reference, this is the equation for the reconstruction:
float depthVal = DepthMap.Sample(depthSampler, texCoord).r; depthVal = (pow(0.001 * FarPlane + 1, depthVal) - 1) / 0.001; depthVal /= (1 * FarPlane) / (FarPlane - 1); //The 1 is the near plane value float2 invProjPos = mul(input.ScreenPosition.xy * depthVal, InverseProjection); float4 position = mul(float4(invProjPos, -depthVal, 1), InverseView); position /= position.w;So I figured to get the projection-space value, the equation should be just the first 3 lines. Next, I figured the particle's Z value should be calculated like this (from the vertex shader):
float4 worldPosition = mul(float4(input.Position, 1), instanceTransform); float4 viewPosition = mul(worldPosition, View); output.Position = mul(viewPosition, Projection); output.Position.z = log(0.001 * output.Position.z + 1) / log(0.001 * NearFar.y + 1) * output.Position.w; output.Z = output.Position.z;Now I know the value output to the depth buffer will be divided by the W normally, so I also tried changing the last line to:
output.Z = output.Position.z / output.Position.w;
In either case, the result is the same: no fading what-so-ever. The particles still have their hard edges. I'm not really sure what I'm doing wrong here and was hoping someone could point it out.
Full shader code: