4
我使用OpenGL編寫程序。它實現了一個簡單的功能:繪製一個茶壺。爲了使它在屏幕上看起來不錯,我啓用了多重取樣抗鋸齒功能。它確實如此。請看下面的位圖:使用glReadPixels檢索位圖時會失去抗鋸齒功能
但是當我將它保存爲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);
我很好奇。 爲什麼它們不同:呈現默認的famebuffer並保存到bmp圖片?
實際上,我想要做的是在9個不同的相鄰角度獲得9個小型位圖,然後合成一個位圖以在立體視覺3D屏幕上顯示。但合成的位圖看起來很糟糕。
有人能告訴我爲什麼嗎?
首先,8位/ 24位BMP的,這是最常見的,不支持阿爾法。我不知道gltGenBMP是否生成非常見的32位BMP。你可能想驗證一下。您最好使用第三方庫並將其保存爲PNG或TIFF。 –
@Karthik Kumar Viswanathan這是我寫的一個函數來保存一個bmp,並生成24位BMP。 – XiaJun