Logarithmic Depth Buffering in HLSL
===================================
`The Project Reality Team `_ implemented logarithmic depth buffering for the 1.7.3 update. This post covers our implementation of simple logarithmic depth buffering in HLSL.
`Outerra has an optimized 2013 implementation of logarithmic depth in GLSL `_. This is our simplified version of Outerra’s logarithmic depth in HLSL.
Source Code
-----------
::
float4x4 _WorldViewProj : WorldViewProj;
struct APP2VS
{
float4 Pos : POSITION0;
};
struct VS2PS
{
float4 HPos : POSITION;
float Depth : TEXCOORD0;
};
struct PS2FB
{
float4 Color : COLOR;
float Depth : DEPTH;
};
// Converts linear depth to logarithmic depth in the pixel shader
// Source: https://outerra.blogspot.com/2013/07/logarithmic-depth-buffer-optimizations.html
float ApplyLogarithmicDepth(float Depth)
{
const float FarPlane = 10000.0;
const float FCoef = 1.0 / log2(FarPlane + 1.0);
return log2(Depth) * FCoef;
}
VS2PS VS_LogDepth(APP2VS Input)
{
VS2PS Output = (VS2PS)0;
// Usually a transformation happens here
Output.HPos = mul(float4(Input.Pos.xyz, 1.0), _WorldViewProj);
// Output depth
Output.Depth = Output.HPos.w + 1.0;
return Output;
}
PS2FB PS_LogDepth(VS2PS Input)
{
PS2FB Output;
// You need to output something to the color buffer
Output.Color = 0.0;
// You must output to the pixel shader’s DEPTH semantic so the GPU can do per-fragment depth testing.
Output.Depth = ApplyLogarithmicDepth(Input.Depth);
return Output;
};