FBO визуализируются в текстуру и glReadPixels - PullRequest
2 голосов
/ 16 октября 2010

Я установил FBO (GL_FRAMEBUFFER_EXT, буферы цвета и глубины), и мое приложение рендерит простой 3D-объект OpenGL (вращающийся чайник) в текстуру с изображением NULL. Я пытаюсь захватить данные пикселей с помощью glReadPixels. Я правильно вижу 3D-объект на экране. Но glReadPixels дает нежелательные данные. Интересно, где я иду не так? Любая помощь / указатели приветствуются.

   Code is given below (in brief) -

    glEnable(GL_TEXTURE_2D); // Enable texturing so we can bind our frame buffer texture
    glEnable(GL_DEPTH_TEST); // Enable depth testing

    // Initialize the FBO
    int WIDTH=window_width;
    int HEIGHT=window_height;

    glGenTextures(1, &fbo_texture); // Generate one texture
    glBindTexture(GL_TEXTURE_2D, fbo_texture); // Bind the texture fbo_texture

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, window_width, window_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); // Create a standard texture with the width and height of our window

        // Setup the basic texture parameters
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

   ......
   ......
   // setup depth buffer
   glGenRenderbuffersEXT(1, &fbo_depth); // Generate one render buffer and store the ID in fbo_depth
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fbo_depth); // Bind the fbo_depth render buffer

glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, window_width, window_height); // Set the render buffer storage to be a depth component, with a width and height of the window

glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fbo_depth); // Set the render buffer of this buffer to the depth buffer

   ....
   .....
  //set up FBO
  glGenFramebuffersEXT(1, &fbo); // Generate one frame buffer and store the ID in fbo
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); // Bind our frame buffer

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fbo_texture, 0); // Attach the texture fbo_texture to the color buffer in our frame buffer

glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fbo_depth); // Attach the depth buffer fbo_depth to our frame buffer

GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); // Check that status of our generated frame buffer

if (status != GL_FRAMEBUFFER_COMPLETE_EXT) // If the frame buffer does not report back as complete
{
    std::cout << "Couldn't create frame buffer" << std::endl; // Output an error to the console
    exit(0); // Exit the application
}


    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); // Bind our frame buffer for rendering
    glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT); // Push our glEnable and glViewport states
    glViewport(0, 0, window_width, window_height); // Set the size of the frame buffer view port

    glClearColor (0.0f, 0.0f, 1.0f, 1.0f); // Set the clear colour
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the depth and colour buffers
    glLoadIdentity(); // Reset the modelview matrix

    glTranslatef(0.0f, 0.0f, -5.0f); // Translate back 5 units

    glRotatef(rotation_degree, 1.0f, 1.0f, 0.0f); // Rotate according to our rotation_degree value

    glutSolidTeapot(1.0f); // Render a teapot
    glPopAttrib(); // Restore our glEnable and glViewport states

    glReadPixels(0, 0, window_width, window_height, GL_RGBA, GL_UNSIGNED_BYTE, pixels[i]);

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // Unbind our texture

    //now display

    ....
    ....

    glutSwapBuffers();
    }

Ответы [ 2 ]

3 голосов
/ 21 октября 2010

Вы передаете в пикселях [i].Это выглядит подозрительно.Что пиксели были объявлены как?Я не могу сказать из того, что вы отправили.Я бы предпочел увидеть что-то вроде

glReadPixels(0, 0, window_width, window_height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

или

glReadPixels(0, 0, window_width, window_height, GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0]);

, но все зависит от того, что вы собираетесь использовать для массива пикселейесть.

3 голосов
/ 16 октября 2010

Сначала необходимо связать свое FBO, затем вызвать glFramebufferTexture2D и другие вызовы FBO.

Также, чтобы избежать таких проблем, вам необходимо проверить состояние кадрового буфера с помощью glCheckFramebufferStatus, сначала привязав FBO, он сообщит вам, завершен ли кадровый буфер и готов ли он к просмотру.

Кроме того, если вы рисуете текстуру, вы можете получить данные текстуры с помощью glGetTexImage.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...