[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51856] branches/ge_harmony/source/ gameengine/Rasterizer/RAS_OpenGLRasterizer: Giving each rendering pass its own FBO and making some of the setup a little more general .

Daniel Stokes kupomail at gmail.com
Sun Nov 4 04:09:52 CET 2012


Revision: 51856
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51856
Author:   kupoman
Date:     2012-11-04 03:09:45 +0000 (Sun, 04 Nov 2012)
Log Message:
-----------
Giving each rendering pass its own FBO and making some of the setup a little more general. This should make passing the control of MRTs off to the user a little easier.

Modified Paths:
--------------
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-11-04 03:03:45 UTC (rev 51855)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-11-04 03:09:45 UTC (rev 51856)
@@ -59,6 +59,9 @@
 #define M_PI		3.14159265358979323846
 #endif
 
+/* Used for Multiple Render Target control */
+static GLenum DRAW_BUFFERS[4] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT};
+
 /**
  *  32x32 bit masks for vinterlace stereo mode
  */
@@ -96,7 +99,9 @@
 	m_height(0),
 	m_technique(tech),
 	m_prepass_shader_default(NULL),
-	m_light_shader_default(NULL)
+	m_light_shader_default(NULL),
+	m_prepass_count(2),
+	m_render_count(1)
 {
 	m_viewmatrix.setIdentity();
 	m_viewinvmatrix.setIdentity();
@@ -111,16 +116,6 @@
 
 	m_prevafvalue = GPU_get_anisotropic();
 
-	for (int i = 0; i < RAS_MAX_MRT; i++)
-	{
-		m_color_target[i] = -1;
-	}
-
-	m_target_enabled[0] = true;
-	m_target_enabled[1] = false;
-	m_target_enabled[2] = false;
-	m_target_enabled[3] = false;
-
 	// Light Map (Handle this here to sneak in before material conversion)
 	if (m_technique == KX_TECH_INFERRED)
 	{
@@ -173,13 +168,12 @@
 	glShadeModel(GL_SMOOTH);
 
 	// FBO
-	glGenFramebuffersEXT(1, &m_fbo);
-	glGenTextures(1, &m_depth_target);
-	glGenTextures(RAS_MAX_MRT, m_color_target);
+	glGenFramebuffersEXT(3, m_fbo);
+	glGenTextures(m_render_count+1, m_render_target);
 
-	if (m_technique == KX_TECH_INFERRED)
-	{
-		glGenTextures(2, m_prepass_target);
+	if (m_technique == KX_TECH_INFERRED) {
+		glGenTextures(m_prepass_count+1, m_prepass_target);
+
 		m_light_shader_default = GPU_shader_get_builtin_shader(GPU_SHADER_LIGHT);
 		m_prepass_shader_default = GPU_shader_get_builtin_shader(GPU_SHADER_PREPASS);
 		init_sphere();
@@ -380,13 +374,12 @@
 	if (GLEW_EXT_separate_specular_color || GLEW_VERSION_1_2)
 		glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
 
-	glDeleteTextures(RAS_MAX_MRT, m_color_target);
-	glDeleteTextures(1, &m_depth_target);
-	glDeleteFramebuffersEXT(1, &m_fbo);
+	glDeleteTextures(m_render_count+1, m_render_target);
+	glDeleteFramebuffersEXT(3, m_fbo);
 
 	if (m_technique == KX_TECH_INFERRED)
 	{
-		glDeleteTextures(2, m_prepass_target);
+		glDeleteTextures(m_prepass_count+1, m_prepass_target);
 		delete m_sphere_vertices;
 		delete m_sphere_indices;
 	}
@@ -399,16 +392,11 @@
 	m_time = time;
 	m_drawingmode = drawingmode;
 
-	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
-	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target[0], 0);
-	m_final_target = m_color_target[0];
+	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[0]);
+	m_final_target = m_render_target[1];
 	
-	GLenum targets[RAS_MAX_MRT];
-	for (int i = 0; i < RAS_MAX_MRT; i++)
-		targets[i] = (m_target_enabled[i]) ? GL_COLOR_ATTACHMENT0_EXT+i : GL_NONE;
+	glDrawBuffersARB(m_render_count, DRAW_BUFFERS);
 
-	glDrawBuffersARB(RAS_MAX_MRT, targets);
-
 	// Blender camera routine destroys the settings
 	if (m_drawingmode < KX_SOLID)
 	{
@@ -443,7 +431,7 @@
 void RAS_OpenGLRasterizer::SetDrawingMode(int drawingmode)
 {
 	if (m_drawingmode == KX_SHADOW)
-		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[0]);
 
 	m_drawingmode = drawingmode;
 
@@ -661,66 +649,84 @@
 	
 	if (m_2DCanvas->GetWindowArea().GetRight() != m_width || m_2DCanvas->GetWindowArea().GetTop() != m_height)
 	{
-		GLenum internal_formats[RAS_MAX_MRT] = {GL_RGB16F, GL_RGB16F, GL_RGB16F, GL_RGB16F};
-		GLenum formats[RAS_MAX_MRT] = {GL_RGB, GL_RGB, GL_RGB, GL_RGB};
-		GLenum sizes[RAS_MAX_MRT] = {GL_HALF_FLOAT, GL_HALF_FLOAT, GL_HALF_FLOAT, GL_HALF_FLOAT};
-
 		m_width = m_2DCanvas->GetWindowArea().GetRight();
 		m_height = m_2DCanvas->GetWindowArea().GetTop();
 
-		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[0]);
 
 		//Update depth target
-		glBindTexture(GL_TEXTURE_2D, m_depth_target);
+		glBindTexture(GL_TEXTURE_2D, m_render_target[0]);
 		glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, m_width, m_height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-		glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_depth_target, 0);
+		glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_render_target[0], 0);
 
 		//Update color targets
-		for (int i = 0; i < RAS_MAX_MRT; i++)
+		for (int i = 0; i < m_render_count; i++)
 		{
-			if (m_target_enabled[i])
-			{
-				glBindTexture(GL_TEXTURE_2D, m_color_target[i]);
-				glTexImage2D(GL_TEXTURE_2D, 0, internal_formats[i], m_width, m_height, 0, formats[i], sizes[i], NULL);
-				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-				glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, m_color_target[i], 0);
-			}
+			glBindTexture(GL_TEXTURE_2D, m_render_target[i+1]);
+			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, m_width, m_height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, m_render_target[i+1], 0);
 		}
 
+		//Check completeness
+		GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+		if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
+			printf("Error in setting up FBO\n");
+
 		if (m_technique == KX_TECH_INFERRED)
 		{
-			// Update prepass targets, but don't attach for now
-			for (int i = 0; i < 2; i++)
+			glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[1]);
+
+			glBindTexture(GL_TEXTURE_2D, m_prepass_target[0]);
+			glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, m_width, m_height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_prepass_target[0], 0);
+			
+		// Update prepass targets
+			for (int i = 0; i < m_prepass_count; i++)
 			{
-				glBindTexture(GL_TEXTURE_2D, m_prepass_target[i]);
+				glBindTexture(GL_TEXTURE_2D, m_prepass_target[i+1]);
 				glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_SHORT, NULL);
 				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
 				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+				glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, m_prepass_target[i+1], 0);
 			}
 
-			// Update light target, but don't attach for now
+			//Check completeness
+			status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+			if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
+				printf("Error in setting up prepass FBO\n");
+
+			glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[2]);
+			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_prepass_target[0], 0);
+
+			// Update light target
 			glBindTexture(GL_TEXTURE_2D, GPU_texture_opengl_bindcode(m_light_target));
 			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, m_width, m_height, 0, GL_RGBA, GL_HALF_FLOAT, NULL);
 			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
 			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, GPU_texture_opengl_bindcode(m_light_target), 0);
+			
+			//Check completeness
+			status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+			if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
+				printf("Error in setting up light FBO\n");
 		}
 
-		//Check completeness
-		GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
-		if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
-			printf("Error in setting up FBO\n");
-
 		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
 	}
 
@@ -1532,11 +1538,10 @@
 
 	int bind;
 	glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
-	bind = GPU_texture_opengl_bindcode(m_light_target);
-	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, bind, 0);
-	GLenum targets[1] = {GL_COLOR_ATTACHMENT0_EXT};
-	glDrawBuffersARB(1, targets);
 
+	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[2]);
+	glDrawBuffersARB(1, DRAW_BUFFERS);
+
 	glDisable(GL_DEPTH_TEST);
 	glEnable(GL_TEXTURE_2D);
 	glEnable(GL_BLEND);
@@ -1551,12 +1556,12 @@
 	GPU_shader_bind(m_light_shader);
 
 	glActiveTexture(GL_TEXTURE0);
-	glBindTexture(GL_TEXTURE_2D, m_prepass_target[0]);
+	glBindTexture(GL_TEXTURE_2D, m_prepass_target[1]);
 	bind = GPU_shader_get_uniform(m_light_shader, "prepass1");
 	glUniform1iARB(bind, 0);
 
 	glActiveTexture(GL_TEXTURE1);
-	glBindTexture(GL_TEXTURE_2D, m_prepass_target[1]);
+	glBindTexture(GL_TEXTURE_2D, m_prepass_target[2]);
 	bind = GPU_shader_get_uniform(m_light_shader, "prepass2");
 	glUniform1iARB(bind, 1);
 
@@ -1657,8 +1662,8 @@
 {
 	if (m_technique != KX_TECH_INFERRED) return;
 	if (!m_light_shader) return;
-
-	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target[0], 0);
+	

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list