2013-10-15 184 views
0

當我創建Z緩衝質地像這樣:渲染Z緩衝到紋理的WebGL

gl.bindTexture(GL_TEXTURE_2D, texBuff); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
gl.texImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, frameBuff.width, frameBuff.height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, null); 

我得到一個合適的Z緩衝,我可以再使用的陰影(和我的陰影渲染罰款) 。但是,如果我創建一個顏色紋理,並用z值對紋理着色,則我的陰影會產生很多僞影(即使偏差很大)。顏色緩衝區創建這樣的:

gl.bindTexture(GL_TEXTURE_2D, colorBuff); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
gl.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, frameBuff.width, frameBuff.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, null); 

這是片段着色器程序寫入顏色緩衝區:

precision highp float; 
void main() { 
    float z = gl_FragCoord.z; 
    gl_FragColor = vec4(z, z, z, 1.0); 
} 

當我渲染兩個紋理一些表面上,他們看起來很相似。

所以我的問題是,爲什麼我的顏色紋理不工作? gl_FragCoord.z不是寫入z緩衝區的正確的z值嗎?根據http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_FragCoord.xml它是。當我綁定一個顏色緩衝區時,紋理是否協調一致?或者z值不正確?

回答

4

這個問題我花了很長時間來解析:)我希望我得到了正確的答案:

這只是精度。深度分量紋理具有至少16位的z值。彩色你每個通道只有8位。您可以寫入類似於(z,frac(z * 256.0),frac(z * 256.0 * 256.0))的內容來寫入完整的24位,而不是寫入相同的z到rgb。它看起來很奇怪,但如果你再讀一遍,你可以用dp3(1,1/256,1 /(256 * 256))解碼它。

順便說一句,你的問題難以理解的主要原因是我從來沒有讀回fragCoord得到z。我總是隻使用紋理座標來獲得紋理z。這使您可以更多地控制如何從頂點着色器生成和內插z。

+0

你是對的,這是一個精確的問題。我試圖使用顏色紋理來獲得深度值的完整32位精度。出於某種原因,你的解決方案似乎創造了更多的文物,我似乎無法擺脫它們。它也會隨機產生陰影。我認爲openGL會做一些額外的優化。 – spearmunkie