[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53616] branches/ge_harmony/source: Now using the hardware depth buffer to reconstruct position ( gives an extra 8 bits of precision), and using the extra g buffer channel to store the third normal channel ( this improves performance of the light shader).

Daniel Stokes kupomail at gmail.com
Sun Jan 6 22:23:36 CET 2013


Revision: 53616
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53616
Author:   kupoman
Date:     2013-01-06 21:23:34 +0000 (Sun, 06 Jan 2013)
Log Message:
-----------
Now using the hardware depth buffer to reconstruct position (gives an extra 8 bits of precision), and using the extra g buffer channel to store the third normal channel (this improves performance of the light shader).

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	2013-01-06 20:06:53 UTC (rev 53615)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	2013-01-06 21:23:34 UTC (rev 53616)
@@ -44,6 +44,7 @@
 
 uniform sampler2D prepass1;
 uniform sampler2D prepass2;
+uniform sampler2D depth_texture;
 
 // uniform vec2 magic;
 uniform mat4 inv_proj_matrix;
@@ -57,18 +58,21 @@
 	vec2 texcoord = gl_FragCoord.xy/bounds.xy;
 	vec4 gbuffer = texture2D(prepass1, texcoord);
 	vec4 mbuffer = texture2D(prepass2, texcoord);
+	float depth = texture2D(depth_texture, texcoord).r;
+	// float depth = gbuffer.b;
 
-	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 N = gbuffer.rgb * 2.0 - vec3(1.0, 1.0, 1.0);
+	// 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;
 	vec4 proj;
-	proj.z = gbuffer.b;
-	proj.x = texcoord.x * 2 - 1;
-	proj.y = texcoord.y * 2 - 1;
+	proj.xy = texcoord;
+	proj.z = depth;
+	proj.xyz = proj.xyz * 2.0 - vec3(1.0, 1.0, 1.0);
 	proj.w = 1.0;
 	proj = inv_proj_matrix * proj;
 	V.xyz = proj.xyz/proj.w;

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	2013-01-06 20:06:53 UTC (rev 53615)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl	2013-01-06 21:23:34 UTC (rev 53616)
@@ -1,7 +1,7 @@
 
 varying vec3 varnormal;
 varying vec3 varposition;
-varying vec2 vardepth;
+// varying vec2 vardepth;
 uniform float mat_id;
 
 uniform float diff_param1;
@@ -12,10 +12,11 @@
 
 void main()
 {
-	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;
+	// 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;
+	gl_FragData[0].rgb = varnormal * 0.5 + vec3(0.5, 0.5, 0.5);
 	gl_FragData[0].a = mat_id;
 	
 	gl_FragData[1].r = diff_param1;

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	2013-01-06 20:06:53 UTC (rev 53615)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl	2013-01-06 21:23:34 UTC (rev 53616)
@@ -1,7 +1,7 @@
 
 varying vec3 varposition;
 varying vec3 varnormal;
-varying vec2 vardepth;
+// varying vec2 vardepth;
 
 void main()
 {
@@ -10,7 +10,7 @@
 	varposition = co.xyz;
 	varnormal = normalize(gl_NormalMatrix * gl_Normal);
 	co = gl_ProjectionMatrix * co;
-	vardepth = co.zw;
+	// 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	2013-01-06 20:06:53 UTC (rev 53615)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-01-06 21:23:34 UTC (rev 53616)
@@ -780,12 +780,14 @@
 			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);
+			glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, m_width, m_height, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL);
+			glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE , GL_INTENSITY);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
 			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);
+			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, m_prepass_target[0], 0);
 			
 		// Update prepass targets
 			for (int i = 0; i < m_prepass_count; i++)
@@ -806,7 +808,7 @@
 				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);
+			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, m_prepass_target[0], 0);
 
 			// Update light target
 			glBindTexture(GL_TEXTURE_2D, GPU_texture_opengl_bindcode(m_light_target));
@@ -1401,10 +1403,10 @@
 	glDrawBuffersARB(1, DRAW_BUFFERS);
 
 	glDisable(GL_DEPTH_TEST);
+	glDepthMask(GL_FALSE);
 	glEnable(GL_TEXTURE_2D);
 	glEnable(GL_BLEND);
 	glBlendFunc(GL_ONE, GL_ONE);
-	glPolygonMode(GL_FRONT, GL_FILL);
 	glMatrixMode(GL_TEXTURE);
 	glLoadIdentity();
 
@@ -1423,6 +1425,11 @@
 	bind = GPU_shader_get_uniform(m_light_shader, "prepass2");
 	glUniform1iARB(bind, 1);
 
+	glActiveTexture(GL_TEXTURE2);
+	glBindTexture(GL_TEXTURE_2D, m_prepass_target[0]);
+	bind = GPU_shader_get_uniform(m_light_shader, "depth_texture");
+	glUniform1iARB(bind, 2);
+
 	//m_magic[0] = -1/m_projmatrix[0][0];
 	//m_magic[1] = -1/m_projmatrix[1][1];
 
@@ -1544,6 +1551,7 @@
 	if (!m_light_shader) return;
 	
 	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo[0]);
+	glDepthMask(GL_TRUE);
 	glPopAttrib();
 }
 




More information about the Bf-blender-cvs mailing list