[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54831] branches/ge_harmony/source: Adding support for simple and variance shadows to the inferred lighting.

Daniel Stokes kupomail at gmail.com
Mon Feb 25 03:23:39 CET 2013


Revision: 54831
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54831
Author:   kupoman
Date:     2013-02-25 02:23:38 +0000 (Mon, 25 Feb 2013)
Log Message:
-----------
Adding support for simple and variance shadows to the inferred lighting. The impact of the bias setting does not appear to be one-to-one with the forward rendering and may require further investigation.

Also making sure all prepass targets are available to the light shader.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/GPU_material.h
    branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
    branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
    branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp

Modified: branches/ge_harmony/source/blender/gpu/GPU_material.h
===================================================================
--- branches/ge_harmony/source/blender/gpu/GPU_material.h	2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/blender/gpu/GPU_material.h	2013-02-25 02:23:38 UTC (rev 54831)
@@ -242,6 +242,8 @@
 void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[4][4], int *winsize, float winmat[4][4]);
 void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp);
 int GPU_lamp_shadow_buffer_type(GPULamp *lamp);
+int GPU_lamp_shadow_buffer_get(GPULamp *lamp);
+float* GPU_lamp_perspective_get(GPULamp *lamp);
 
 void GPU_lamp_update(GPULamp *lamp, int lay, int hide, float obmat[4][4]);
 void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy);

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2013-02-25 02:23:38 UTC (rev 54831)
@@ -779,7 +779,9 @@
 
 int GPU_texture_opengl_bindcode(GPUTexture *tex)
 {
-	return tex->bindcode;
+	if (tex)
+		return tex->bindcode;
+	return 0;
 }
 
 GPUFrameBuffer *GPU_texture_framebuffer(GPUTexture *tex)

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_material.c	2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_material.c	2013-02-25 02:23:38 UTC (rev 54831)
@@ -2112,6 +2112,21 @@
 		return -1;
 }
 
+int GPU_lamp_shadow_buffer_get(GPULamp *lamp)
+{
+	if (lamp->la->shadowmap_type == LA_SHADMAP_VARIANCE)
+		return GPU_texture_opengl_bindcode(lamp->tex);
+	else if (lamp->tex)
+		return GPU_texture_opengl_bindcode(lamp->tex);
+	else
+		return 0;
+}
+
+float* GPU_lamp_perspective_get(GPULamp *lamp)
+{
+	return &(lamp->dynpersmat[0][0]);
+}
+
 /* export the GLSL shader */
 
 GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma)

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-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	2013-02-25 02:23:38 UTC (rev 54831)
@@ -26,6 +26,10 @@
 #define SPEC_TOON		3
 #define SPEC_WARDISO	4
 
+#define SHADOW_NONE		0
+#define SHADOW_SIMPLE	1
+#define SHADOW_VARIANCE	2
+
 #define LN_511	6.23636959
 
 struct Light {
@@ -39,6 +43,13 @@
 	vec3 vector;
 	float spotsize;
 	float spotblend;
+	
+	int shadowtype;
+	sampler2DShadow shadowbuffer;
+	sampler2D shadowbuffercol;
+	float shadowbias;
+	float shadowbleed;
+	mat4 shadowpersmat;
 };
 
 varying vec3 varposition;
@@ -170,6 +181,19 @@
 		shade_phong_spec(N, L, view, 1.0, hardness);
 #endif
 
+	if (bgl_Light.shadowtype == SHADOW_SIMPLE) {
+		float shadfac;
+		test_shadowbuf(V, bgl_Light.shadowbuffer, bgl_Light.shadowpersmat, bgl_Light.shadowbias,
+			diff_term, shadfac);
+		diff_term *= shadfac;
+	}
+	else if (bgl_Light.shadowtype == SHADOW_VARIANCE) {
+		float shadfac;
+		test_shadowbuf_vsm(V, bgl_Light.shadowbuffercol, bgl_Light.shadowpersmat, bgl_Light.shadowbias,
+			bgl_Light.shadowbleed, diff_term, shadfac);
+		diff_term *= shadfac;
+	}
+
 	// Factor in light properties
 	vec3 diff = bgl_Light.color * bgl_Light.energy * diff_term * attenuation;
 	float spec = length(bgl_Light.energy) * spec_term * attenuation;

Modified: branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2013-02-25 02:23:38 UTC (rev 54831)
@@ -1869,6 +1869,10 @@
 	
 	lightobj.m_nodiffuse = (la->mode & LA_NO_DIFF) != 0;
 	lightobj.m_nospecular = (la->mode & LA_NO_SPEC) != 0;
+
+	lightobj.m_shadowtype = la->shadowmap_type;
+	lightobj.m_shadowbias = la->bias;
+	lightobj.m_shadowbleed = la->bleedbias;
 	
 	bool glslmat = converter->GetGLSLMaterials();
 

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp	2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp	2013-02-25 02:23:38 UTC (rev 54831)
@@ -213,6 +213,9 @@
 		memcpy(m_lightobj.m_vector, &obmat[2], sizeof(float)*3);
 		memcpy(m_lightobj.m_obmat, obmat, sizeof(float)*16);
 
+		m_lightobj.m_shadowbuffer = GPU_lamp_shadow_buffer_get(lamp);
+		m_lightobj.m_shadowpersmat = GPU_lamp_perspective_get(lamp);
+
 		GPU_lamp_update(lamp, m_lightobj.m_layer, 0, obmat);
 		GPU_lamp_update_colors(lamp, m_lightobj.m_red, m_lightobj.m_green, 
 			m_lightobj.m_blue, m_lightobj.m_energy);

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h	2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h	2013-02-25 02:23:38 UTC (rev 54831)
@@ -75,6 +75,12 @@
 	float	m_position[4];
 	float	m_vector[3];
 	float	m_obmat[4][4];
+
+	int		m_shadowbuffer;
+	int		m_shadowtype;
+	float	m_shadowbias;
+	float	m_shadowbleed;
+	float*	m_shadowpersmat;
 };
 
 #endif  /* __RAS_LIGHTOBJECT_H__ */

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-02-25 02:21:49 UTC (rev 54830)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2013-02-25 02:23:38 UTC (rev 54831)
@@ -56,6 +56,7 @@
 #include "BL_Material.h"
 
 #include "DNA_image_types.h"
+#include "DNA_lamp_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_material_types.h"
 #include "DNA_texture_types.h"
@@ -1438,25 +1439,30 @@
 
 	GPU_shader_bind(m_light_shader);
 
-	glActiveTexture(GL_TEXTURE0);
+	glActiveTexture(GL_TEXTURE1);
 	glBindTexture(GL_TEXTURE_2D, m_prepass_target[1]);
 	bind = GPU_shader_get_uniform(m_light_shader, "bgl_PrepassTarget0");
-	glUniform1iARB(bind, 0);
+	glUniform1iARB(bind, 1);
 
-	glActiveTexture(GL_TEXTURE1);
+	glActiveTexture(GL_TEXTURE2);
 	glBindTexture(GL_TEXTURE_2D, m_prepass_target[2]);
 	bind = GPU_shader_get_uniform(m_light_shader, "bgl_PrepassTarget1");
-	glUniform1iARB(bind, 1);
+	glUniform1iARB(bind, 2);
 
 	glActiveTexture(GL_TEXTURE3);
 	glBindTexture(GL_TEXTURE_2D, m_prepass_target[3]);
 	bind = GPU_shader_get_uniform(m_light_shader, "bgl_PrepassTarget2");
 	glUniform1iARB(bind, 3);
 
-	glActiveTexture(GL_TEXTURE2);
+	glActiveTexture(GL_TEXTURE4);
+	glBindTexture(GL_TEXTURE_2D, m_prepass_target[4]);
+	bind = GPU_shader_get_uniform(m_light_shader, "bgl_PrepassTarget3");
+	glUniform1iARB(bind, 4);
+
+	glActiveTexture(GL_TEXTURE0);
 	glBindTexture(GL_TEXTURE_2D, m_prepass_target[0]);
 	bind = GPU_shader_get_uniform(m_light_shader, "bgl_DepthTexture");
-	glUniform1iARB(bind, 2);
+	glUniform1iARB(bind, 0);
 
 	float inv_proj_matrix[16];
 	m_projmatrix.inverse().getValue(inv_proj_matrix);
@@ -1521,6 +1527,36 @@
 	bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.spotblend");
 	GPU_shader_uniform_vector(m_light_shader, bind, 1, 1, &spotbl);
 
+	if (light->m_shadowbuffer) {
+		bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowtype");
+		int type = light->m_shadowtype + 1;;
+		GPU_shader_uniform_ivector(m_light_shader, bind, 1, 1, &type);
+
+		glActiveTexture(GL_TEXTURE5);
+		glBindTexture(GL_TEXTURE_2D, light->m_shadowbuffer);
+		if (light->m_shadowtype == LA_SHADMAP_VARIANCE) {
+			bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowbuffercol");
+		}
+		else {
+			bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowbuffer");
+		}
+		glUniform1iARB(bind, 5);
+
+		bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowbias");
+		float bias = 0.02f * light->m_shadowbias;
+		GPU_shader_uniform_vector(m_light_shader, bind, 1, 1, &bias);
+
+		bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowbleed");
+		GPU_shader_uniform_vector(m_light_shader, bind, 1, 1, &light->m_shadowbleed);
+
+		bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowpersmat");
+		GPU_shader_uniform_vector(m_light_shader, bind, 16, 1, light->m_shadowpersmat);
+	}
+	else {
+		bind = GPU_shader_get_uniform(m_light_shader, "bgl_Light.shadowtype");
+		int type = 0;
+		GPU_shader_uniform_ivector(m_light_shader, bind, 1, 1, &type);
+	}
 	if (light->m_type == RAS_LightObject::LIGHT_NORMAL) {
 		glMatrixMode(GL_MODELVIEW);
 		glPushMatrix();




More information about the Bf-blender-cvs mailing list