[Bf-blender-cvs] [61e58c3] master: Fix T41784, Re-enabling transparent shadows in Cycles doesn't work correctly

Thomas Dinges noreply at git.blender.org
Thu Sep 11 14:52:17 CEST 2014


Commit: 61e58c378a4676dea439f12851512ea9282e5d68
Author: Thomas Dinges
Date:   Thu Sep 11 14:50:31 2014 +0200
Branches: master
https://developer.blender.org/rB61e58c378a4676dea439f12851512ea9282e5d68

Fix T41784, Re-enabling transparent shadows in Cycles doesn't work correctly

===================================================================

M	intern/cycles/render/integrator.cpp
M	intern/cycles/render/shader.cpp

===================================================================

diff --git a/intern/cycles/render/integrator.cpp b/intern/cycles/render/integrator.cpp
index b7a87ac..ec2960d 100644
--- a/intern/cycles/render/integrator.cpp
+++ b/intern/cycles/render/integrator.cpp
@@ -92,11 +92,20 @@ void Integrator::device_update(Device *device, DeviceScene *dscene, Scene *scene
 	kintegrator->transparent_max_bounce = transparent_max_bounce + 1;
 	kintegrator->transparent_min_bounce = transparent_min_bounce + 1;
 
-	/* At this point kintegrator->transparent_shadows is set automatically
-	 * based on whether shaders use transparent shadows (see shader.cpp).
-	 * If user doesn't want transparent shadows, force them off. */
-	if(!transparent_shadows)
+	/* Transparent Shadows
+	 * We only need to enable transparent shadows, if we actually have 
+	 * transparent shaders in the scene. Otherwise we can disable it
+	 * to improve performance a bit. */
+	if(transparent_shadows) {
+		foreach(Shader *shader, scene->shaders) {
+			/* keep this in sync with SD_HAS_TRANSPARENT_SHADOW in shader.cpp */
+			if((shader->has_surface_transparent && shader->use_transparent_shadow) || shader->has_volume)
+				kintegrator->transparent_shadows = true;
+		}
+	}
+	else {
 		kintegrator->transparent_shadows = false;
+	}
 
 	kintegrator->volume_max_steps = volume_max_steps;
 	kintegrator->volume_step_size = volume_step_size;
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 9279186..d76e511 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -325,7 +325,6 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc
 	uint i = 0;
 	bool has_converter_blackbody = false;
 	bool has_volumes = false;
-	bool has_transparent_shadows = false;
 
 	foreach(Shader *shader, scene->shaders) {
 		uint flag = 0;
@@ -368,10 +367,6 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc
 
 		shader_flag[i++] = flag;
 		shader_flag[i++] = shader->pass_id;
-		
-		/* Check if we need transparent shadows */
-		if(flag & SD_HAS_TRANSPARENT_SHADOW)
-			has_transparent_shadows = true;
 	}
 
 	device->tex_alloc("__shader_flag", dscene->shader_flag);
@@ -402,7 +397,6 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc
 	/* integrator */
 	KernelIntegrator *kintegrator = &dscene->data.integrator;
 	kintegrator->use_volumes = has_volumes;
-	kintegrator->transparent_shadows = has_transparent_shadows;
 }
 
 void ShaderManager::device_free_common(Device *device, DeviceScene *dscene, Scene *scene)




More information about the Bf-blender-cvs mailing list