2016-03-01 1 views
1

Je configure un framebuffer multi-échantillonné avec 4 attachements de couleur et 1 attachement de stencil de profondeur. Il est actuellement incomplet avec GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE. Si je n'attache pas le rendu, cela fonctionne parfaitement. La sortie de débogage n'imprime rien, et glGetError() ne montre aucun problème.Mémoire de trame multi-échantillon uniquement incomplète avec renderbuffer

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); 

'statut' est GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE

Je l'ai testé à la fois une gtx 980 et 480 sur les fenêtres. Je n'ai pas accès aux autres pour le moment, mais je vais essayer d'en avoir si ce n'est pas résolu. Si vous avez besoin de plus de code pour votre contexte, celui-ci peut être trouvé here Merci!

Répondre

0

Vous devez passer GL_TRUE pour la fixedsamplelocations (dernier) argument glTexStorage2DMultisample() si vous avez aussi renderbuffer Attachements. Sinon, vous obtiendrez exactement l'erreur GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE que vous observez.

Dans la liste des possibles résultats glCheckFramebufferStatus() dans la spécification (par exemple la page 311 de la spécification OpenGL 4.5, section « 9.4.2 Toute Framebuffer Complétude »):

La valeur de TEXTURE_FIXED_SAMPLE_LOCATIONS est la même pour tous textures attachées; et, si les images jointes sont un mélange de rendus et de textures, la valeur de TEXTURE_FIXED_SAMPLE_LOCATIONS doit être TRUE pour toutes les textures attachées. {} FRAMEBUFFER_INCOMPLETE_MULTISAMPLE

Vous avez donc besoin de changer l'appel à cela pour obtenir une configuration valide OIR:

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