在GLSL中,存在著sampler2D和sampler2DShadow兩種2D貼圖采樣器。在對一個深度貼圖(指內部格式為GL_DEPTH_COMPONENT或GL_DEPTH_STENCIL的貼圖)進行采樣時,可以使用前述兩種2D貼圖采樣器其中的一種進行采樣。對兩種2D貼圖采樣器取捨,與貼圖對比模式(Texture Comparison Modes)有關。
OpenGL 4.2提供了兩種貼圖對比模式,分別為普通對比模式(GL_NONE)和引用到貼圖對比模式(GL_COMPARE_REF_TO_TEXTURE)。可以通過設置貼圖參數GL_TEXTURE_COMPARE_MODE來改變比較模式,改參數的默認值是普通對比模式(GL_NONE)。
如果選擇普通對比模式(GL_NONE)作為當前對比模式,則在GLSL著色器腳本中,必須使用sampler2D作為貼圖采樣器。此時,深度貼圖會像顏色紋理貼圖一樣進行采樣。用於采樣的貼圖坐標是一個2D的向量,采樣的結果是一個4D向量,每個分量都包含著同樣的單精度深度值。
如果選擇引用到貼圖對比模式(GL_COMPARE_REF_TO_TEXTURE)作為當前對比模式,則在GLSL著色腳本中,必須使用sampler2DShadow作為貼圖采樣器。此時,用於采樣的貼圖坐標是一個3D向量。這個3D向量的x分量和y分量用於查找深度貼圖中的深度值,而z分量將作為參考值(Reference Value)和找到的深度值進行深度測試。測試的結果取決於比較函數。可以通過設置貼圖參數GL_ TEXTURE_COMPARE_FUNC來改變比較函數,默認值是GL_LEQUAL。如果測試通過,則采樣結果返回1.0,否則返回0.0。如果深度貼圖使用了線性過濾,那麼返回值是實現相關的。但是返回值應該在[0, 1]區間上。
在編程時,如果未按照上述原則正確使用相應的貼圖采樣器和貼圖比較模式,將產生未定義的結果。
注意:如果深度貼圖的內部格式是歸一化整數時,那麼其內部的深度值會被映射到[0, 1] 區間上。用於比較的參考值必須被映射到[0, 1] 區間後,再和深度貼圖中保存的深度值比較才有意義。
參考文獻