我的算法是這樣的:OpenGL的幀緩衝對象怪異的行爲
渲染場景以從多個位置 陰影映射一個FBO渲染場景與陰影映射 ......黑魔法,我還是要在屏幕imlement ... 將步驟1中的樣本與步驟2中的圖像結合起來
我正在嘗試調試步驟1和2,並且遇到了STRANGE行爲。我的每個陰影映射遍算法是: 渲染從每個光 的POV連接到深度陣列紋理場景到FBO渲染從視點和使用頂點/ FRAG着色器的場景進行比較深處
當我跑我的算法是這樣的:
從點渲染到FBO 從點渲染到屏幕 glutSwapBuffers()
在屏幕通行證的法向量似乎是不正確的(倒可能)。我很確定這是問題,因爲我的漫反射照明計算不正確,但材質顏色正確,並且陰影出現在正確的位置。所以,似乎唯一可能是罪魁禍首的是法線。
但是,如果我這樣做
從點到FBO 呈現由點渲染到屏幕 glutSwapBuffers()//錯在這裏 從點渲染到屏幕 glutSwapBuffers()
第二遍是正確的。我認爲我的framebuffer調用有問題。任何人都可以從下面的日誌中看到問題是什麼?它來自一個爲緩衝而津津樂道的軍號蹤跡,只需稍作修改即可使其更加清晰。
[INFO] trace.call: glGenFramebuffersEXT(1, 0xdfeb90 -> { 1 }) [INFO] trace.call: glGenFramebuffersEXT(1, 0xdfebac -> { 2 }) [INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) [INFO] trace.call: glDrawBuffer(GL_NONE) [INFO] trace.call: glReadBuffer(GL_NONE) [INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) //start render to FBO [INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2) [INFO] trace.call: glReadBuffer(GL_NONE) [INFO] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 2, 0) [INFO] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 3, 0) [INFO] trace.call: glDrawBuffer(GL_COLOR_ATTACHMENT0) //bind to the FBO attached to a depth tex array for shadows [INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) [INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) [INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) //draw geometry //bind to the FBO I want the shadow mapped image rendered to [INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2) [INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) //draw geometry //draw to screen pass //again shadow mapping FBO [INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) [INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) [INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) //draw geometry //bind to the screen [INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) [INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) //finished, swap buffers [INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) //INCORRECT OUTPUT //second try at render to screen: [INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) [INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) [INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) //draw geometry [INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) [INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) draw geometry [INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) //correct output
你真的是指「從指向FBO呈現渲染從點到屏幕glutSwapBuffers()」兩次在你的文章? – 2010-04-28 06:41:21
我的意思是指向FBO的渲染點,然後第一次渲染指向屏幕。第二次我的意思是渲染指向FBO,渲染指向屏幕(交換緩衝區在這裏給我不正確的輸出),然後再次渲染到屏幕(交換緩衝區給我這裏正確的輸出)。對不起,我想我的換行符沒有按照我的意圖格式化。 我懷疑有一些framebuffer參數在第一遍中設置得太晚,第二次是OK,但我不知道它是什麼。 – 2010-04-28 16:43:46