我正在使用32位浮點值,這些值是我爲每個頂點的x,y,z
位置輸入到頂點着色器中的。但是,我已經讀過,opengl使用24位深度緩衝區和8位模板緩衝區。opengl深度測試如何使用24位深度緩衝區?
因爲,我複製了在頂點着色器中作爲輸入接收的gl_position
中相同的32位浮點數,我想了解opengl如何將此32位浮點數轉換爲24位用於深度測試。
我正在使用32位浮點值,這些值是我爲每個頂點的x,y,z
位置輸入到頂點着色器中的。但是,我已經讀過,opengl使用24位深度緩衝區和8位模板緩衝區。opengl深度測試如何使用24位深度緩衝區?
因爲,我複製了在頂點着色器中作爲輸入接收的gl_position
中相同的32位浮點數,我想了解opengl如何將此32位浮點數轉換爲24位用於深度測試。
頂點着色器中的gl_Position
是一個剪輯空間座標。將生成一個由w
的除法生成規範化設備座標,其中OpenGL中的可見範圍爲[-1,1](默認情況下,可以在當前進行更改)。這些值將根據當前設置的glDepthRange
參數進行轉換,最終得到窗口空間z
值,該值在[0,1]
範圍內。
深度緩衝區必須存儲這些值,並且 - 非常類似於通常只存儲每個通道值8位的顏色值 - 整數深度緩衝區用於表示該範圍內的固定點值。
從setction 13.6引用「座標變換」的OpenGL 4.5 core profile spec(重點煤礦)的:
z_w
可以使用一個定點或浮點表示來表示。 但是,如果繪製幀緩衝區具有浮點深度緩衝區,則必須使用浮點表示法。 如果使用m
位定點表示,我們 假定它表示各值k/(2^m-1)
, 其中k
在{0,1,...,2^m
- 1},爲k(例如1.0以二進制形式表示爲全部1的字符串)。
所以,窗口空間z_w
值(它是在[0,1])僅通過2^m -1
相乘,並且舍入爲整數,並將結果存儲在緩衝器中。
1)那麼,在使用深度測試時,我必然會失去精度,因爲它會四捨五入到最接近的整數?如果場景中有大量物體,例如10^7,那麼我無法確保深度測試的準確性? 2)既然你已經引用了OpenGL 4.5規範,那麼在早期版本中沒有規範嗎? 3)我不是很確定m位固定點表示法,是浮點數表示成位的嗎? – user007
1)透視情況下的z的雙曲線畸變對於深度測試precsion來說將是一個更大的交易。不知道爲什麼你將深度測試與對象的數量聯繫起來,它根本不關心對象。 2)我剛剛引用了最新的規範。舊規格,回到1.0,基本上說是一回事。 3)我甚至不知道這個問題。 – derhass
我擔心對象數量的原因是,例如,我想爲所有10^7對象分配深度值,然後給定浮點表示(IEEE 754),可能難以根據他們的深度,由於精度損失,同時代表花車。我不知道雙曲線失真是什麼意思,所以我會嘗試閱讀它,看看它如何影響深度測試。只是想知道是否可以根據這些獨特的深度來正確區分這些大量的對象。 – user007