關於OpenGL+GLSL深度貼圖採樣

做者:Nin+.Lee編程

郵箱:lilei9110@gmail.com函數

* 本文屬原創,轉載請註明出處。測試

 

在GLSL中,存在着sampler2D和sampler2DShadow兩種2D貼圖採樣器。在對一個深度貼圖(指內部格式爲GL_DEPTH_COMPONENT或GL_DEPTH_STENCIL的貼圖)進行採樣時,能夠使用前述兩種2D貼圖採樣器其中的一種進行採樣。對兩種2D貼圖採樣器取捨,與貼圖對比模式(Texture Comparison Modes)有關。spa

 

OpenGL 4.2提供了兩種貼圖對比模式,分別爲普通對比模式(GL_NONE)和引用到貼圖對比模式(GL_COMPARE_REF_TO_TEXTURE)。能夠經過設置貼圖參數GL_TEXTURE_COMPARE_MODE來改變比較模式,改參數的默認值是普通對比模式(GL_NONE)。ci

 

若是選擇普通對比模式(GL_NONE)做爲當前對比模式,則在GLSL着色器腳本中,必須使用sampler2D做爲貼圖採樣器。此時,深度貼圖會像顏色紋理貼圖同樣進行採樣。用於採樣的貼圖座標是一個2D的向量,採樣的結果是一個4D向量,每一個份量都包含着一樣的單精度深度值。get

 

若是選擇引用到貼圖對比模式(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]區間上。io

 

在編程時,若是未按照上述原則正確使用相應的貼圖採樣器和貼圖比較模式,將產生未定義的結果。引用

 

注意:若是深度貼圖的內部格式是歸一化整數時,那麼其內部的深度值會被映射到[0, 1] 區間上。用於比較的參考值必須被映射到[0, 1] 區間後,再和深度貼圖中保存的深度值比較纔有意義。腳本

 

參考文獻di

  1. OpenGL Wiki, http://www.opengl.org/wiki/Sampler_Object#Comparison_mode
  2. The OpenGL Shading Language Specification Version 4.2, p.139, 8.9 Texture Functions
  3. The OpenGL Graphics System: A Specification Version 4.2, p.260, 3.9.17 Texture Comparison Modes
相關文章
相關標籤/搜索