[Bf-blender-cvs] [09d3af546a5] cycles_embree: Cycles: improvements to hair rendering using embree

Stefan Werner noreply at git.blender.org
Sun Nov 26 23:11:15 CET 2017


Commit: 09d3af546a5b74bd88f1e3115bd4e448ae87eda6
Author: Stefan Werner
Date:   Fri Jun 9 19:39:43 2017 +0200
Branches: cycles_embree
https://developer.blender.org/rB09d3af546a5b74bd88f1e3115bd4e448ae87eda6

Cycles: improvements to hair rendering using embree

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

M	intern/cycles/bvh/bvh_embree.cpp
M	intern/cycles/kernel/bvh/bvh_embree_traversal.h

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

diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 1eda3ef9647..a2466722e66 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -79,8 +79,8 @@ void rtc_filter_func(void* userDataPtr, RTCRay& ray_)
 		return;
 	}
 	else if(ray.type == CCLRay::RAY_SSS) {
-		/* only accept hits from the same object */
-		if(ray.instID/2 != ray.sss_object_id) {
+		/* only accept hits from the same object and triangles */
+		if(ray.instID/2 != ray.sss_object_id || ray.geomID & 1) {
 			/* this tells embree to continue tracing */
 			ray.geomID = RTC_INVALID_GEOMETRY_ID;
 			return;
@@ -339,7 +339,7 @@ unsigned BVHEmbree::add_instance(Object *ob, int i)
 		rtcSetTransform2(scene, geom_id, RTC_MATRIX_ROW_MAJOR, (const float*)&ob->tfm);
 	}
 
-	rtcSetUserData(scene, geom_id, (void*)0);
+	rtcSetUserData(scene, geom_id, (void*)instance_bvh->scene);
 	rtcSetMask(scene, geom_id, ob->visibility);
 
 	pack.prim_index.push_back_slow(-1);
@@ -429,6 +429,9 @@ unsigned BVHEmbree::add_triangles(Mesh *mesh, int i)
 	return geom_id;
 }
 
+/* this should eventually come from render settings. */
+//#define HAIR_CURVES
+
 unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 {
 	const Attribute *attr_mP = NULL;
@@ -455,7 +458,7 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 	pack.prim_index.reserve(pack.prim_index.size() + num_segments);
 	pack.prim_tri_index.reserve(pack.prim_index.size() + num_segments);
 
-#if 0 /* line segments */
+#ifndef HAIR_CURVES /* line segments */
 	unsigned geom_id = rtcNewLineSegments2(scene,
 												 RTC_GEOMETRY_STATIC,
 												 num_segments,
@@ -493,7 +496,7 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 												 i*2+1);
 
 
-	/* Split the Cycles curves into embree line segments, each with 2 CVs */
+	/* Split the Cycles curves into embree hair segments, each with 4 CVs */
 	void* raw_buffer = rtcMapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
 	unsigned *rtc_indices = (unsigned*) raw_buffer;
 	size_t rtc_index = 0;
@@ -533,11 +536,13 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 #endif
 			raw_buffer = rtcMapBuffer(scene, geom_id, buffer_type);
 			float *rtc_verts = (float*) raw_buffer;
+#ifdef HAIR_CURVES
 			rtc_verts[0] = verts[0].x;
 			rtc_verts[1] = verts[0].y;
 			rtc_verts[2] = verts[0].z;
 			rtc_verts[3] = curve_radius[0];
 			rtc_verts += 4;
+#endif
 			for(size_t j = 0; j < num_keys; j++) {
 				rtc_verts[0] = verts[j].x;
 				rtc_verts[1] = verts[j].y;
@@ -545,10 +550,12 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 				rtc_verts[3] = curve_radius[j];
 				rtc_verts += 4;
 			}
+#ifdef HAIR_CURVES
 			rtc_verts[0] = verts[num_keys-1].x;
 			rtc_verts[1] = verts[num_keys-1].y;
 			rtc_verts[2] = verts[num_keys-1].z;
 			rtc_verts[3] = curve_radius[num_keys-1];
+#endif
 			rtcUnmapBuffer(scene, geom_id, buffer_type);
 		}
 	}
diff --git a/intern/cycles/kernel/bvh/bvh_embree_traversal.h b/intern/cycles/kernel/bvh/bvh_embree_traversal.h
index 17942e08154..8c6d780deba 100644
--- a/intern/cycles/kernel/bvh/bvh_embree_traversal.h
+++ b/intern/cycles/kernel/bvh/bvh_embree_traversal.h
@@ -66,15 +66,18 @@ struct RTCORE_ALIGN(16) CCLRay : public RTCRay {
 
 	void isect_to_ccl(ccl::Intersection *isect)
 	{
+		const bool is_hair = geomID & 1;
 		isect->u = 1.0f - v - u;
 		isect->v = u;
-		if(geomID & 1) {
-			isect->v = 0.0f;// hair
+		if(is_hair) {
+		//	isect->v = 0.0f;// hair
 		}
 		isect->t = tfar;
 		if(instID != RTC_INVALID_GEOMETRY_ID) {
+			RTCScene inst_scene = (RTCScene)rtcGetUserData(kernel_data.bvh.scene, instID);
+			isect->prim = primID + (intptr_t)rtcGetUserData(inst_scene, geomID) + kernel_tex_fetch(__object_node, instID/2);
 			//				isect->prim = rtc_ray.primID + (intptr_t)rtcGetUserData(kernel_data.bvh.scene, rtc_ray.geomID);
-			isect->prim = primID + kernel_tex_fetch(__object_node, instID/2);
+			//isect->prim = primID + kernel_tex_fetch(__object_node, instID/2);
 			isect->object = instID/2;
 		} else {
 			isect->prim = primID + (intptr_t)rtcGetUserData(kernel_data.bvh.scene, geomID);



More information about the Bf-blender-cvs mailing list