[Bf-blender-cvs] [524948b] cycles_tricks: Cycles: Add an option to make object only use direct light

Sergey Sharybin noreply at git.blender.org
Fri Jun 12 15:15:49 CEST 2015


Commit: 524948bde3ca73afdb9c182026a2f550f9ee457b
Author: Sergey Sharybin
Date:   Fri Jun 12 14:44:35 2015 +0200
Branches: cycles_tricks
https://developer.blender.org/rB524948bde3ca73afdb9c182026a2f550f9ee457b

Cycles: Add an option to make object only use direct light

This is a performance trick which could be used for objects which are rather
complex (like grass field) but are out of focus or heavily blurred. For such
objects it does not make sense to do huge number of ray bounces because this
wouldn't give any more details to the result.

Objects might become a bit darker with this option enabled (similar to cases
when number of bounces is limited on scene level), but this is possible to
compensate with material and light settings.

Currently only supported by regular path tracing in megakernel. Before making
it something more widely supported we'd better see what's the best way to
perform such an early ray terminations, how to control them from the UI and
stuff like that.

This seems to give like up to 10% speedup with 01_03_01_B. But need to double
there's no measurable regressions with this feature disabled prior to merge
it to gooseberry branch/

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

M	intern/cycles/blender/addon/properties.py
M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_object.cpp
M	intern/cycles/kernel/kernel_path_state.h
M	intern/cycles/kernel/kernel_path_surface.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/object.cpp
M	intern/cycles/render/object.h

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

diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 16a807b..e06c64d 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -890,6 +890,12 @@ class CyclesObjectBlurSettings(bpy.types.PropertyGroup):
                 default=1,
                 )
 
+        cls.use_direct_light_only = BoolProperty(
+                name="Direct Light Only",
+                description="Use only direct light for this object",
+                default=False,
+                )
+
     @classmethod
     def unregister(cls):
         del bpy.types.Object.cycles
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index caf7be9..bfc93b0 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -718,6 +718,11 @@ class CyclesObject_PT_cycles_settings(CyclesButtonsPanel, Panel):
         if ob.type != 'LAMP':
             flow.prop(visibility, "shadow")
 
+            if not use_branched_path(context):
+                layout.label(text="Performance:")
+                flow = layout.column_flow()
+                flow.prop(cob, "use_direct_light_only")
+
 
 class CYCLES_OT_use_shading_nodes(Operator):
     """Enable nodes on a material, world or lamp"""
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index 1e17d30..10a451b 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -327,6 +327,18 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
 		object_updated = true;
 	}
 
+	bool use_direct_light_only = false;
+	PointerRNA cobject = RNA_pointer_get(&b_ob.ptr, "cycles");
+	use_direct_light_only = get_boolean(cobject, "use_direct_light_only");
+	if(b_parent.ptr.data != b_ob.ptr.data) {
+		PointerRNA parent_cobject = RNA_pointer_get(&b_parent.ptr, "cycles");
+		use_direct_light_only |= get_boolean(parent_cobject, "use_direct_light_only");
+	}
+	if(use_direct_light_only != object->use_direct_light_only) {
+		object->use_direct_light_only = use_direct_light_only;
+		object_updated = true;
+	}
+
 	/* object sync
 	 * transform comparison should not be needed, but duplis don't work perfect
 	 * in the depsgraph and may not signal changes, so this is a workaround */
diff --git a/intern/cycles/kernel/kernel_path_state.h b/intern/cycles/kernel/kernel_path_state.h
index 15efb23..c503251 100644
--- a/intern/cycles/kernel/kernel_path_state.h
+++ b/intern/cycles/kernel/kernel_path_state.h
@@ -140,6 +140,9 @@ ccl_device_inline uint path_state_ray_visibility(KernelGlobals *kg, PathState *s
 
 ccl_device_inline float path_state_terminate_probability(KernelGlobals *kg, ccl_addr_space PathState *state, const float3 throughput)
 {
+	if(state->flag & PATH_RAY_TERMINATE) {
+		return 0.0f;
+	}
 	if(state->flag & PATH_RAY_TRANSPARENT) {
 		/* transparent rays treated separately */
 		if(state->transparent_bounce >= kernel_data.integrator.transparent_max_bounce)
diff --git a/intern/cycles/kernel/kernel_path_surface.h b/intern/cycles/kernel/kernel_path_surface.h
index fe85a6b..53246f7 100644
--- a/intern/cycles/kernel/kernel_path_surface.h
+++ b/intern/cycles/kernel/kernel_path_surface.h
@@ -274,6 +274,9 @@ ccl_device_inline bool kernel_path_surface_bounce(KernelGlobals *kg, ccl_addr_sp
 		if(label & LABEL_TRANSMIT)
 			kernel_volume_stack_enter_exit(kg, sd, state->volume_stack);
 #endif
+		if(ccl_fetch(sd, flag) & SD_OBJECT_DIRECT_LIGHT_ONLY) {
+			state->flag |= PATH_RAY_TERMINATE;
+		}
 		return true;
 	}
 #ifdef __VOLUME__
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 2a70bfc..b5f2fd8 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -289,6 +289,7 @@ enum PathRayFlag {
 	PATH_RAY_MIS_SKIP = 2048,
 	PATH_RAY_DIFFUSE_ANCESTOR = 4096,
 	PATH_RAY_SINGLE_PASS_DONE = 8192,
+	PATH_RAY_TERMINATE = 16384,
 
 	/* we need layer member flags to be the 20 upper bits */
 	PATH_RAY_LAYER_SHIFT = (32-20)
@@ -671,10 +672,11 @@ enum ShaderDataFlag {
 	SD_OBJECT_HAS_VOLUME        = (1 << 24),  /* object has a volume shader */
 	SD_OBJECT_INTERSECTS_VOLUME = (1 << 25),  /* object intersects AABB of an object with volume shader */
 	SD_OBJECT_HAS_VERTEX_MOTION = (1 << 26),  /* has position for motion vertices */
+	SD_OBJECT_DIRECT_LIGHT_ONLY = (1 << 27),
 
 	SD_OBJECT_FLAGS = (SD_HOLDOUT_MASK|SD_OBJECT_MOTION|SD_TRANSFORM_APPLIED|
 	                   SD_NEGATIVE_SCALE_APPLIED|SD_OBJECT_HAS_VOLUME|
-	                   SD_OBJECT_INTERSECTS_VOLUME)
+	                   SD_OBJECT_INTERSECTS_VOLUME|SD_OBJECT_DIRECT_LIGHT_ONLY)
 };
 
 struct KernelGlobals;
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index ae72d72..fa2baa0 100644
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@ -49,6 +49,7 @@ Object::Object()
 	motion.post = transform_identity();
 	use_motion = false;
 	use_holdout = false;
+	use_direct_light_only = false;
 	dupli_generated = make_float3(0.0f, 0.0f, 0.0f);
 	dupli_uv = make_float2(0.0f, 0.0f);
 }
@@ -358,6 +359,8 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene
 		/* object flag */
 		if(ob->use_holdout)
 			flag |= SD_HOLDOUT_MASK;
+		if(ob->use_direct_light_only)
+			flag |= SD_OBJECT_DIRECT_LIGHT_ONLY;
 		object_flag[i] = flag;
 
 		/* have curves */
diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h
index 379d174..7d51b73 100644
--- a/intern/cycles/render/object.h
+++ b/intern/cycles/render/object.h
@@ -47,6 +47,7 @@ public:
 	MotionTransform motion;
 	bool use_motion;
 	bool use_holdout;
+	bool use_direct_light_only;
 
 	float3 dupli_generated;
 	float2 dupli_uv;




More information about the Bf-blender-cvs mailing list