2014-09-21 52 views
0

窗口戰平幀緩衝,但使用GLEW</p> <p>我試圖渲染離屏和保存渲染到PNG文件的IMG的OpenGL只得到黑色

我也跟着上一個計算器高度評價答案: How to render offscreen on OpenGL?

但PNG文件我得到的只是一個黑色的屏幕。

這裏是我的代碼與它:

glutCreateWindow(argv[0]); 
if(GLEW_OK!=glewInit()) 
{ 
    return -1; 
} 

initScene(); 


GLuint fbo, render_buf; 
glGenFramebuffers(1,&fbo); 
glGenRenderbuffers(1,&render_buf); 
glBindRenderbuffer(GL_RENDERBUFFER,render_buf); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8, viewport.w, viewport.h); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo); 
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_buf); 


//Before drawing 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo); 


glClear(GL_COLOR_BUFFER_BIT);    // clear the color buffer 
glMatrixMode(GL_MODELVIEW);     // indicate we are specifying camera transformations 
glLoadIdentity();      // make sure transformation is "zero'd" 

//draw... 
//glBegin(GL_POINTS) glColor3f, glVertex2f 

//glFlush(); 
glFinish(); 

/*glutDisplayFunc(myDisplay); 
glutPostRedisplay();*/ 

glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); 
savePNG(outputPNGName,0,0,viewport.w,viewport.h); 

//At deinit: 
glDeleteFramebuffers(1,&fbo); 
glDeleteRenderbuffers(1,&render_buf); 

glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0); 

如何解決這個問題? 謝謝


savePNG(相關的代碼):

glReadBuffer(GL_COLOR_ATTACHMENT0); 
glReadPixels(x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)image); 
+0

不得不試圖渲染到紋理,並在場景中顯示它四?確保你的framebuffer能夠正常工作會很好。 – Iggy 2014-09-21 21:11:02

+0

還要確保 - 通過保持系統幀緩存處於活動狀態 - 您確實能夠看到任何可見的內容(始終發生......);)如果這個和@Iggy的解決方案不能幫助使用例如[gDebugger](http://www.gremedy.com/)看看你的renderbuffer內容,以確保你的savePNG不是問題... – Thomas 2014-09-21 21:20:03

+0

謝謝,我已經更新了我的savePNG代碼... @lggy你能分享一個關於如何渲染紋理的鏈接嗎? – shrekshao 2014-09-21 21:26:24

回答

4

至少有兩個問題在此代碼:

  • GL_RGB8不是一個渲染有效的格式。從glRenderbufferStorage() man page

    internalformat指定要用於渲染對象的存儲的內部格式,並且必須是一個色彩渲染,深度可呈現,或模版可呈現格式。

    最新規範文檔(4.5,可從https://www.opengl.org/registry下載)中的表8.13列出了所有格式,列中列出了哪些顏色可呈現顏色。 RGB8在該列中沒有複選標記。您可以使用GL_RGBA8代替,該顏色可呈現顏色。

    您可能還想看看glCheckFramebufferStatus()函數,該函數允許您檢查幀緩衝區設置是否有效。

  • 雖然我們沒有看到savePNG()的代碼,但它無法知道您要從FBO讀取像素數據。它很可能使用glReadPixels(),它從當前讀取幀緩衝區中讀取數據,而您的代碼只設置繪製幀緩衝區。調用savePNG()之前,添加此調用讀取幀緩衝區設置爲您的FBO:

    glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); 
    
+0

謝謝!我更新了savePNG中的相關代碼,我也更正了我所關注的網站。我已經改變了'GL_RGBA8',但仍然無法正常工作。'glCheckFramebufferStatus(GL_FRAMEBUFFER)'返回36053 – shrekshao 2014-09-21 21:56:00

+0

@shrekshao:你應該總是用十六進制打印OpenGL的枚舉值,這會使查找起來更容易。在這種情況下,它對應於** 0x8CD5 **,它是'GL_FRAMEBUFFER_COMPLETE'。沒有人會知道這個數字本身是什麼,尤其是以10爲底;) – 2014-09-21 22:06:30

+0

36053是'GL_FRAMEBUFFER_COMPLETE',所以部分應該沒問題。如果您設置讀取幀緩衝區,則應該獲取數據。還要確保你的'viewport.w'和'viewport.h'值是正確的。 – 2014-09-21 22:07:29