[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49972] branches/ge_harmony: Moving the prepass rendering to a better spot, as well as making it work a bit better in the pipeline ( for example it no longer messes up display lists so textures load correctly ).

Daniel Stokes kupomail at gmail.com
Sat Aug 18 02:23:38 CEST 2012


Revision: 49972
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49972
Author:   kupoman
Date:     2012-08-18 00:23:32 +0000 (Sat, 18 Aug 2012)
Log Message:
-----------
Moving the prepass rendering to a better spot, as well as making it work a bit better in the pipeline (for example it no longer messes up display lists so textures load correctly). Also getting start on storing just depth for position instead of all three components, however the vertex shader is causing problems.

Modified Paths:
--------------
    branches/ge_harmony/SConstruct
    branches/ge_harmony/source/blender/gpu/CMakeLists.txt
    branches/ge_harmony/source/blender/gpu/SConscript
    branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
    branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_BucketManager.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h

Added Paths:
-----------
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_vert.glsl

Modified: branches/ge_harmony/SConstruct
===================================================================
--- branches/ge_harmony/SConstruct	2012-08-17 23:29:39 UTC (rev 49971)
+++ branches/ge_harmony/SConstruct	2012-08-18 00:23:32 UTC (rev 49972)
@@ -503,6 +503,9 @@
 
 # --- glsl ---
 data_to_c_simple("source/blender/gpu/shaders/gpu_shader_light_frag.glsl")
+data_to_c_simple("source/blender/gpu/shaders/gpu_shader_light_vert.glsl")
+data_to_c_simple("source/blender/gpu/shaders/gpu_shader_prepass_frag.glsl")
+data_to_c_simple("source/blender/gpu/shaders/gpu_shader_prepass_vert.glsl")
 data_to_c_simple("source/blender/gpu/shaders/gpu_shader_material.glsl")
 data_to_c_simple("source/blender/gpu/shaders/gpu_shader_vertex.glsl")
 data_to_c_simple("source/blender/gpu/shaders/gpu_shader_sep_gaussian_blur_frag.glsl")

Modified: branches/ge_harmony/source/blender/gpu/CMakeLists.txt
===================================================================
--- branches/ge_harmony/source/blender/gpu/CMakeLists.txt	2012-08-17 23:29:39 UTC (rev 49971)
+++ branches/ge_harmony/source/blender/gpu/CMakeLists.txt	2012-08-18 00:23:32 UTC (rev 49972)
@@ -59,6 +59,7 @@
 )
 
 data_to_c_simple(shaders/gpu_shader_light_frag.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_light_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_material.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_prepass_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_prepass_vert.glsl SRC)

Modified: branches/ge_harmony/source/blender/gpu/SConscript
===================================================================
--- branches/ge_harmony/source/blender/gpu/SConscript	2012-08-17 23:29:39 UTC (rev 49971)
+++ branches/ge_harmony/source/blender/gpu/SConscript	2012-08-18 00:23:32 UTC (rev 49972)
@@ -24,6 +24,9 @@
 import os
 sources.extend((
     os.path.join(env['DATA_SOURCES'], "gpu_shader_light_frag.glsl.c"),
+    os.path.join(env['DATA_SOURCES'], "gpu_shader_light_vert.glsl.c"),
+    os.path.join(env['DATA_SOURCES'], "gpu_shader_prepass_frag.glsl.c"),
+    os.path.join(env['DATA_SOURCES'], "gpu_shader_prepass_vert.glsl.c"),
 	os.path.join(env['DATA_SOURCES'], "gpu_shader_material.glsl.c"),
 	os.path.join(env['DATA_SOURCES'], "gpu_shader_vertex.glsl.c"),
 	os.path.join(env['DATA_SOURCES'], "gpu_shader_sep_gaussian_blur_frag.glsl.c"),

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2012-08-17 23:29:39 UTC (rev 49971)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2012-08-18 00:23:32 UTC (rev 49972)
@@ -74,6 +74,7 @@
 extern char datatoc_gpu_shader_sep_gaussian_blur_vert_glsl[];
 extern char datatoc_gpu_shader_sep_gaussian_blur_frag_glsl[];
 extern char datatoc_gpu_shader_light_frag_glsl[];
+extern char datatoc_gpu_shader_light_vert_glsl[];
 extern char datatoc_gpu_shader_prepass_frag_glsl[];
 extern char datatoc_gpu_shader_prepass_vert_glsl[];
 
@@ -1036,6 +1037,7 @@
 	GLhandleARB geometry;	/* handle for geometry shader */
 	GLhandleARB lib;		/* handle for libment shader */
 	int totattrib;			/* total number of attributes */
+	GHash *uniforms;		/* uniform location cache */
 };
 
 static void shader_print_errors(const char *task, char *log, const char *code)
@@ -1207,6 +1209,8 @@
 		return NULL;
 	}
 
+	shader->uniforms = BLI_ghash_str_new("Uniform Cache");
+
 	return shader;
 }
 
@@ -1272,12 +1276,22 @@
 		glDeleteObjectARB(shader->fragment);
 	if (shader->object)
 		glDeleteObjectARB(shader->object);
+	BLI_ghash_free(shader->uniforms, NULL, NULL);
 	MEM_freeN(shader);
 }
 
 int GPU_shader_get_uniform(GPUShader *shader, const char *name)
 {
-	return glGetUniformLocationARB(shader->object, name);
+	int bind;
+	if (BLI_ghash_haskey(shader->uniforms, (void*)name)) {
+		bind = (int)BLI_ghash_lookup(shader->uniforms, name);
+	}
+	else {
+		bind = glGetUniformLocationARB(shader->object, name);
+		BLI_ghash_insert(shader->uniforms, (void*)name, (void*)bind);
+	}
+
+	return bind;
 }
 
 void GPU_shader_uniform_vector(GPUShader *UNUSED(shader), int location, int length, int arraysize, float *value)
@@ -1397,14 +1411,24 @@
 void GPU_shader_free_builtin_shaders()
 {
 	if (GG.shaders.vsm_store) {
-		MEM_freeN(GG.shaders.vsm_store);
+		GPU_shader_free(GG.shaders.vsm_store);
 		GG.shaders.vsm_store = NULL;
 	}
 
 	if (GG.shaders.sep_gaussian_blur) {
-		MEM_freeN(GG.shaders.sep_gaussian_blur);
+		GPU_shader_free(GG.shaders.sep_gaussian_blur);
 		GG.shaders.sep_gaussian_blur = NULL;
 	}
+
+	if (GG.shaders.prepass) {
+		GPU_shader_free(GG.shaders.prepass);
+		GG.shaders.prepass = NULL;
+	}
+
+	if (GG.shaders.light) {
+		GPU_shader_free(GG.shaders.light);
+		GG.shaders.light = NULL;
+	}
 }
 
 #if 0

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-08-17 23:29:39 UTC (rev 49971)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	2012-08-18 00:23:32 UTC (rev 49972)
@@ -20,11 +20,15 @@
 	vec3 vector;
 };
 
+//varying vec3 varposition;
+
 uniform Light light;
 
 uniform sampler2D prepass1;
 uniform sampler2D prepass2;
 
+uniform vec2 magic;
+
 void main()
 {
 
@@ -32,7 +36,10 @@
 	float attenuation = 1.0;
 
 	vec3 N = normalize(texture2D(prepass1, gl_TexCoord[0].st).rgb);
-	vec3 V = texture2D(prepass2, gl_TexCoord[0].st).rgb;
+	vec3 V;
+	// V.z = texture2D(prepass1, gl_TexCoord[0].st).a;
+	// V.xy = V.zz * magic * varposition.xy;
+	V = texture2D(prepass2, gl_TexCoord[0].st).rgb;
 	
 	if (light.type == SUN || light.type == HEMI)
 		L = light.vector;

Added: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_vert.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_vert.glsl	                        (rev 0)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_vert.glsl	2012-08-18 00:23:32 UTC (rev 49972)
@@ -0,0 +1,8 @@
+
+//varying vec3 varposition;
+
+void main()
+{
+	gl_Position = ftransform();
+}
+

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2012-08-17 23:29:39 UTC (rev 49971)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2012-08-18 00:23:32 UTC (rev 49972)
@@ -872,18 +872,6 @@
 		// this is now done incrementatlly in KX_Scene::CalculateVisibleMeshes
 		//scene->UpdateMeshTransformations();
 
-		// prepass
-		m_rasterizer->BeginPrePass();
-		RenderFrame(scene, cam);
-		m_rasterizer->EndPrePass();
-
-		// light pass
-		m_rasterizer->BeginLightPass();
-		CListValue *lightlist = scene->GetLightList();
-		for (int i=0; i<lightlist->GetCount(); i++)
-			m_rasterizer->RenderLight(((KX_LightObject*)lightlist->GetValue(i))->GetLightData());
-		m_rasterizer->EndLightPass();
-
 		// shadow buffers
 		RenderShadowBuffers(scene);
 
@@ -1327,8 +1315,20 @@
 	scene->RunDrawingCallbacks(scene->GetPreDrawCB());
 #endif
 
+	// prepass
+	m_rasterizer->BeginPrePass();
 	scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+	m_rasterizer->EndPrePass();
 
+	// light pass
+	m_rasterizer->BeginLightPass();
+	CListValue *lightlist = scene->GetLightList();
+	for (int i=0; i<lightlist->GetCount(); i++)
+		m_rasterizer->RenderLight(((KX_LightObject*)lightlist->GetValue(i))->GetLightData());
+	m_rasterizer->EndLightPass();
+
+	scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+
 	//render all the font objects for this scene
 	RenderFonts(scene);
 	

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_BucketManager.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_BucketManager.cpp	2012-08-17 23:29:39 UTC (rev 49971)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_BucketManager.cpp	2012-08-18 00:23:32 UTC (rev 49972)
@@ -179,16 +179,26 @@
 #if 1
 		RAS_MaterialBucket* bucket = *bit;
 		RAS_MeshSlot* ms;
-		// remove the mesh slot form the list, it culls them automatically for next frame
-		while((ms = bucket->GetNextActiveMeshSlot()))
-		{
-			rendertools->SetClientObject(rasty, ms->m_clientObj);
-			while (bucket->ActivateMaterial(cameratrans, rasty, rendertools))
-				bucket->RenderMeshSlot(cameratrans, rasty, rendertools, *ms);
+		if (rasty->GetDrawingMode() != RAS_IRasterizer::KX_OVERRIDE) {
+			// remove the mesh slot form the list, it culls them automatically for next frame
+			while((ms = bucket->GetNextActiveMeshSlot()))
+			{
+				rendertools->SetClientObject(rasty, ms->m_clientObj);
+				while (bucket->ActivateMaterial(cameratrans, rasty, rendertools))
+					bucket->RenderMeshSlot(cameratrans, rasty, rendertools, *ms);
 
-			// make this mesh slot culled automatically for next frame
-			// it will be culled out by frustrum culling
-			ms->SetCulled(true);
+				// make this mesh slot culled automatically for next frame
+				// it will be culled out by frustrum culling
+				ms->SetCulled(true);
+			}
+		} else {
+			SG_DList::iterator<RAS_MeshSlot> mit((*bit)->GetActiveMeshSlots());
+			for (mit.begin(); !mit.end(); mit++) {
+				ms = *mit;
+				rendertools->SetClientObject(rasty, ms->m_clientObj);
+				while (bucket->ActivateMaterial(cameratrans, rasty, rendertools))
+					bucket->RenderMeshSlot(cameratrans, rasty, rendertools, *ms);
+			}
 		}
 #else
 		list<RAS_MeshSlot>::iterator mit;
@@ -232,8 +242,9 @@
 	/* beginning each frame, clear (texture/material) caching information */
 	rasty->ClearCachingInfo();
 
-	RenderSolidBuckets(cameratrans, rasty, rendertools);	
-	RenderAlphaBuckets(cameratrans, rasty, rendertools);	
+	RenderSolidBuckets(cameratrans, rasty, rendertools);
+	if (rasty->GetDrawingMode() != RAS_IRasterizer::KX_OVERRIDE)
+		RenderAlphaBuckets(cameratrans, rasty, rendertools);	
 
 	rendertools->SetClientObject(rasty, NULL);
 }

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp	2012-08-17 23:29:39 UTC (rev 49971)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list