Lesen der Daten mittels glReadPixel() mit multisampling
Derzeit bin ich versucht zu Lesen, die pixel-Daten aus dem frame Buffer in order to capture the screen in IOS. GlreadPixels-Befehl funktioniert bei Verwendung der folgenden Codes, um das setup-Rahmen-Puffer :-
//buffers
//Create a depth buffer that has the same size as the color buffer.
glGenRenderbuffersOES(1, &m_depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT24_OES, width, height);
//Create the framebuffer object.
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES,
GL_RENDERBUFFER_OES, m_colorRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES,
GL_RENDERBUFFER_OES, m_depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
aber wenn ich depth-buffer und colorbuffer für Multi-Sampling-glreadpixels() nicht erfasst jedes pixel Daten, die mit früheren code ....für multi-sampling verwende ich folgenden code :-
glGenFramebuffersOES(1, &sampleFramebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, sampleFramebuffer);
//GLuint sampleColorRenderbuffer;
glGenRenderbuffersOES(1, &sampleColorRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, sampleColorRenderbuffer);
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_RGBA8_OES, width, height);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, sampleColorRenderbuffer);
//glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_RGBA8_OES, width, height);
//glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, sampleColorRenderbuffer);
GLuint sampleDepthRenderbuffer;
glGenRenderbuffersOES(1, &sampleDepthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, sampleDepthRenderbuffer);
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_DEPTH_COMPONENT24_OES, width, height);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, sampleDepthRenderbuffer);
//glBindRenderbufferOES(GL_RENDERBUFFER_OES,sampleColorRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, sampleFramebuffer);
Verwende ich den folgenden code zu schreiben, der pixel-Daten :-
CGRect screenBounds = [[UIScreen mainScreen] bounds];
int backingWidth = screenBounds.size.width;
int backingHeight =screenBounds.size.height;
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
NSInteger myDataLength = backingWidth * backingHeight * 4;
buffer= (GLuint *) malloc(myDataLength);
glReadPixels(0, 0, backingWidth, backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
Keine Idee, wie erfassen, korrigieren, pixel-Daten mit multi-Sampling-Technik....oder mache ich etwas falsch? Bitte führe mich in die richtige Richtung.
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn mit multisampled FBOs können Sie nicht nur Lesen Sie die sample-buffer (nicht enthalten einfache Pixel). Müssen Sie zuerst beheben die sample-Puffer in einen einzigen Puffer.
Erstellen Sie dazu ein nicht-multisampled FBO (nennen wir es
resultFramebuffer
) mit der notwendigen renderbuffer Speicher, den Sie Lesen möchten, und rufen dann:Und dann Lesen Sie aus dem Ergebnis-Puffer (natürlich die tatsächlichen Konstanten-und Funktionsnamen enthalten kann, OES oder APPLE). Wenn Sie nicht brauchen, die endgültige Tiefe Werte, das Ergebnis Puffer braucht keine Tiefe renderbuffer.
EDIT:, Wie Sie schrieb in Ihrem Kommentar, und das, was ich suchte, gibt es eine dedizierte Funktion
glResolveMultisampleFramebufferAPPLE
Sie haben zu verwenden, anstattglBlitFramebuffer
. Der rest bleibt gleich.glBlitFramebuffer
, sonst multisampled FBOs sind nur nutzlos, wenn Sie nicht beheben können die sample-Puffer wie oben gesagt (vielleicht ist es eine APPLE-Erweiterung, wie die multisampled FBOs?). WennglReadPixels
nicht Lesen kann, aus einem FBO, wie funktioniert dann Ihre ersten code-Beispiel zu arbeiten? Wenn Sie nicht Lesen möchten, von der FBO, dann wo ist das problem? Sollten Sie erklären, was Ihre FBO ist für, wenn Sie nicht wollen, um seine Daten liest.resultFramebuffer
(das ist ein standard-nicht-multisampled FBO, so wie in deinem ersten Beispiel) als die aktuellen FBO (mitglBindFramebuffer
) und dann können Sie Lesen, wie Sie es in Ihrer ersten non-multisampled Beispiel. Das einzige was Sie tun ist, kopieren Sie die multisampled FBO in ein anderes FBO und Lesen aus dieser.glReadPixels
wäre, dann wäre das ein bisschen viel von einem performance-drop.