Commit: 97d4e3f0e739423c542cd33d2a5de2ede32623b9 Author: Stefan Werner Date: Tue Aug 14 14:51:12 2018 +0200 Branches: cycles_embree https://developer.blender.org/rB97d4e3f0e739423c542cd33d2a5de2ede32623b9
Cycles: Fixes for transparent shadows and SSS when using Embree. =================================================================== M intern/cycles/bvh/bvh_embree.cpp M intern/cycles/kernel/bvh/bvh.h =================================================================== diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp index 75f69f67363..415f2e56559 100644 --- a/intern/cycles/bvh/bvh_embree.cpp +++ b/intern/cycles/bvh/bvh_embree.cpp @@ -59,7 +59,7 @@ void rtc_filter_func(const RTCFilterFunctionNArguments* args) && !(kernel_data.curve.curveflags & CURVE_KN_BACKFACING) && !(kernel_data.curve.curveflags & CURVE_KN_RIBBONS) && hit->geomID & 1) { if(dot(make_float3(ray->dir_x, ray->dir_y, ray->dir_z), make_float3(hit->Ng_x, hit->Ng_y, hit->Ng_z)) > 0.0f) { - hit->geomID = RTC_INVALID_GEOMETRY_ID; + *args->valid = 0; return; } } @@ -70,9 +70,20 @@ void rtc_filter_func(const RTCFilterFunctionNArguments* args) else if(ctx->type == CCLIntersectContext::RAY_SHADOW_ALL) { /* Append the intersection to the end of the array. */ if(ctx->num_hits < ctx->max_hits) { + Intersection current_isect; + kernel_embree_convert_hit(kg, ray, hit, ¤t_isect); + for(size_t i = 0; i < ctx->max_hits; ++i) { + if(current_isect.object == ctx->isect_s[i].object && + current_isect.prim == ctx->isect_s[i].prim && + current_isect.t == ctx->isect_s[i].t) { + /* This intersection was already recorded, skip it. */ + *args->valid = 0; + return; + } + } Intersection *isect = &ctx->isect_s[ctx->num_hits]; ctx->num_hits++; - kernel_embree_convert_hit(kg, ray, hit, isect); + *isect = current_isect; int prim = kernel_tex_fetch(__prim_index, isect->prim); int shader = 0; if(kernel_tex_fetch(__prim_type, isect->prim) & PRIMITIVE_ALL_TRIANGLE) { @@ -86,10 +97,7 @@ void rtc_filter_func(const RTCFilterFunctionNArguments* args) /* If no transparent shadows, all light is blocked. */ if(flag & (SD_HAS_TRANSPARENT_SHADOW)) { /* This tells Embree to continue tracing. */ - hit->geomID = RTC_INVALID_GEOMETRY_ID; - } - else { - ctx->num_hits = ctx->max_hits+1; + *args->valid = 0; } } else { @@ -101,13 +109,13 @@ void rtc_filter_func(const RTCFilterFunctionNArguments* args) } else if(ctx->type == CCLIntersectContext::RAY_SSS) { /* No intersection information requested, just return a hit. */ - if(ctx->ss_isect->num_hits == 0) { + if(ctx->max_hits == 0) { return; } /* Only accept hits from the same object and triangles. */ if(hit->instID[0]/2 != ctx->sss_object_id || hit->geomID & 1) { /* This tells Embree to continue tracing. */ - hit->geomID = RTC_INVALID_GEOMETRY_ID; + *args->valid = 0; return; } @@ -115,7 +123,7 @@ void rtc_filter_func(const RTCFilterFunctionNArguments* args) for(int i = min(ctx->max_hits, ctx->ss_isect->num_hits) - 1; i >= 0; --i) { if(ctx->ss_isect->hits[i].t == ray->tfar) { /* This tells Embree to continue tracing. */ - hit->geomID = RTC_INVALID_GEOMETRY_ID; + *args->valid = 0; return; } } @@ -133,7 +141,7 @@ void rtc_filter_func(const RTCFilterFunctionNArguments* args) if(hit_idx >= ctx->max_hits) { /* This tells Embree to continue tracing. */ - hit->geomID = RTC_INVALID_GEOMETRY_ID; + *args->valid = 0; return; } } @@ -144,15 +152,26 @@ void rtc_filter_func(const RTCFilterFunctionNArguments* args) ctx->ss_isect->Ng[hit_idx].z = hit->Ng_z; ctx->ss_isect->Ng[hit_idx] = normalize(ctx->ss_isect->Ng[hit_idx]); /* this tells Embree to continue tracing */ - hit->geomID = RTC_INVALID_GEOMETRY_ID; + *args->valid = 0; return; } else if(ctx->type == CCLIntersectContext::RAY_VOLUME_ALL) { /* Append the intersection to the end of the array. */ if(ctx->num_hits < ctx->max_hits) { + Intersection current_isect; + kernel_embree_convert_hit(kg, ray, hit, ¤t_isect); + for(size_t i = 0; i < ctx->max_hits; ++i) { + if(current_isect.object == ctx->isect_s[i].object && + current_isect.prim == ctx->isect_s[i].prim && + current_isect.t == ctx->isect_s[i].t) { + /* This intersection was already recorded, skip it. */ + *args->valid = 0; + return; + } + } Intersection *isect = &ctx->isect_s[ctx->num_hits]; ctx->num_hits++; - kernel_embree_convert_hit(kg, ray, hit, isect); + *isect = current_isect; /* Only primitives from volume object. */ uint tri_object = (isect->object == OBJECT_NONE) ?kernel_tex_fetch(__prim_object, isect->prim) : isect->object; int object_flag = kernel_tex_fetch(__object_flag, tri_object); @@ -160,7 +179,7 @@ void rtc_filter_func(const RTCFilterFunctionNArguments* args) ctx->num_hits--; } /* This tells Embree to continue tracing. */ - hit->geomID = RTC_INVALID_GEOMETRY_ID; + *args->valid = 0; return; } return; diff --git a/intern/cycles/kernel/bvh/bvh.h b/intern/cycles/kernel/bvh/bvh.h index 54865062a84..14e791d2239 100644 --- a/intern/cycles/kernel/bvh/bvh.h +++ b/intern/cycles/kernel/bvh/bvh.h @@ -242,7 +242,7 @@ ccl_device_intersect bool scene_intersect_local(KernelGlobals *kg, kernel_embree_setup_ray(ray, rtc_ray, PATH_RAY_ALL_VISIBILITY); rtcOccluded1(kernel_data.bvh.scene, &rtc_ctx.context, &rtc_ray); - return rtc_ray.tfar < 0.0f; + return local_isect->num_hits > 0; } #endif /* __EMBREE__ */ #ifdef __OBJECT_MOTION__ @@ -286,12 +286,8 @@ ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg, if(ctx.num_hits > max_hits) { return true; } - if(ctx.num_hits > 0) { - *num_hits = ctx.num_hits; - return (rtc_ray.tfar < 0.0f); - } - *num_hits = 0; - return false; + *num_hits = ctx.num_hits; + return rtc_ray.tfar == -INFINITY; } #endif # ifdef __OBJECT_MOTION__ @@ -391,7 +387,7 @@ ccl_device_intersect uint scene_intersect_volume_all(KernelGlobals *kg, RTCRay rtc_ray; kernel_embree_setup_ray(*ray, rtc_ray, visibility); rtcOccluded1(kernel_data.bvh.scene, &rtc_ctx.context, &rtc_ray); - return rtc_ray.tfar < 0.0f; + return rtc_ray.tfar == -INFINITY; } #endif # ifdef __OBJECT_MOTION__ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs