[Bf-blender-cvs] [e360080] master: Cycles: Refactor the way how we exclude light from the device

Sergey Sharybin noreply at git.blender.org
Sat Feb 6 22:27:38 CET 2016


Commit: e360080a04e0615eb036612834b6ddcd1816365d
Author: Sergey Sharybin
Date:   Sun Feb 7 02:21:38 2016 +0500
Branches: master
https://developer.blender.org/rBe360080a04e0615eb036612834b6ddcd1816365d

Cycles: Refactor the way how we exclude light from the device

This unifies things around ignoring light due to lack of scene
contribution or due to other optimization tricks.

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

M	intern/cycles/render/light.cpp
M	intern/cycles/render/light.h

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

diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index fafc66a..8bb5fec 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -131,6 +131,7 @@ Light::Light()
 	max_bounces = 1024;
 
 	is_portal = false;
+	is_enabled = true;
 }
 
 void Light::tag_update(Scene *scene)
@@ -161,32 +162,36 @@ LightManager::~LightManager()
 {
 }
 
-bool LightManager::skip_background_light(Device *device, Scene *scene)
+void LightManager::disable_ineffective_light(Device *device, Scene *scene)
 {
-	/* Check whether we've got portals. */
-	bool has_portal = false;
-	foreach(Light *light, scene->lights) {
-		if(light->is_portal) {
-			has_portal = true;
-			break;
-		}
-	}
-	/* Ignore background light if:
-	 * - If unsupported on a device
-	 * - If we don't need it (no HDRs etc.)
+	/* Make all lights enabled by default, and perform some preliminary checks
+	 * needed for finer-tuning of settings (for example, check whether we've
+	 * got portals or not).
 	 */
+	bool has_portal = false, has_background = false;
 	foreach(Light *light, scene->lights) {
-		if(light->type == LIGHT_BACKGROUND) {
-			Shader *shader = scene->shaders[scene->background->shader];
-			bool auto_disable_mis = (!has_portal && !shader->has_surface_spatial_varying);
-			if(!(device->info.advanced_shading) || auto_disable_mis) {
-				VLOG(1) << "Background MIS has been disabled.\n";
-				return true;
+		light->is_enabled = light->has_contribution(scene);
+		has_portal |= light->is_portal;
+		has_background |= light->type == LIGHT_BACKGROUND;
+	}
+
+	if(has_background) {
+		/* Ignore background light if:
+		 * - If unsupported on a device
+		 * - If we don't need it (no HDRs etc.)
+		 */
+		Shader *shader = scene->shaders[scene->background->shader];
+		bool disable_mis = !(has_portal || shader->has_surface_spatial_varying) ||
+		                   !(device->info.advanced_shading);
+		if(disable_mis) {
+			VLOG(1) << "Background MIS has been disabled.\n";
+			foreach(Light *light, scene->lights) {
+				if(light->type == LIGHT_BACKGROUND) {
+					light->is_enabled = false;
+				}
 			}
-			break;
 		}
 	}
-	return false;
 }
 
 void LightManager::device_update_distribution(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
@@ -491,24 +496,21 @@ static void background_cdf(int start,
 void LightManager::device_update_background(Device *device,
                                             DeviceScene *dscene,
                                             Scene *scene,
-                                            Progress& progress,
-                                            bool skip_background)
+                                            Progress& progress)
 {
 	KernelIntegrator *kintegrator = &dscene->data.integrator;
 	Light *background_light = NULL;
 
 	/* find background light */
-	if(!skip_background) {
-		foreach(Light *light, scene->lights) {
-			if(light->type == LIGHT_BACKGROUND) {
-				background_light = light;
-				break;
-			}
+	foreach(Light *light, scene->lights) {
+		if(light->type == LIGHT_BACKGROUND) {
+			background_light = light;
+			break;
 		}
 	}
 
 	/* no background light found, signal renderer to skip sampling */
-	if(!background_light) {
+	if(!background_light || !background_light->is_enabled) {
 		kintegrator->pdf_background_res = 0;
 		return;
 	}
@@ -587,8 +589,7 @@ void LightManager::device_update_background(Device *device,
 
 void LightManager::device_update_points(Device *device,
                                         DeviceScene *dscene,
-                                        Scene *scene,
-                                        bool skip_background)
+                                        Scene *scene)
 {
 	int num_scene_lights = scene->lights.size();
 	if(num_scene_lights == 0)
@@ -598,7 +599,7 @@ void LightManager::device_update_points(Device *device,
 	int light_index = 0;
 
 	foreach(Light *light, scene->lights) {
-		if(!light->has_contribution(scene)) {
+		if(!light->is_enabled) {
 			continue;
 		}
 
@@ -664,10 +665,6 @@ void LightManager::device_update_points(Device *device,
 			light_data[light_index*LIGHT_SIZE + 4] = make_float4(max_bounces, 0.0f, 0.0f, 0.0f);
 		}
 		else if(light->type == LIGHT_BACKGROUND) {
-			if(skip_background) {
-				continue;
-			}
-
 			uint visibility = scene->background->visibility;
 
 			shader_id &= ~SHADER_AREA_LIGHT;
@@ -782,15 +779,16 @@ void LightManager::device_update(Device *device, DeviceScene *dscene, Scene *sce
 	device_free(device, dscene);
 
 	use_light_visibility = false;
-	bool skip_background = skip_background_light(device, scene);
 
-	device_update_points(device, dscene, scene, skip_background);
+	disable_ineffective_light(device, scene);
+
+	device_update_points(device, dscene, scene);
 	if(progress.get_cancel()) return;
 
 	device_update_distribution(device, dscene, scene, progress);
 	if(progress.get_cancel()) return;
 
-	device_update_background(device, dscene, scene, progress, skip_background);
+	device_update_background(device, dscene, scene, progress);
 	if(progress.get_cancel()) return;
 
 	if(use_light_visibility != scene->film->use_light_visibility) {
diff --git a/intern/cycles/render/light.h b/intern/cycles/render/light.h
index bba03e3..15038d0 100644
--- a/intern/cycles/render/light.h
+++ b/intern/cycles/render/light.h
@@ -57,6 +57,7 @@ public:
 	bool use_scatter;
 
 	bool is_portal;
+	bool is_enabled;
 
 	int shader;
 	int samples;
@@ -76,24 +77,32 @@ public:
 	LightManager();
 	~LightManager();
 
-	void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+	void device_update(Device *device,
+	                   DeviceScene *dscene,
+	                   Scene *scene,
+	                   Progress& progress);
 	void device_free(Device *device, DeviceScene *dscene);
 
 	void tag_update(Scene *scene);
 
 protected:
-	bool skip_background_light(Device *device, Scene *scene);
+	/* Optimization: disable light which is either unsupported or
+	 * which doesn't contribute to the scene or which is only used for MIS
+	 * and scene doesn't need MIS.
+	 */
+	void disable_ineffective_light(Device *device, Scene *scene);
 
 	void device_update_points(Device *device,
 	                          DeviceScene *dscene,
-	                          Scene *scene,
-	                          bool skip_background);
-	void device_update_distribution(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+	                          Scene *scene);
+	void device_update_distribution(Device *device,
+	                                DeviceScene *dscene,
+	                                Scene *scene,
+	                                Progress& progress);
 	void device_update_background(Device *device,
 	                              DeviceScene *dscene,
 	                              Scene *scene,
-	                              Progress& progress,
-	                              bool skip_background);
+	                              Progress& progress);
 };
 
 CCL_NAMESPACE_END




More information about the Bf-blender-cvs mailing list