[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55767] trunk/blender/source: Fix for [ #34754] "Revision 55527 provokes glitchy GLSL shadow map rendering" reported by Alain Ducharme.

Mitchell Stokes mogurijin at gmail.com
Thu Apr 4 05:55:44 CEST 2013


Revision: 55767
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55767
Author:   moguri
Date:     2013-04-04 03:55:43 +0000 (Thu, 04 Apr 2013)
Log Message:
-----------
Fix for [#34754] "Revision 55527 provokes glitchy GLSL shadow map rendering" reported by Alain Ducharme. Per material uniforms and per object uniforms are now better separated.

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55527

Modified Paths:
--------------
    trunk/blender/source/blender/gpu/GPU_material.h
    trunk/blender/source/blender/gpu/intern/gpu_draw.c
    trunk/blender/source/blender/gpu/intern/gpu_material.c
    trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp
    trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.h
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp

Modified: trunk/blender/source/blender/gpu/GPU_material.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_material.h	2013-04-04 02:05:11 UTC (rev 55766)
+++ trunk/blender/source/blender/gpu/GPU_material.h	2013-04-04 03:55:43 UTC (rev 55767)
@@ -129,8 +129,8 @@
 
 void GPU_materials_free(void);
 
-void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap);
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], float viewmat[4][4], float viewinv[4][4], float obcol[4], float autobumpscale);
+void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap, float viewmat[4][4], float viewinv[4][4]);
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], float obcol[4], float autobumpscale);
 void GPU_material_unbind(GPUMaterial *material);
 int GPU_material_bound(GPUMaterial *material);
 

Modified: trunk/blender/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_draw.c	2013-04-04 02:05:11 UTC (rev 55766)
+++ trunk/blender/source/blender/gpu/intern/gpu_draw.c	2013-04-04 03:55:43 UTC (rev 55767)
@@ -1457,10 +1457,10 @@
 
 			gpumat = GPU_material_from_blender(GMS.gscene, mat);
 			GPU_material_vertex_attributes(gpumat, gattribs);
-			GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0, !(GMS.gob->mode & OB_MODE_TEXTURE_PAINT));
+			GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0, !(GMS.gob->mode & OB_MODE_TEXTURE_PAINT), GMS.gviewmat, GMS.gviewinv);
 
 			auto_bump_scale = GMS.gob->derivedFinal != NULL ? GMS.gob->derivedFinal->auto_bump_scale : 1.0f;
-			GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gviewmat, GMS.gviewinv, GMS.gob->col, auto_bump_scale);
+			GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gob->col, auto_bump_scale);
 			GMS.gboundmat= mat;
 
 			/* for glsl use alpha blend mode, unless it's set to solid and

Modified: trunk/blender/source/blender/gpu/intern/gpu_material.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_material.c	2013-04-04 02:05:11 UTC (rev 55766)
+++ trunk/blender/source/blender/gpu/intern/gpu_material.c	2013-04-04 03:55:43 UTC (rev 55767)
@@ -257,11 +257,12 @@
 	BLI_freelistN(&ma->gpumaterial);
 }
 
-void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap)
+void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap, float viewmat[4][4], float viewinv[4][4])
 {
 	if (material->pass) {
 		LinkData *nlink;
 		GPULamp *lamp;
+		GPUShader *shader = GPU_pass_shader(material->pass);
 
 		/* handle layer lamps */
 		for (nlink=material->lamps.first; nlink; nlink=nlink->next) {
@@ -275,29 +276,52 @@
 				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_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_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);
+			}
 		}
 
+		/* handle per material built-ins */
+		if (material->builtins & GPU_VIEW_MATRIX) {
+			GPU_shader_uniform_vector(shader, material->viewmatloc, 16, 1, (float*)viewmat);
+		}
+		if (material->builtins & GPU_INVERSE_VIEW_MATRIX) {
+			GPU_shader_uniform_vector(shader, material->invviewmatloc, 16, 1, (float*)viewinv);
+		}
+
 		GPU_pass_bind(material->pass, time, mipmap);
 		GPU_pass_update_uniforms(material->pass);
+
 		material->bound = 1;
 	}
 }
 
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], float viewmat[4][4], float viewinv[4][4], float obcol[4], float autobumpscale)
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], float obcol[4], float autobumpscale)
 {
 	if (material->pass) {
 		GPUShader *shader = GPU_pass_shader(material->pass);
-		LinkData *nlink;
-		GPULamp *lamp;
 		float invmat[4][4], col[4];
 
-		/* handle builtins */
-		if (material->builtins & GPU_VIEW_MATRIX) {
-			GPU_shader_uniform_vector(shader, material->viewmatloc, 16, 1, (float*)viewmat);
-		}
-		if (material->builtins & GPU_INVERSE_VIEW_MATRIX) {
-			GPU_shader_uniform_vector(shader, material->invviewmatloc, 16, 1, (float*)viewinv);
-		}
+		/* handle per object builtins */
 		if (material->builtins & GPU_OBJECT_MATRIX) {
 			GPU_shader_uniform_vector(shader, material->obmatloc, 16, 1, (float*)obmat);
 		}
@@ -313,32 +337,6 @@
 		if (material->builtins & GPU_AUTO_BUMPSCALE) {
 			GPU_shader_uniform_vector(shader, material->obautobumpscaleloc, 1, 1, &autobumpscale);
 		}
-		/* update lamps */
-		for (nlink=material->lamps.first; nlink; nlink=nlink->next) {
-			lamp= nlink->data;
-
-			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_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);
-			}
-		}
 	}
 }
 

Modified: trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp	2013-04-04 02:05:11 UTC (rev 55766)
+++ trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp	2013-04-04 03:55:43 UTC (rev 55767)
@@ -46,11 +46,20 @@
 	mGPUMat = (mMat) ? GPU_material_from_blender(mBlenderScene, mMat) : NULL;
 }
 
-void BL_BlenderShader::SetProg(bool enable, double time)
+void BL_BlenderShader::SetProg(bool enable, double time, RAS_IRasterizer* rasty)
 {
 	if (VerifyShader()) {
-		if (enable)
-			GPU_material_bind(mGPUMat, mLightLayer, mBlenderScene->lay, time, 1);
+		if (enable) {
+			assert(rasty != NULL); // XXX Kinda hacky, but SetProg() should always have the rasterizer if enable is true
+
+			float viewmat[4][4], viewinvmat[4][4];
+			const MT_Matrix4x4& view = rasty->GetViewMatrix();
+			const MT_Matrix4x4& viewinv = rasty->GetViewInvMatrix();
+			view.getValue((float*)viewmat);
+			viewinv.getValue((float*)viewinvmat);
+
+			GPU_material_bind(mGPUMat, mLightLayer, mBlenderScene->lay, time, 1, viewmat, viewinvmat);
+		}
 		else
 			GPU_material_unbind(mGPUMat);
 	}
@@ -120,7 +129,7 @@
 
 void BL_BlenderShader::Update(const RAS_MeshSlot & ms, RAS_IRasterizer* rasty )
 {
-	float obmat[4][4], viewmat[4][4], viewinvmat[4][4], obcol[4];
+	float obmat[4][4], obcol[4];
 	GPUMaterial *gpumat;
 
 	gpumat = mGPUMat;
@@ -130,13 +139,9 @@
 
 	MT_Matrix4x4 model;
 	model.setValue(ms.m_OpenGLMatrix);
-	const MT_Matrix4x4& view = rasty->GetViewMatrix();
-	const MT_Matrix4x4& viewinv = rasty->GetViewInvMatrix();
 
 	// note: getValue gives back column major as needed by OpenGL
 	model.getValue((float*)obmat);
-	view.getValue((float*)viewmat);
-	viewinv.getValue((float*)viewinvmat);
 
 	if (ms.m_bObjectColor)
 		ms.m_RGBAcolor.getValue((float *)obcol);
@@ -144,7 +149,7 @@
 		obcol[0] = obcol[1] = obcol[2] = obcol[3] = 1.0f;
 
 	float auto_bump_scale = ms.m_pDerivedMesh!=0 ? ms.m_pDerivedMesh->auto_bump_scale : 1.0f;
-	GPU_material_bind_uniforms(gpumat, obmat, viewmat, viewinvmat, obcol, auto_bump_scale);
+	GPU_material_bind_uniforms(gpumat, obmat, obcol, auto_bump_scale);
 
 	mAlphaBlend = GPU_material_alpha_blend(gpumat, obcol);
 }

Modified: trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.h	2013-04-04 02:05:11 UTC (rev 55766)
+++ trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.h	2013-04-04 03:55:43 UTC (rev 55767)
@@ -78,7 +78,7 @@
 		// same as VerifyShared
 		return (NULL != mGPUMat);
 	}
-	void				SetProg(bool enable, double time=0.0);
+	void				SetProg(bool enable, double time=0.0, RAS_IRasterizer* rasty=NULL);
 
 	int GetAttribNum();
 	void SetAttribs(class RAS_IRasterizer* ras, const BL_Material *mat);

Modified: trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2013-04-04 02:05:11 UTC (rev 55766)
+++ trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2013-04-04 03:55:43 UTC (rev 55767)
@@ -314,7 +314,7 @@
 		else
 			BL_Texture::DisableAllTextures();
 
-		mBlenderShader->SetProg(true, ras->GetTime());
+		mBlenderShader->SetProg(true, ras->GetTime(), ras);
 		mLastBlenderShader= mBlenderShader;
 	}
 }




More information about the Bf-blender-cvs mailing list