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(); } }