[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