首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FBO渲染到纹理和glReadPixels

FBO渲染到纹理和glReadPixels
EN

Stack Overflow用户
提问于 2010-10-16 21:42:50
回答 2查看 7.3K关注 0票数 3

我已经设置了FBO (GL_FRAMEBUFFER_EXT,颜色和深度缓冲区),我的应用程序正在渲染一个简单的OpenGL 3D对象(旋转茶壶),以使用空图像进行纹理处理。我正在尝试使用glReadPixels捕获像素数据。我在屏幕上正确地看到了3D对象。但glReadPixels提供的是垃圾数据。我想知道我哪里错了。如有任何帮助或建议,我们将非常感谢。

代码语言:javascript
复制
   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();
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-16 22:00:01

您需要先绑定您的FBO,然后调用glFramebufferTexture2D和其他FBO调用。

此外,为了避免此类问题,您需要使用glCheckFramebufferStatus检查帧缓冲区状态,首先绑定FBO,它会告诉您帧缓冲区是否已完成并准备好渲染。

此外,如果绘制到纹理,则可以使用glGetTexImage获取纹理数据。

票数 3
EN

Stack Overflow用户

发布于 2010-10-21 14:12:20

您正在传递pixelsi。看起来很可疑。像素被声明为什么?我不能从你发布的内容中看出来。我最希望看到的是

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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3949112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档