Opengl 使用glReadPixels检索位图时,抗锯齿丢失

Opengl 使用glReadPixels检索位图时,抗锯齿丢失,opengl,graphics,Opengl,Graphics,我用OpenGL写了一个程序。它实现了一个简单的功能:画一个茶壶。为了让它在屏幕上看起来更漂亮,我启用了多样本反走样。确实如此。查看以下位图: 但当我将其保存为bmp图片时,它看起来很糟糕。我用FBO和PBO来做。现在我在这里发布了我的部分代码: glGenFramebuffers(1,&m_frameBuffer); glBindFramebuffer(GL_FRAMEBUFFER,m_frameBuffer); glGenRenderbuffers(1,&m_render

我用OpenGL写了一个程序。它实现了一个简单的功能:画一个茶壶。为了让它在屏幕上看起来更漂亮,我启用了多样本反走样。确实如此。查看以下位图:

但当我将其保存为bmp图片时,它看起来很糟糕。我用FBO和PBO来做。现在我在这里发布了我的部分代码:

glGenFramebuffers(1,&m_frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER,m_frameBuffer);

glGenRenderbuffers(1,&m_renderBufferColor);
glBindRenderbuffer(GL_RENDERBUFFER,m_renderBufferColor);
glRenderbufferStorage(GL_RENDERBUFFER,GL_RGB,
    m_subImageWidth,m_subImageHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,
    GL_RENDERBUFFER,m_renderBufferColor);

glGenRenderbuffers(1,&m_renderBufferDepth);
glBindRenderbuffer(GL_RENDERBUFFER,m_renderBufferDepth);
glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT,
    m_subImageWidth,m_subImageHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,
    GL_RENDERBUFFER,m_renderBufferDepth);

glBindFramebuffer(GL_FRAMEBUFFER,0);

glBindFramebuffer(GL_FRAMEBUFFER,m_frameBuffer);



glGenBuffers(1,m_subImageBuffer);
glBindBuffer(GL_PIXEL_PACK_BUFFER,m_subImageBuffer);
        glBufferData(GL_PIXEL_PACK_BUFFER,m_bufferSize,
            NULL,GL_STREAM_READ);

glBindFramebuffer(GL_FRAMEBUFFER,m_frameBuffer);

glBindBuffer(GL_PIXEL_PACK_BUFFER,m_subImageBuffer);
glPixelStorei(GL_PACK_ALIGNMENT,1);
//注意:以BGR的顺序读取
glReadPixels(0,0,m_subImageWidth,m_subImageHeight,
        GL_BGR,GL_UNSIGNED_BYTE,bufferOffset(0));
GLUtils::checkForOpenGLError(__FILE__,__LINE__);
m_subPixels[i] = static_cast<GLubyte*>(glMapBuffer(GL_PIXEL_PACK_BUFFER,GL_READ_ONLY));
gltGenBMP(subImageFile,GLT_BGR,m_subImageWidth,m_subImageHeight,m_subPixels[i]);
glBindBuffer(GL_PIXEL_PACK_BUFFER,0);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
glBindBuffer(GL_PIXEL_PACK_BUFFER,0);
glGenFramebuffers(1,&m_frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER,m_FRAMEBUFFER);
glGenRenderbuffers(1,&m_renderBufferColor);
glBindRenderbuffer(GL_RENDERBUFFER,m_renderBufferColor);
GLrenderBuffer存储(GL_RENDERBUFFER,GL_RGB,
m_子图像宽度,m_子图像高度);
glFramebufferRenderbuffer(GL_帧缓冲区、GL_颜色\u附件0、,
GL_RENDERBUFFER,m_renderBufferColor);
glGenRenderbuffers(1,&m_renderBufferDepth);
glBindRenderbuffer(GL_RENDERBUFFER,m_RENDERBUFFER深度);
GLRENDERBUFFER存储(GLRENDERBUFFER、GLRENDERBUFFER深度组件、,
m_子图像宽度,m_子图像高度);
glFramebufferRenderbuffer(GLU帧缓冲区、GLU深度附件、,
GL_RENDERBUFFER,m_RENDERBUFFER depth);
glBindFramebuffer(GL_帧缓冲区,0);
glBindFramebuffer(GL_FRAMEBUFFER,m_FRAMEBUFFER);
glGenBuffers(1,m_子图像缓冲区);
glBindBuffer(GLU像素块缓冲区、m子图像缓冲区);
glBufferData(GLU像素块缓冲区,m缓冲区大小,
空,总账(数据流读取);
glBindFramebuffer(GL_FRAMEBUFFER,m_FRAMEBUFFER);
glBindBuffer(GLU像素块缓冲区、m子图像缓冲区);
glPixelStorei(GLU包对齐,1);
//注意:以BGR的顺序读取
glReadPixels(0,0,m_子图像宽度,m_子图像高度,
GL_BGR,GL_无符号字节,缓冲偏移量(0);
GLUtils::checkForOpenGLError(_文件,_行);
m_子像素[i]=静态_转换(glMapBuffer(GL_像素_块_缓冲区,GL_只读));
gltGenBMP(子图像文件、GLT_BGR、m_子图像宽度、m_子图像高度、m_子像素[i]);
glBindBuffer(GLU像素块缓冲区,0);
glUnmapBuffer(GL像素块缓冲区);
glBindBuffer(GLU像素块缓冲区,0);

我很好奇。为什么它们不同:渲染到默认缓冲区并保存到bmp图片?

实际上,我想做的是在9个不同的相邻角度获得9个小位图,然后合成一个位图显示在立体镜3D屏幕上。但是合成的位图看起来很糟糕。


有人能告诉我为什么吗?

仅仅因为您在帧缓冲区上启用了多采样,并不意味着您的FBO也将拥有它。创建FBO时,需要使用glRenderbufferStorageMultisample

见:

以及:


这也是相关的:

首先,最常见的8位/24位BMP不支持Alpha。我不知道gltGenBMP是否会生成不常见的32位BMP。您可能需要验证这一点。您最好使用第三方库并将其保存为PNG或TIFF。@Karthik Kumar Viswana这是我编写的用于保存bmp的函数。它会生成24位bmp。