Я прочитал EXT_discard_framebuffer , что приводит к тому, что содержимое именованных прикрепляемых изображений кадрового буфера становится неопределенным. А после сброса кадрового буфера значение пикселя из glReadPixels остается таким же, как и перед сбросом кадрового буфера. Зачем? И с этим расширением, реализация OpenGL ES, как оптимизировать хранение содержимого кадрового буфера после рендеринга кадра?
//
// create a texture object
//
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);
//
// create a framebuffer object
//
GLuint fbo;
GLboolean check;
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
check = glIsFramebuffer(fbo1);
if (!check) {
__android_log_print(ANDROID_LOG_ERROR, "debug",
"------ check Framebuffer object failed ------\n");
return EGL_FALSE;
}
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
__android_log_print(ANDROID_LOG_ERROR, "debug",
"------ fbo not set completely!------\n");
return EGL_FALSE;
}
draw_texture(fbo);
GLubyte sampledColor[4] = {0, 0, 0, 0};
int randX = 128, randY = 128;
GLenum attachments[] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT };
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glReadPixels(randX, randY, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, sampledColor);
__android_log_print(ANDROID_LOG_INFO, "debug",
"[LINE: %d] coordinate(%d, %d) color is (%d, %d, %d, %d)\n",
__LINE__, randX, randY, sampledColor[0], sampledColor[1],
sampledColor[2], sampledColor[3]);
glDiscardFramebufferEXT(GL_FRAMEBUFFER, 2, attachments);
glReadPixels(randX, randY, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, sampledColor);
__android_log_print(ANDROID_LOG_INFO, "debug",
"[LINE: %d] coordinate(%d, %d) color is (%d, %d, %d, %d)\n",
__LINE__, randX, randY, sampledColor[0], sampledColor[1],
sampledColor[2], sampledColor[3]);