2015-05-11 62 views
1

我想初始化紋理的都是零,使用DRAW幀緩存由this post的建議。不過,我很困惑,當我連接它GL_COLOR_ATTACHMENT0我DRAW幀緩存纔會被清除:清除DRAW framebuffer只在附加到GL_COLOR_ATTACHMENT0時才起作用?

int levels = 2; 
    int potW = 2; int potH = 2; 
    GLuint _potTextureName; 
    glGenTextures(1, &_potTextureName); 
    glBindTexture(GL_TEXTURE_2D, _potTextureName); 
    glTexStorage2D(GL_TEXTURE_2D, levels, GL_RGBA32F, potW, potH); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _potTextureName, 0); 
    glDrawBuffer(GL_COLOR_ATTACHMENT0); 

    GLuint clearColor[4] = {0,0,0,0}; 
    glClearBufferuiv(GL_COLOR, 0, clearColor); 

修改片段使用GL_COLOR_ATTACHMENT1,否則保留一切,不會清除幀緩衝:

int levels = 2; 
    int potW = 2; int potH = 2; 
    GLuint _potTextureName; 
    glGenTextures(1, &_potTextureName); 
    glBindTexture(GL_TEXTURE_2D, _potTextureName); 
    glTexStorage2D(GL_TEXTURE_2D, levels, GL_RGBA32F, potW, potH); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, _potTextureName, 0); 
    glDrawBuffer(GL_COLOR_ATTACHMENT1); 

    GLuint clearColor[4] = {0,0,0,0}; 
    glClearBufferuiv(GL_COLOR, 0, clearColor); 

我嘗試使用glDrawBuffers而不是建議here,我也嘗試使用glClearColorglClear,但它們都表現相同的方式。我在這裏錯過了什麼?

+0

第二段使用一個潛在的不同值glTexStorage2D的')的格式參數('。你使用的是什麼OpenGL版本? –

+1

有一件事我能想象這樣的觸發行爲可能是因爲你仍然有附色0,這是incomatible新的圖像(如在樣本數,或層不匹配)結合一些其他紋理/渲染。您應該檢查幀緩衝區完整性狀態。您還應該檢查GL錯誤。 – derhass

+0

@derhass,謝謝你指出完整性問題。事實證明這是相關的,我只是把我的發現作爲答案。 – HuaTham

回答

0

事實證明,它有待辦事項與我以前綁定到GL_COLOR_ATTACHMENT0

在第二種情況下,GL_COLOR_ATTACHMENT0已經綁定到較小尺寸的紋理。有相關Framebuffer Completeness Rules,雖然沒有對紋理大小沒有限制,對FBO的有效尺寸是所有綁定圖像的大小的路口一個音符。因此,在我的第二種情況下,如果綁定到GL_COLOR_ATTACHMENT1的紋理(1)大於我綁定到的紋理(1),那麼無論我使用什麼清晰操作(glClearglClearBuffer*),紋理(1)都將僅被部分清除。

第一種情況原來是爲我工作,因爲我只有綁定到FBO一個紋理,在GL_COLOR_ATTACHMENT0

相關問題