2012-07-15 25 views
1

根據OpenGL documentation我應該能夠將像素讀取的源設置爲GL_COLOR_ATTACHMENTi中的任何一個。但是,當我嘗試此操作時,glGetError給我一個GL_INVALID_ENUM錯誤。隨後的glReadPixels只是讀取後臺緩衝區。將readbuffer設置爲FBO顏色附件失敗,導致無效的枚舉錯誤

glGetString(GL_VERSION)報告的版本是4.2.11627 Core Profile Forward-Compatible Context。我在Linux上運行並安裝了fglrx ati驅動程序(版本8.96.7-120312a-135598C-ATI)。

我檢查了我的FBO是綁定和完成的。我還驗證了glGetError未被以前的調用設置。

它已經失敗,在這(我希望這裏的錯誤,而是INVALID_OPERATION不是INVALID_ENUM):

#include <iostream> 
#include "Window.h" // My own class based on sfml, but I am sure context creation works fine 
#include <glload/gll.hpp> 
#include <glload/gl_core.hpp> 

int main() 
{ 
    const unsigned int screenW = 1280, screenH = 720; 
    Window w(screenW, screenH, 32, false); 
    if (glload::LoadFunctions() == glload::LS_LOAD_FAILED) 
    { 
     std::cerr << "glload failed to load" << std::endl; 
     return -1; 
    } 
    gl::ReadBuffer(gl::GL_COLOR_ATTACHMENT0); 
    if(gl::GetError() == gl::GL_INVALID_ENUM) 
    { 
     std::cerr << "Invalid enum error" << std::endl; 
     return -1; 
    } 
    return 0; 
} 

難道還有其他原因,這個電話可能引發INVALID_ENUM或者是更可能的是,OpenGL實現我我正在使用被竊聽?

+2

從技術上講,這是一個「驅動程序錯誤」,但這只是因爲它應該給你'GL_INVALID_OPERATION',而不是ENUM。無論哪種方式都是錯誤的;實施只是給你一個錯誤的。 – 2012-07-15 17:04:44

回答

2

但是,當我嘗試這個,glGetError給我一個GL_INVALID_ENUM錯誤。隨後的glReadPixels只是讀取後臺緩衝區。

如果你從後緩衝器讀,那麼這意味着default framebuffer仍難免。並glReadBuffer設置當前 framebuffer的讀緩衝區。

缺省幀緩存沒有GL_COLOR_ATTACHMENT s。因此,將其中一個圖像設置爲讀取緩衝區是錯誤的。您必須綁定FBO 第一個,然後設置讀取緩衝區。請注意0​​設置綁定到GL_READ_FRAMEBUFFER而不是GL_DRAW_FRAMEBUFFER的幀緩衝區的綁定。所以確保它被綁定到正確的地方。

+0

你是對的。我確實將FBO綁定了,但是爲了只顯示「GL_DRAW_FRAMEBUFFER」,之後我忘記了對'GL_READ_FRAMEBUFFER'的額外綁定。 – KillianDS 2012-07-15 17:44:33

+0

@KillianDS:順便說一句,您可能想使用[OpenGL Wiki的OpenGL API文檔版本](http://www.opengl.org/wiki/Category:Core_API_Reference)而不是手冊頁。例如,我剛剛更改了glReadBuffer描述頁面以強調它改變GL_READ_FRAMEBUFFER的事實。祝你好運,讓維護手冊頁的人做這樣的事情。 – 2012-07-15 18:15:53