[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49910] branches/ge_harmony/source: Getting the material system to use a light map when it is available ( which should currently be always).

Daniel Stokes kupomail at gmail.com
Wed Aug 15 07:33:57 CEST 2012


Revision: 49910
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49910
Author:   kupoman
Date:     2012-08-15 05:33:57 +0000 (Wed, 15 Aug 2012)
Log Message:
-----------
Getting the material system to use a light map when it is available (which should currently be always). Right now the material system can set it's diffuse color to match the light map. Now comes the task of reintroducing material features and control.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/GPU_material.h
    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
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h

Modified: branches/ge_harmony/source/blender/gpu/GPU_material.h
===================================================================
--- branches/ge_harmony/source/blender/gpu/GPU_material.h	2012-08-15 02:42:38 UTC (rev 49909)
+++ branches/ge_harmony/source/blender/gpu/GPU_material.h	2012-08-15 05:33:57 UTC (rev 49910)
@@ -121,7 +121,7 @@
 GPUBlendMode GPU_material_alpha_blend(GPUMaterial *material, float obcol[4]);
 
 /* High level functions to create and use GPU materials */
-void GPU_material_set_light_map(unsigned int map);
+void GPU_material_set_light_map(struct GPUTexture *map);
 
 GPUMaterial *GPU_material_from_blender(struct Scene *scene, struct Material *ma);
 void GPU_material_free(struct Material *ma);

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_material.c	2012-08-15 02:42:38 UTC (rev 49909)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_material.c	2012-08-15 05:33:57 UTC (rev 49910)
@@ -78,7 +78,7 @@
 				"emit",
 };
 
-static unsigned int light_map = -1;
+static GPUTexture *light_map = NULL;
 
 /* Structs */
 
@@ -1024,7 +1024,15 @@
 
 static void shade_map_light(GPUShadeInput *shi, GPUShadeResult *shr)
 {
+	Material *ma= shi->mat;
+	GPUMaterial *mat= shi->gpumat;
+	GPUNodeLink *mdata;
 
+	
+
+	GPU_link(mat, "light_map_read", GPU_dynamic_texture(light_map, GPU_DYNAMIC_SAMPLER_2DIMAGE, ma), &mdata);
+	GPU_link(mat, "set_value", mdata, &shr->diff);
+
 }
 
 static void material_lights(GPUShadeInput *shi, GPUShadeResult *shr)
@@ -1034,7 +1042,7 @@
 	Scene *sce_iter;
 	GPULamp *lamp;
 
-	if (light_map != -1) {
+	if (light_map) {
 		shade_map_light(shi, shr);
 		return;
 	}
@@ -1702,7 +1710,7 @@
 	return shr.combined;
 }
 
-void GPU_material_set_light_map(unsigned int map)
+void GPU_material_set_light_map(GPUTexture *map)
 {
 	Material *ma;
 	light_map = map;

Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_material.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_material.glsl	2012-08-15 02:42:38 UTC (rev 49909)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_material.glsl	2012-08-15 05:33:57 UTC (rev 49910)
@@ -1382,6 +1382,10 @@
 }
 
 /******* MATERIAL *********/
+void light_map_read(sampler2D map, out vec4 data)
+{
+	data = texelFetch(map, ivec2(gl_FragCoord.xy), 0);
+}
 
 void lamp_visibility_sun_hemi(vec3 lampvec, out vec3 lv, out float dist, out float visifac)
 {

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-15 02:42:38 UTC (rev 49909)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-15 05:33:57 UTC (rev 49910)
@@ -118,8 +118,8 @@
 	m_target_enabled[3] = false;
 
 	// Light Map (Handle this here to sneak in before material conversion)
-	glGenTextures(1, &m_light_target);
-	//GPU_material_set_light_map(m_light_target);
+	m_light_target = GPU_texture_create_2D(0, 0, NULL, NULL);
+	GPU_material_set_light_map(m_light_target);
 }
 
 
@@ -128,8 +128,8 @@
 {
 	// Restore the previous AF value
 	GPU_set_anisotropic(m_prevafvalue);
-	glDeleteTextures(1, &m_light_target);
-	//GPU_material_set_light_map(-1);
+	GPU_texture_free(m_light_target);
+	GPU_material_set_light_map(NULL);
 }
 
 bool RAS_OpenGLRasterizer::Init()
@@ -628,7 +628,7 @@
 		}
 
 		// Update light target, but don't attach for now
-		glBindTexture(GL_TEXTURE_2D, m_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);
@@ -1420,8 +1420,10 @@
 
 void RAS_OpenGLRasterizer::BeginLightPass()
 {
+	int bind;
 	glPushAttrib(GL_VIEWPORT_BIT | GL_COLOR_BUFFER_BIT);
-	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_light_target, 0);
+	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);
 
@@ -1449,7 +1451,7 @@
 
 	glActiveTexture(GL_TEXTURE0);
 	glBindTexture(GL_TEXTURE_2D, m_prepass_target[0]);
-	int bind = GPU_shader_get_uniform(m_light_shader, "prepass1");
+	bind = GPU_shader_get_uniform(m_light_shader, "prepass1");
 	glUniform1iARB(bind, 0);
 
 	glActiveTexture(GL_TEXTURE1);
@@ -1495,8 +1497,6 @@
 
 	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target[0], 0);
 	glPopAttrib();
-
-	//m_final_target = m_light_target;
 }
 
 void RAS_OpenGLRasterizer::BeginPrePass()
@@ -1508,7 +1508,7 @@
 	glDrawBuffersARB(2, targets);
 
 	glClearColor(0.0, 0.0, 0.0, 0.0);
-	glClear(GL_COLOR_BUFFER_BIT);
+	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 	GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_PREPASS);
 	GPU_shader_bind(shader);

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2012-08-15 02:42:38 UTC (rev 49909)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2012-08-15 05:33:57 UTC (rev 49910)
@@ -124,7 +124,7 @@
 	unsigned int	m_fbo;
 	unsigned int	m_prepass_target[2];
 	unsigned int	m_color_target[RAS_MAX_MRT];
-	unsigned int	m_light_target;
+	GPUTexture*		m_light_target;
 	GPUShader*		m_light_shader;
 	unsigned int	m_depth_target;
 	unsigned int	m_final_target;




More information about the Bf-blender-cvs mailing list