DirectXMath icon indicating copy to clipboard operation
DirectXMath copied to clipboard

Add matrix functions for generating infinite reversed-z perspective projection matrix

Open TheRealMJP opened this issue 2 years ago • 4 comments

Hello, I think it would be really great if DirectXMath added support for generating perspective projection matrices with infinite reversed-z clip planes. This style of projection matrix has become increasing popular in recent years since they result in excellent distribution of depth precision when used with floating-point depth buffers, and they effectively remove the need for having a maximum view distance. This blog post gives a good overview of why it's good and how it works, and this article has some great visualizations of why reversed-z is beneficial.

TheRealMJP avatar Jan 29 '23 02:01 TheRealMJP

Thanks for the feedback. It turns out you can trivially use the existing functions for reverse-z: swap the far/near values:

m_proj = XMMatrixPerspectiveFovLH(XM_PIDIV4, aspect, c_farZ, c_nearZ);

Be sure to clear the depth-buffer with 0.0 instead of 1.1, and use the reverse depth comparison operator for the Depth/Stencil state (i.e. D3Dxx_COMPARISON_GREATER_EQUAL instead of D3Dxx_COMPARISON_LESS_EQUAL).

I have support for reverse-z in the DirectX Tool Kit CommonStates.

walbourn avatar Jan 29 '23 06:01 walbourn

Hey @walbourn, thank you for replying! To be clear I was specifically referring to the "infinite" variant of a reversed-z projection, which cannot be done with the existing perspective matrix functions (finite reversed projections can be done as you suggested). The infinite reversed matrix has this form for the LH variant:

xScale     0          0             0
0        yScale       0             0
0          0          0             1
0          0          znear         0

TheRealMJP avatar Jan 30 '23 01:01 TheRealMJP

Thanks for the clarification.

walbourn avatar Jan 30 '23 05:01 walbourn

Thank you for the suggestion. I definitely see the value in this, but I'll need a bit more time to do the full validation/verification this warrants. In the meantime, you can of course easily create your own projection matrix with existing constructors and functions.

walbourn avatar Feb 14 '24 18:02 walbourn