OpenGL ES 2.x: как читать пиксели после glDiscardFramebufferEXT? - PullRequest
0 голосов
/ 02 марта 2012

Я прочитал 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]);

1 Ответ

0 голосов
/ 02 марта 2012

Работа glDiscardFramebufferEXT состоит в том, чтобы сообщать драйверу, что вас не волнует содержимое framebuffer.Какой драйвер (или графический процессор) решит с ним поступить - решать не вам.Драйвер может сбросить все содержимое до 0, или он может оставить все как есть, или, возможно, он будет использовать эту информацию при следующем вызове glClear и будет выполнять ее более эффективно (например, выделив новую память для содержимого вместо выполнения memset0 значение).Не беспокойтесь о том, что именно он будет делать.

...