方法一、保存成图片
QImage* img=new QImage(WINDOW_WIDTH,WINDOW_HEIGHT,QImage::Format_ARGB32);
uchar* tmpBIT = img->bits();
//从颜色缓冲区中读取数据
int tmpPixelSize = WINDOW_WIDTH*WINDOW_HEIGHT * 4;
char* tmpPixelsBuffer = (char*)malloc(tmpPixelSize);
glReadPixels(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT,GL_RGBA, GL_UNSIGNED_BYTE, tmpPixelsBuffer);
for (int y = WINDOW_HEIGHT-1; y >=0 ; y--)
{
for (int x = 0; x < WINDOW_WIDTH; x++)
{
//蓝色
tmpBIT[0] = tmpPixelsBuffer[(y*WINDOW_WIDTH + x) * 4 + 2];
//绿色
tmpBIT[1] = tmpPixelsBuffer[(y*WINDOW_WIDTH + x) * 4 + 1];
//红色
tmpBIT[2] = tmpPixelsBuffer[(y*WINDOW_WIDTH + x) * 4 + 0];
tmpBIT[3] = 100;//不起作用
tmpBIT += 4;
}
}
//从深度缓冲区读取数据
int tmpPixelSize = WINDOW_WIDTH*WINDOW_HEIGHT;
float* tmpPixelsBuffer = new float[ tmpPixelSize ];
//GLfloat* tmpPixelsBuffer = new GLfloat[ tmpPixelSize ];
//glReadBuffer(GL_NONE);
//glReadBuffer(GL_BACK);
glReadPixels(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT,GL_DEPTH_COMPONENT, GL_FLOAT, tmpPixelsBuffer);
GLenum aaa = glGetError();
for (int y = WINDOW_HEIGHT-1; y >=0 ; y--)
{
for (int x = 0; x < WINDOW_WIDTH; x++)
{
float iii=tmpPixelsBuffer[(y*WINDOW_WIDTH + x) + 0];
iii*=255;
//蓝色
tmpBIT[0] = iii;
//绿色
tmpBIT[1] = iii;
//红色
tmpBIT[2] = iii;
tmpBIT[3] = 255;//不起作用
tmpBIT += 4;
}
}
img->save("a.jpg");
方法二、输出到纹理
1、配置FBO,使颜色、深度输出到纹理
glGenFramebuffers(1, &m_fbo);
// Создаем буфер глубины
glGenTextures(1, &m_shadowMap);
glBindTexture(GL_TEXTURE_2D, m_shadowMap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, WindowWidth, WindowHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_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);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
m_shadowMap, 0);
//增加一个颜色缓冲区
glGenTextures(1, &m_shadowColor);
glBindTexture(GL_TEXTURE_2D, m_shadowColor);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WindowWidth, WindowHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
m_shadowColor, 0);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
// 不允许读写颜色缓冲区,也会禁用片元着色器
//glDrawBuffer(GL_NONE);
//glReadBuffer(GL_NONE);
GLenum Status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (Status != GL_FRAMEBUFFER_COMPLETE){
printf("FB error, status: 0x%x\n", Status);
return false;
}
return true;
2、在默认帧缓冲区(或其他帧缓冲区)使用纹理
glActiveTexture(TextureUnit);
glBindTexture(GL_TEXTURE_2D, m_shadowMap);