GLuint VolRenCore::RendrToFBO()
{
if (!m_Data || !m_Data->GetData()) return 0;
if (tex)
{
glDeleteTexturesEXT(1, &tex);
tex = 0;
}
//init gl
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
//fbo
GLuint fb;
glGenFramebuffersEXT(1, &fb);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
//texture buffer
glGenTextures(1, &tex);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_ViewPort[0], m_ViewPort[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
//render buffer
GLuint rbo;
glGenRenderbuffersEXT(1, &rbo);
glBindRenderbufferEXT(GL_RENDERBUFFER, rbo);
glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_ViewPort[0], m_ViewPort[1]);
//glBindRenderbufferEXT(GL_RENDERBUFFER, 0);
//attach
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
//检查FBO状态
bool status = checkFramebufferStatus();
if (!status)
return 0;
if(!Render()) return 0;
//
// glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
// //glReadBuffer(GL_DEPTH_ATTACHMENT);
// int w = m_ViewPort[0];
// int h = m_ViewPort[1];
// QImage img(w,h, QImage::Format_ARGB32);
// glReadPixels(0,0,w,h,GL_RGBA, GL_UNSIGNED_BYTE, img.bits());
// mDisplayDialog fbo(img);
// fbo.exec();
//
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glDeleteFramebuffersEXT(1, &fb);
glDeleteRenderbuffersEXT(1, &rbo);
return tex;
}
void VRDisplayWidget::paintGL()
{
GLuint tex1;
GLuint tex2;
if (m_Core)
{
tex1 = m_Core->RendrToFBO();
m_Core->m_VolTextureNeedUpdate = true;
tex2 = m_Core1->RendrToFBO();
m_Core1->m_VolTextureNeedUpdate = true;
if (!tex1) return;
if(!tex2) return;
glClearColor(0.0, 0.0, 0.0, 0.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glFrontFace(GL_CCW);
//gl
glEnable(GL_BLEND);
//glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glBlendFunc(GL_SRC_ALPHA,GL_SRC_ALPHA);
//texture0
glActiveTexture(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex1);
//texture1
glActiveTexture(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex2);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glMultiTexCoord2f(GL_TEXTURE0_ARB, 0.0, 0.0);glMultiTexCoord2f(GL_TEXTURE1_ARB, 0.0, 0.0); glVertex2f(0.0, 0.0);
glMultiTexCoord2f(GL_TEXTURE0_ARB, 0.0, 1.0);glMultiTexCoord2f(GL_TEXTURE1_ARB, 0.0, 1.0); glVertex2f(0.0, hei);
glMultiTexCoord2f(GL_TEXTURE0_ARB, 1.0, 1.0);glMultiTexCoord2f(GL_TEXTURE1_ARB, 1.0, 1.0); glVertex2f(wid, hei);
glMultiTexCoord2f(GL_TEXTURE0_ARB, 1.0, 0.0);glMultiTexCoord2f(GL_TEXTURE1_ARB, 1.0, 0.0); glVertex2f(wid, 0.0);
glEnd();
/*glFlush();*/
glPushAttrib(GL_ALL_ATTRIB_BITS);
glColor3f(1.0f,0.0f,0.0f);
renderText(30,40,QString::number(m_fps)+"FPS",QFont("Arial",20));
glPopAttrib();
}
}