2013-10-21 180 views
0

我想實現shadowmapping,所以我渲染深度紋理。當我不綁定包含深度紋理的framebuffer並使用默認幀緩衝區時,它會輸出到屏幕。然而,它們是紅色的,而不是遠處碎片的白色。Opengl渲染深度紋理 - 紅色?

這是我的片段着色器:

#version 330 

out float fragmentdepth; 
uniform sampler2D inputTex; 

void main(){ 
fragmentdepth = gl_FragCoord.z; 
} 

這是個問題嗎?因爲shadowmapping不起作用,我想排除這個問題的根源。

+2

如果您正在寫入深度紋理,爲什麼要將深度輸出到顏色緩衝區?基本上這個着色器的內存帶寬要求增加了一倍,因爲深度也被寫入到FBO深度附着點的任何附件中。 –

+0

我不記得了,但是'gl_FragDepth'還沒有像'gl_FragColour'一樣被刪除?如果'fragmentdepth'在COLOUR_ATTACHMENT0的其他RGBA輸出中被簡單地視爲紅色,則這是有意義的。除非你打算將深度寫入浮點顏色紋理而不是深度紋理,但是你仍然需要進行深度測試,正如@ AndonM.Coleman指出的那樣,帶寬是雙倍的。也許嘗試寫入'gl_FragDepth'? – jozxyqk

+0

絕對不會,'gl_FragDepth'依然存在。儘管在着色器中寫入任何內容是一個很壞的主意,因爲它打破了很多硬件深度優化(Hi-Z,早期深度測試等)。 –

回答

2

深度是一個標量值。標量被OpenGL解釋爲單組件紋理。單組件貼圖意味着只有.x.r元素(無論您使用什麼)都不爲零。

+0

當我從着色器中的紋理讀取時,x,y和z元素不爲零。 – user1760770

+4

@ user1760770這是因爲對於GLSL> = 130的版本,任何具有深度紋理的sampler2D都將返回vec4(r,r,r,1.0),無論您如何設置GL_DEPTH_TEXTURE_MODE(因爲它已被刪除來自GL3)。這在第pg頁解釋。 320 [OpenGL 3.2核心規格](http://www.opengl.org/registry/doc/glspec32.core.20091207.pdf)。 –