2014-01-23 71 views
0

我有一個工作陰影貼圖實現方向燈,其中我使用正投影構建投影矩陣。我的問題是,我如何可視化陰影貼圖?我使用了以下着色器(我使用透視投影),但是當我嘗試將其應用於使用正投影製作的陰影貼圖時,我所得到的是完全黑屏(即使陰影貼圖工作正常renderering場景本身)呈現陰影貼圖到屏幕?

#version 430 

layout(std140) uniform; 

uniform UnifDepth 
{ 
    mat4 mWVPMatrix; 
    vec2 mScreenSize; 
    float mZNear; 
    float mZFar; 
} UnifDepthPass; 

layout (binding = 5) uniform sampler2D unifDepthTexture; 

out vec4 fragColor; 

void main() 
{ 
    vec2 texcoord = gl_FragCoord.xy/UnifDepthPass.mScreenSize; 

    float depthValue = texture(unifDepthTexture, texcoord).x; 
    depthValue = (2.0 * UnifDepthPass.mZNear)/(UnifDepthPass.mZFar + UnifDepthPass.mZNear - depthValue * (UnifDepthPass.mZFar - UnifDepthPass.mZNear)); 

    fragColor = vec4(depthValue, depthValue, depthValue, 1.0); 
} 
+1

您可能忘記禁用'GL_TEXTURE_COMPARE_MODE',這意味着使用'sampler2D'對深度紋理進行採樣未定義(並且可能會產生全部黑色紋理)。如果您使用採樣器對象,則可以爲實際陰影處理使用啓用比較的不同採樣器對象,並且在想要可視化深度緩衝區時禁用比較。否則,此狀態是每個紋理對象。 –

+0

是的,它的工作原理,添加它作爲一個答案 – KaiserJohaan

回答

1

當你試圖用GL_TEXTURE_COMPARE_MODE設定爲自動取樣深度紋理GL_COMPARE_R_TO_TEXTURE。這對於實際執行具有深度紋理的陰影映射非常有用,但它試圖使用未定義的sampler2D對其進行採樣。由於您想要深度紋理中存儲的實際深度值,而不是通過/失敗深度測試的結果,因此需要首先將GL_TEXTURE_COMPARE_MODE設置爲GL_NONE

當您想要在可視化深度緩衝區和繪製陰影之間切換時,以每個紋理爲基礎設置此狀態非常不方便。我建議使用GL_TEXTURE_COMPARE_MODE的採樣器對象設置爲GL_COMPARE_R_TO_TEXTURE(與sampler2DShadow兼容)以進行陰影映射的着色器,以及另一個採樣器對象使用GL_NONE(與sampler2D兼容)來可視化深度緩衝區。這樣,您所要做的就是將取樣器對象綁定到紋理圖像單元5,取決於着色器實際使用深度紋理的方式。