2016-03-01 156 views
1

我設置了一個帶有4個顏色附件和1個深度模板附件的多重採樣幀緩衝區。 GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE目前不完整。如果我不附加渲染緩衝區,它完美的作品。調試輸出不打印任何東西,和glGetError()沒有顯示任何問題。多重採樣幀緩衝區只與渲染緩衝區不完全

GLint samples; 
glGetIntegerv(GL_MAX_SAMPLES, &samples); 

const GLuint target = GL_TEXTURE_2D_MULTISAMPLE; 
const GLenum format[TEXTURES_PER_FBO] = { 
    GL_RGBA32F, GL_RGB32F, GL_RGB32F, GL_R8UI // TODO tune these 
}; 

// create render textures 
glGenTextures(NUM_TEXTURES, textures); 
for (int i = 0; i < NUM_TEXTURES; i++) { 
    glActiveTexture(GL_TEXTURE0 + i); 
    glBindTexture(target, textures[i]); 
    const int index = i % TEXTURES_PER_FBO; 
    glTexStorage2DMultisample(target, samples, format[index], width, height, false); 
} 

glGenRenderbuffers(1, &depth); 
glBindRenderbuffer(GL_RENDERBUFFER, depth); 
glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH24_STENCIL8, width, height); 

// create first framebuffer with depth attachment 
glGenFramebuffers(NUM_FBOS, fbos); 
glBindFramebuffer(GL_FRAMEBUFFER, fbos[0]); 
for (int i = 0; i < TEXTURES_PER_FBO; i++) { 
    const GLenum index = GL_COLOR_ATTACHMENT0 + i; 
    glFramebufferTexture2D(GL_FRAMEBUFFER, index, target, textures[i], 0); 
} 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depth); 
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 

'狀態' 是GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE

我已經測試過它既有GTX 980和480上的窗口。目前我無法訪問其他人,但如果此問題沒有解決,我會嘗試獲取一些信息。 如果你需要更多的上下文代碼,可以發現here 謝謝!

回答

0

您需要通過GL_TRUEfixedsamplelocations(最後)的glTexStorage2DMultisample()說法,如果你也有渲染附着物。否則,您會收到您觀察到的GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE錯誤。

從可能glCheckFramebufferStatus()導致規範的列表(例如OpenGL的4.5規範,部分「9.4.2全幀緩衝區完整性」的311頁):

TEXTURE_FIXED_SAMPLE_LOCATIONS的價值都是一樣的附加紋理;並且,如果附加的圖像是渲染緩衝區和紋理的混合,則對於所有附加的紋理,TEXTURE_FIXED_SAMPLE_LOCATIONS的值必須爲TRUE。 {} FRAMEBUFFER_INCOMPLETE_MULTISAMPLE

所以,你需要改變調用此獲得有效的FBO配置:

glTexStorage2DMultisample(target, samples, format[index], width, height, GL_TRUE);