2010-04-28 26 views
0

我的算法是這樣的: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
+0

你真的是指「從指向FBO呈現渲染從點到屏幕glutSwapBuffers()」兩次在你的文章? – 2010-04-28 06:41:21

+0

我的意思是指向FBO的渲染點,然後第一次渲染指向屏幕。第二次我的意思是渲染指向FBO,渲染指向屏幕(交換緩衝區在這裏給我不正確的輸出),然後再次渲染到屏幕(交換緩衝區給我這裏正確的輸出)。對不起,我想我的換行符沒有按照我的意圖格式化。 我懷疑有一些framebuffer參數在第一遍中設置得太晚,第二次是OK,但我不知道它是什麼。 – 2010-04-28 16:43:46

回答

0

您的FBO代碼沒有任何問題。但是你沒有告訴我們一切。如果這是你在做真的是:

[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 

然後不正確的輸出會黑屏(因爲你綁定默認的幀緩衝,清晰和交換緩衝區)。 glClear()和glXSwapBuffers()之間必須進行一些渲染。您應該發佈完整的源代碼而不是此grep-ped蹤跡。其次,你的問題與FBO沒有任何關係。它們不會以任何方式影響照明,你很可能不會正確地設置矩陣(當從光照和攝像機混合觀看時很容易混淆)。你的答案有點亂,所以你的代碼很可能也有點混亂。也許你應該嘗試在那裏尋找...