Ich versuche, Farbauswahl mit FBO zu implementieren. Ich habe multisampling FBO (fbo [0]), die ich verwende, um die Szene zu rendern, und ich habe nicht multisampled FBO (fbo [1]), die ich für die Farbauswahl verwenden.glReadPixels() setzt GL_INVALID_OPERATION Flag ohne Grund
Das Problem ist: wenn ich versuche, Pixeldaten von fbo [1] zu lesen, geht alles gut, bis glReadPixels den GL_INVALID_OPERATION Flag aufruft. Ich habe das Handbuch überprüft und kann den Grund nicht finden.
glBindRenderbuffer(GL_RENDERBUFFER, rbo[0]);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, numSamples, GL_RGBA8, resolution[0], resolution[1]);
glBindRenderbuffer(GL_RENDERBUFFER, rbo[1]);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, numSamples, GL_DEPTH24_STENCIL8, resolution[0], resolution[1]);
glBindRenderbuffer(GL_RENDERBUFFER, rbo[2]);
glRenderbufferStorage(GL_RENDERBUFFER, GL_R32UI, resolution[0], resolution[1]);
glBindRenderbuffer(GL_RENDERBUFFER, rbo[3]);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, resolution[0], resolution[1]);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo[1]);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[3]);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[2]);
OGLChecker::checkFBO(GL_DRAW_FRAMEBUFFER);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo[0]);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[1]);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[0]);
OGLChecker::checkFBO(GL_DRAW_FRAMEBUFFER);
Mein checker schweigt so die FBOs abgeschlossen sind:
Der Code FBO zu erstellen. Als nächstes wird die Kommissionierung Code
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo[1]);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// bla, bla, bla
// do the rendering
unsigned int result;
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo[1]);
int sb;
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
glGetIntegerv(GL_SAMPLE_BUFFERS, &sb);
// glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
OGLChecker::getGlError();
std::cerr << "Sample buffers " << sb << std::endl;
glReadPixels(pos.x(), resolution.y() - pos.y(), 1, 1, GL_RED, GL_UNSIGNED_INT, &result);
OGLChecker::getGlError();
return result;
die Ausgabe:
Sample buffers 0
OpenGL Error : Invalid Operation
Die interessante Tatsache, dass, wenn ich Kommentar- glBindFramebuffer (GL_READ_FRAMEBUFFER, 0); dann passiert kein Fehler und Pixel werden vom Bildschirm gelesen (aber ich brauche das nicht).
Was kann hier falsch sein?
Eine weitere interessante Tatsache. Wenn ich das RBO-Format von GL_R32UI zu GL_R32F ändere, funktioniert alles gut, außer dass ich ganze Zahlen speichern und lesen will und die Genauigkeit bei der Konvertierung zwischen uint32 und float nicht verliere. (BTW, die Ausgabe von Fragment Shader ist uvec4) –
Nun, das Problem war mit dem Format von Framebuffer. glReadBuffer() erzeugt nur dann einen Fehler, wenn ich versuche, aus einem Puffer mit Ganzzahlformaten (wie GL_RGBA8I oder GL_RGBA8UI oder GL_R32UI) zu lesen. Keine Probleme beim Lesen von GL_RGBA8 oder GL_R32F. Das könnte die Lösung für das Problem sein, wenn jemand anders darauf stößt. –