2012-06-21 148 views
2

我試圖從FBO到窗口的幀緩衝區拷貝。據我所知,窗口幀緩衝器對R,G,B和A中的每一個都有8位,並且有一個深度緩衝器(可能是24位)。 FBO有一個紋理附件(格式爲RGBA8),沒有渲染緩衝區。glBlitFramebuffer導致訪問衝突

的問題是,當我嘗試做塊的FBO到屏幕上,我得到一個訪問衝突(的Windows期限爲SIGSEGV)。閃爍代碼:

//Earlier: const int screen_rect[4] = {0,0,512,512}; 

glBindFramebuffer(GL_READ_FRAMEBUFFER,fbo->framebuffer); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,    0); 
glFinish(); 
//checking GL errors here gives no error 
glBlitFramebuffer(
    screen_rect[0],screen_rect[1],screen_rect[2],screen_rect[3], 
    screen_rect[0],screen_rect[1],screen_rect[2],screen_rect[3], 
    GL_COLOR_BUFFER_BIT, 
    GL_NEAREST //EDIT: I've also tried GL_LINEAR 
); 
glFinish(); 
//never reaches here 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0); 
glBindFramebuffer(GL_READ_FRAMEBUFFER,0); 

FBO是GL_FRAMEBUFFER_COMPLETE_EXT,並且在任何點都不會發生GL錯誤。 FBO和窗口幀緩衝區大小相同。

上運行的NVIDIA GeForce GTX 580M與驅動程序301.42(到目前爲止,最新的)。

任何想法,爲什麼會發生這種情況?

[編輯:我發現從FBO到另一個FBO塊傳輸的時候,雖然沒有數據似乎被複制不會發生的問題]

+0

確定screen_rect變量,當你調用glBlitFramebuffer功能仍指向有效的數據嗎? –

+0

這是一個很好的檢查,但是,我已通過調試器驗證了這一點。 – imallett

回答

1

看來,這種實現方法極其挑剔的順序命令去我在對一些現有代碼進行逆向工程後,發現了以下內容。也許有一些神祕的原因,他們必須按照這個順序,但我不知道是什麼。

在任何情況下,我認爲段錯誤行爲處於NVIDIA的OpenGL實現中的錯誤。

事不宜遲,關鍵命令,依次是:

GLenum buffers1[] = {GL_BACK}; 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0); 
glDrawBuffers(1,buffers1); 

glBindFramebuffer(GL_READ_FRAMEBUFFER,fbo->framebuffer); 
glReadBuffer(GL_COLOR_ATTACHMENT1); 

glBlitFramebuffer(...) 
+0

我經歷了GTX 680的類似行爲(驅動版本331.65),當我從一個多重採樣FBO到正規的一個複製圖像,但位塊沒有與訪問衝突結束,而是複製的主幀緩衝區的內容到FBO我指定爲'GL_DRAW_FRAMEBUFFER'。可能是綁定'GL_FRAMEBUFFER'(也許'GL_DRAW_FRAMEBUFFER'在內部處理相同)取代了'GL_DRAW_FRAMEBUFFER'和'GL_READ_FRAMEBUFFER',因此順序很重要。 –

相關問題