編輯:我把宗教組織的方程,以確保問題不是從那裏來,所以現在我只是做了以下內容:iPhone開發:渲染深度緩衝,以黑色質感紋理效果
設置質地:
GLuint FB0Texture;
glGenTextures(1, &FB0Texture);
glBindTexture(GL_TEXTURE_2D, FB0Texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, size.width, size.height,
0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
,然後渲染:
[self drawScene];
[(EAGLView *)self.view bindFB0];
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 320, 480);
[self drawFullScreenQuad]; (it's actually not full screen so I can see both the 3d scene and the resulting texture)
,我也得到了相同的結果!黑色紋理,如果我將FB0Texture設置爲「DEPTH_COMPONENT」紋理,但正常場景,如果我將FB0Texture設置爲常規GL_RGBA紋理...
所以我想我要麼設置深度紋理錯誤,要麼可能我我在渲染中做錯了什麼,這會導致RGBA紋理看起來很正常,但深度紋理被擰緊了? GL_DEPTH_TEST已啓用且工作正常(模型看起來正確),所以我認爲實際渲染沒有任何問題,但此時我絕望尋找線索......
請幫忙!
//編輯END
我想實現在iPhone上一些基本的陰影映射,但是我堅持在呈現深度值的質地......這是推動我瘋了,我明明做一些錯誤,但無法弄清楚它是什麼......
所以我在做什麼:
- 設置默認的幀緩衝,附上顏色渲染緩衝和深度渲染緩衝區
- 設置一個新的幀緩衝(叫它FB0),附加紋理深度分量
後來,當我渲染:
- 抽獎現場FB0
- 切換到默認的framebuffer
- 借鑑使用FB0作爲全屏四一個質地
我得到......沒有! (以及我得到一個完整的白色紋理)
如果我將紋理附加到FB0的顏色分量而不是深度分量,一切正常,因爲在我將場景繪製到FB0中,然後使用FB0作爲紋理繪製一個全屏幕四邊形,並且我確切地看到了如果我直接繪製到默認幀緩衝區時會看到的內容。
但是,當我將紋理附加到深度組件時,我所得到的就是這個白色屏幕/紋理。
一些代碼:
設置緩衝區:
// Create default framebuffer object.
glGenFramebuffers(1, &defaultFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
// Create color render buffer and allocate backing store.
glGenRenderbuffers(1, &colorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
// Create depth render buffer
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 320, 480);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
// Create Depth Map Frame Buffer
glGenFramebuffers(1, &FB0);
glBindFramebuffer(GL_FRAMEBUFFER, FB0);
// Attach texture to depth component
glGenTextures(1, &FB0Texture);
glBindTexture(GL_TEXTURE_2D, FB0Texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, size.width, size.height,
0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER,
GL_DEPTH_ATTACHMENT,
GL_TEXTURE_2D,
FB0Texture,
0);
如果我檢查的幀緩衝區的狀態,這個我沒有得到任何錯誤信息後,所以我假定緩衝區正確創建。
然後在渲染:
[(EAGLView *)self.view setFB0]; (just binds the framebuffer)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self drawScene];
[(EAGLView *)self.view setFramebuffer]; (binds back the default frame buffer)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[(EAGLView *)self.view bindFB0Texture];
[self drawFullScreenQuad];
[(EAGLView *)self.view presentFramebuffer];
在這一點上,我希望看到一個黑白紋理表示深度的灰色的水平,而是我只是得到一個純白色的四/紋理。
同樣,如果我將FB0Texture附加到GL_COLOR_ATTACHMENT0而不是GL_DEPTH_ATTACHMENT,則所有事情都按預期工作,我的場景將正確渲染到紋理。所以我想這個問題來自於我如何附加紋理,或者我在做什麼的順序?