现在的位置: 首页 > 综合 > 正文

OpenGL FBO

2013年10月05日 ⁄ 综合 ⁄ 共 3122字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.