glreadpixels で INVALID_OPERATION を与える作業コードがあるため、混乱しています。私の推測では、パフォーマンスの問題を引き起こしている/引き起こす可能性があります。
FBO へのオフスクリーン レンダリングを行ってから、PBO からシステム メモリを読み込んでいます。
glReadPixels は INVALID_OPERATION を返しますが、最初のフレームを除くすべてのフレームを返します。どういうわけか、最初はエラーが発生しませんが、それ以降は文句を言います。そのエラーにもかかわらず、コードは正常に機能することを強調する必要があります。
私のコードは次のようになります。
初期化 (起動時にのみ呼び出されます):
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
//render buffer
glGenRenderbuffers(1, &render_buf);
glBindRenderbuffer(GL_RENDERBUFFER, render_buf);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8, _width, _height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_buf);
//depth buffer
glGenRenderbuffers(1, &depth_buf);
glBindRenderbuffer(GL_RENDERBUFFER, depth_buf);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, _width, _height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_buf);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
//Add the pixel buffer object
glGenBuffers(1, &pbo);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
glBufferData(GL_PIXEL_PACK_BUFFER, _width* _height * 4, NULL, GL_DYNAMIC_READ);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
オフスクリーン レンダリング (フレームごとに 1 回呼び出される):
glReadPixels(0, 0, _width, _height, GL_BGR, GL_UNSIGNED_BYTE, 0);
void* mappedRegion = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
return (uint8_t*)mappedRegion; //I am only reading, not writing to this one