這篇文章主要是參考MJP的“Attack of The Depth Buffer”,測試不同格式下depth buffer的精度。
測試的depth buffer包含兩類: 一是非線性的depth buffer,存儲著perspective z(也就是最常用的,透視投影后歸一化的z/w的buffer),二是線性的depth buffer,存儲著view space z(這里的線性指的是在view space 中是否線性)。測試的格式包括16位浮點數(shù),32位浮點數(shù),16位定點數(shù),還有最常用的24位定點數(shù)(DXGI_FORMAT_D24_UNORM_S8_UINT) 。
測試的方法是在pixel shader里采樣depth buffer,然后構(gòu)建出view space position,把這個值和vertex shader里插值過來的position做對比,把兩者的差別輸出到RT的red分量,這樣越紅的部分誤差就越大。測試的near-clip plane為1,far-clip plane為300,場景模型用的是DXSDK里的Columns。
測試程序畫面的左半邊顯示精度誤差,右半邊顯示把精度誤值乘以100的結(jié)果。
運行結(jié)果:
Linear Z,16位浮點格式
從結(jié)果可以看出16位浮點的誤差還是蠻大的,越靠近far-clip plane,誤差越大
Linear Z,32位浮點格式