[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51127] branches/ge_harmony/source: Combining the two floating point gbuffer textures for the inferred lighting mode 's prepass into one integer texture.

Daniel Stokes kupomail at gmail.com
Sat Oct 6 21:58:21 CEST 2012


Revision: 51127
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51127
Author:   kupoman
Date:     2012-10-06 19:58:21 +0000 (Sat, 06 Oct 2012)
Log Message:
-----------
Combining the two floating point gbuffer textures for the inferred lighting mode's prepass into one integer texture. This should perform better, and gives more room for some other properties.

Also making sure depth testing gets re-enabled after the lighting pass.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp

Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	2012-10-06 18:53:57 UTC (rev 51126)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	2012-10-06 19:58:21 UTC (rev 51127)
@@ -29,19 +29,32 @@
 uniform sampler2D prepass1;
 uniform sampler2D prepass2;
 
-uniform vec2 magic;
+// uniform vec2 magic;
+uniform mat4 inv_proj_matrix;
 uniform vec2 bounds;
 
 void main()
 {
 	vec3 L;
 	float attenuation = 1.0;
+	
+	vec2 texcoord = gl_FragCoord.xy/bounds.xy;
+	vec4 gbuffer = texture2D(prepass1, texcoord);
 
-	vec3 N = normalize(texture2D(prepass1, gl_FragCoord.xy/bounds.xy).rgb);
+	vec3 N = vec3(gbuffer.rg, 0.0);
+	N = 2 * (N - vec3(0.5, 0.5, 0.0));
+	float z = sqrt(1.0 - pow(length(N.xy), 2.0));
+	N = vec3(2.0*z*N.x, 2.0*z*N.y, 2.0*z*z -1.0);
+	N = normalize(N);
+	
 	vec3 V;
-	// V.z = texture2D(prepass1, gl_TexCoord[0].st).a;
-	// V.xy = V.zz * magic * varposition.xy;
-	V = texture2D(prepass2, gl_FragCoord.xy/bounds.xy).rgb;
+	vec4 proj;
+	proj.z = gbuffer.b;
+	proj.x = texcoord.x * 2 - 1;
+	proj.y = texcoord.y * 2 - 1;
+	proj.w = 1.0;
+	proj = inv_proj_matrix * proj;
+	V.xyz = proj.xyz/proj.w;
 	
 	if (light.type == SUN || light.type == HEMI)
 		L = light.vector;

Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl	2012-10-06 18:53:57 UTC (rev 51126)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl	2012-10-06 19:58:21 UTC (rev 51127)
@@ -1,9 +1,12 @@
 
 varying vec3 varnormal;
 varying vec3 varposition;
+varying vec2 vardepth;
 
 void main()
 {
-    gl_FragData[0].rgb = varnormal;
-    gl_FragData[1].rgb = varposition;
+	vec3 n = normalize(varnormal + vec3(0.0, 0.0, 1.0));
+	n = 0.5 * n + vec3(0.5, 0.5, 0.5);
+    gl_FragData[0].rg = n.xy;
+	gl_FragData[0].b = vardepth.x / vardepth.y;
 }
\ No newline at end of file

Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl	2012-10-06 18:53:57 UTC (rev 51126)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl	2012-10-06 19:58:21 UTC (rev 51127)
@@ -1,6 +1,7 @@
 
 varying vec3 varposition;
 varying vec3 varnormal;
+varying vec2 vardepth;
 
 void main()
 {
@@ -8,6 +9,8 @@
 
 	varposition = co.xyz;
 	varnormal = normalize(gl_NormalMatrix * gl_Normal);
-	gl_Position = gl_ProjectionMatrix * co;
+	co = gl_ProjectionMatrix * co;
+	vardepth = co.zw;
+	gl_Position = co;
 }
 

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-10-06 18:53:57 UTC (rev 51126)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-10-06 19:58:21 UTC (rev 51127)
@@ -176,7 +176,7 @@
 
 	if (m_technique == KX_TECH_INFERRED)
 	{
-		glGenTextures(2, m_prepass_target);
+		glGenTextures(1, m_prepass_target);
 		m_light_shader = GPU_shader_get_builtin_shader(GPU_SHADER_LIGHT);
 		init_sphere();
 	}
@@ -691,10 +691,10 @@
 		if (m_technique == KX_TECH_INFERRED)
 		{
 			// Update prepass targets, but don't attach for now
-			for (int i = 0; i < 2; i++)
+			for (int i = 0; i < 1; i++)
 			{
 				glBindTexture(GL_TEXTURE_2D, m_prepass_target[i]);
-				glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, m_width, m_height, 0, GL_RGB, GL_HALF_FLOAT, NULL);
+				glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16, m_width, m_height, 0, GL_RGB, GL_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);
@@ -1490,7 +1490,7 @@
 	if (m_technique != KX_TECH_INFERRED) return;
 
 	int bind;
-	glPushAttrib(GL_COLOR_BUFFER_BIT);
+	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};
@@ -1520,12 +1520,17 @@
 	bind = GPU_shader_get_uniform(m_light_shader, "prepass2");
 	glUniform1iARB(bind, 1);
 
-	m_magic[0] = -1/m_projmatrix[0][0];
-	m_magic[1] = -1/m_projmatrix[1][1];
+	//m_magic[0] = -1/m_projmatrix[0][0];
+	//m_magic[1] = -1/m_projmatrix[1][1];
 
-	bind = GPU_shader_get_uniform(m_light_shader, "magic");
-	GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, m_magic);
+	//bind = GPU_shader_get_uniform(m_light_shader, "magic");
+	//GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, m_magic);
 
+	float inv_proj_matrix[16];
+	m_projmatrix.inverse().getValue(inv_proj_matrix);
+	bind = GPU_shader_get_uniform(m_light_shader, "inv_proj_matrix");
+	GPU_shader_uniform_vector(m_light_shader, bind, 16, 1, inv_proj_matrix);
+
 	float bounds[2] = {m_width, m_height};
 	bind = GPU_shader_get_uniform(m_light_shader, "bounds");
 	GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, bounds);
@@ -1621,7 +1626,7 @@
 
 	glPushAttrib(GL_VIEWPORT_BIT | GL_COLOR_BUFFER_BIT);
 	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_prepass_target[0], 0);
-	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_prepass_target[1], 0);
+	//glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_prepass_target[1], 0);
 	GLenum targets[2] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT};
 	glDrawBuffersARB(2, targets);
 
@@ -1642,9 +1647,9 @@
 	SetDrawingMode(m_saved_drawingmode);
 	glUseProgramObjectARB(0);
 	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target[0], 0);
-	if (m_target_enabled[1])
-		glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_color_target[1], 0);
-	else
-		glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
+	//if (m_target_enabled[1])
+	//	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, m_color_target[1], 0);
+	//else
+	//	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
 	glPopAttrib();
 }
\ No newline at end of file




More information about the Bf-blender-cvs mailing list