[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56727] branches/ge_harmony/source: Removing the use of texelFetch from the material shader for better compatibility .

Daniel Stokes kupomail at gmail.com
Mon May 13 00:00:09 CEST 2013


Revision: 56727
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56727
Author:   kupoman
Date:     2013-05-12 22:00:09 +0000 (Sun, 12 May 2013)
Log Message:
-----------
Removing the use of texelFetch from the material shader for better compatibility. This also cleans up some run time warnings from the shader.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_material.glsl
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_material.c	2013-05-12 21:57:57 UTC (rev 56726)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_material.c	2013-05-12 22:00:09 UTC (rev 56727)
@@ -79,6 +79,8 @@
 };
 
 static GPUTexture *light_map = NULL;
+static float light_map_width = 0;
+static float light_map_height = 0;
 
 /* Structs */
 
@@ -283,39 +285,45 @@
 		GPULamp *lamp;
 		GPUShader *shader = GPU_pass_shader(material->pass);
 
-		/* handle layer lamps */
-		for (nlink=material->lamps.first; nlink; nlink=nlink->next) {
-			lamp= nlink->data;
+		/* handle layer lamps or light map */
+		if (light_map) {
+			light_map_width = (float)GPU_texture_opengl_width(light_map);
+			light_map_height = (float)GPU_texture_opengl_height(light_map);
+		}
+		else {
+			for (nlink=material->lamps.first; nlink; nlink=nlink->next) {
+				lamp= nlink->data;
 
-			if (!lamp->hide && (lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay))) {
-				lamp->dynenergy = lamp->energy;
-				copy_v3_v3(lamp->dyncol, lamp->col);
-			}
-			else {
-				lamp->dynenergy = 0.0f;
-				lamp->dyncol[0]= lamp->dyncol[1]= lamp->dyncol[2] = 0.0f;
-			}
+				if (!lamp->hide && (lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay))) {
+					lamp->dynenergy = lamp->energy;
+					copy_v3_v3(lamp->dyncol, lamp->col);
+				}
+				else {
+					lamp->dynenergy = 0.0f;
+					lamp->dyncol[0]= lamp->dyncol[1]= lamp->dyncol[2] = 0.0f;
+				}
 
-			if (material->dynproperty & DYN_LAMP_VEC) {
-				copy_v3_v3(lamp->dynvec, lamp->vec);
-				normalize_v3(lamp->dynvec);
-				negate_v3(lamp->dynvec);
-				mul_mat3_m4_v3(viewmat, lamp->dynvec);
-			}
+				if (material->dynproperty & DYN_LAMP_VEC) {
+					copy_v3_v3(lamp->dynvec, lamp->vec);
+					normalize_v3(lamp->dynvec);
+					negate_v3(lamp->dynvec);
+					mul_mat3_m4_v3(viewmat, lamp->dynvec);
+				}
 
-			if (material->dynproperty & DYN_LAMP_CO) {
-				copy_v3_v3(lamp->dynco, lamp->co);
-				mul_m4_v3(viewmat, lamp->dynco);
-			}
+				if (material->dynproperty & DYN_LAMP_CO) {
+					copy_v3_v3(lamp->dynco, lamp->co);
+					mul_m4_v3(viewmat, lamp->dynco);
+				}
 
-			if (material->dynproperty & DYN_LAMP_IMAT) {
-				mult_m4_m4m4(lamp->dynimat, lamp->imat, viewinv);
-			}
+				if (material->dynproperty & DYN_LAMP_IMAT) {
+					mult_m4_m4m4(lamp->dynimat, lamp->imat, viewinv);
+				}
 
-			if (material->dynproperty & DYN_LAMP_PERSMAT) {
-				if (!GPU_lamp_has_shadow_buffer(lamp)) /* The lamp matrices are already updated if we're using shadow buffers */
-					GPU_lamp_update_buffer_mats(lamp);
-				mult_m4_m4m4(lamp->dynpersmat, lamp->persmat, viewinv);
+				if (material->dynproperty & DYN_LAMP_PERSMAT) {
+					if (!GPU_lamp_has_shadow_buffer(lamp)) /* The lamp matrices are already updated if we're using shadow buffers */
+						GPU_lamp_update_buffer_mats(lamp);
+					mult_m4_m4m4(lamp->dynpersmat, lamp->persmat, viewinv);
+				}
 			}
 		}
 
@@ -973,10 +981,11 @@
 	GPUMaterial *mat= shi->gpumat;
 	GPUNodeLink *is, *spec, *rgb, *drgb, *srgb;
 
-	
+	GPU_link(mat, "light_map_read", GPU_dynamic_texture(light_map, GPU_DYNAMIC_SAMPLER_2DIMAGE, ma),
+		GPU_dynamic_uniform(&light_map_width, 0, NULL),
+		GPU_dynamic_uniform(&light_map_height, 0, NULL),
+		&is, &spec, &drgb, &srgb);
 
-	GPU_link(mat, "light_map_read", GPU_dynamic_texture(light_map, GPU_DYNAMIC_SAMPLER_2DIMAGE, ma), &is, &spec, &drgb, &srgb);
-
 	/* Diffuse */
 	GPU_link(mat, "shade_mul_value", shi->refl, drgb, &rgb);
 	add_to_diffuse(mat, ma, shi, is, rgb, &shr->diff);

Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_material.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_material.glsl	2013-05-12 21:57:57 UTC (rev 56726)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_material.glsl	2013-05-12 22:00:09 UTC (rev 56727)
@@ -1414,9 +1414,9 @@
 }
 
 /******* MATERIAL *********/
-void light_map_read(sampler2D map, out float is, out float spec, out vec3 drgb, out vec3 srgb)
+void light_map_read(sampler2D map, float width, float height, out float is, out float spec, out vec3 drgb, out vec3 srgb)
 {
-	vec4 data = texelFetch(map, ivec2(gl_FragCoord.xy), 0);
+	vec4 data = texture2D(map, gl_FragCoord.xy/vec2(width, height));
 	
 	drgb = data.rgb;
 	is = length(drgb);

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-05-12 21:57:57 UTC (rev 56726)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-05-12 22:00:09 UTC (rev 56727)
@@ -825,6 +825,8 @@
 			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_prepass_target[0], 0);
 
 			// Update light target
+			GPU_texture_free(m_light_target);
+			m_light_target = GPU_texture_create_2D(m_width, m_height, NULL, NULL);
 			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);




More information about the Bf-blender-cvs mailing list