[Bf-blender-cvs] [c553041b817] cycles_texture_cache: Cycles: Added texture differentials to mesh light sampling. Currently based on purely specular reflection, can probably be wider than that.
Stefan Werner
noreply at git.blender.org
Mon Nov 27 20:40:27 CET 2017
Commit: c553041b817a9f6ac8121e17ab30193f02f3e870
Author: Stefan Werner
Date: Mon May 15 19:48:01 2017 +0200
Branches: cycles_texture_cache
https://developer.blender.org/rBc553041b817a9f6ac8121e17ab30193f02f3e870
Cycles: Added texture differentials to mesh light sampling. Currently based on purely specular reflection, can probably be wider than that.
===================================================================
M intern/cycles/kernel/kernel_bake.h
M intern/cycles/kernel/kernel_differential.h
M intern/cycles/kernel/kernel_emission.h
M intern/cycles/kernel/kernel_shader.h
M intern/cycles/kernel/svm/svm.h
M intern/cycles/kernel/svm/svm_image.h
===================================================================
diff --git a/intern/cycles/kernel/kernel_bake.h b/intern/cycles/kernel/kernel_bake.h
index 8788e89c40e..f8b625b3cdb 100644
--- a/intern/cycles/kernel/kernel_bake.h
+++ b/intern/cycles/kernel/kernel_bake.h
@@ -301,7 +301,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
PathRadiance L;
shader_setup_from_sample(kg, &sd,
- P, Ng, Ng,
+ P, Ng, Ng, NULL,
shader, object, prim,
u, v, 1.0f, 0.5f,
!(kernel_tex_fetch(__object_flag, object) & SD_OBJECT_TRANSFORM_APPLIED),
diff --git a/intern/cycles/kernel/kernel_differential.h b/intern/cycles/kernel/kernel_differential.h
index ae1e70f0167..5f6b913defc 100644
--- a/intern/cycles/kernel/kernel_differential.h
+++ b/intern/cycles/kernel/kernel_differential.h
@@ -31,6 +31,19 @@ ccl_device void differential_transfer(ccl_addr_space differential3 *dP_, const d
dP_->dy = tmpy - dot(tmpy, Ng)*tmp;
}
+ccl_device void differential_reflect(ccl_addr_space differential3 *dD_, float3 D, const differential3* dD, float3 N, const differential3* dN)
+{
+ /* ray differential transfer through homogeneous medium, to
+ * compute dPdx/dy at a shading point from the incoming ray */
+
+ const float dotDN = dot(D, N);
+ const float3 tmpx = N * (dot(dD->dx, N) + dot(D, dN->dx));
+ const float3 tmpy = N * (dot(dD->dy, N) + dot(D, dN->dy));
+
+ dD_->dx = dD->dx - 2.0f * (dotDN * dN->dx + tmpx);
+ dD_->dy = dD->dy - 2.0f * (dotDN * dN->dy + tmpy);
+}
+
ccl_device void differential_incoming(ccl_addr_space differential3 *dI, const differential3 dD)
{
/* compute dIdx/dy at a shading point, we just need to negate the
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 94b0a37ce62..02541221130 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -61,7 +61,7 @@ ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
else
{
shader_setup_from_sample(kg, emission_sd,
- ls->P, ls->Ng, I,
+ ls->P, ls->Ng, I, &dI,
ls->shader, ls->object, ls->prim,
ls->u, ls->v, t, time, false, ls->lamp);
@@ -95,9 +95,16 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg,
if(ls->pdf == 0.0f)
return false;
- /* todo: implement */
differential3 dD = differential3_zero();
+ /* todo: implement */
+ differential3 dN = differential3_zero();
+
+ /* This is how differentials are calculated for a perfect specular reflection.
+ * This is not the exact value that we should be getting here,
+ * but it's still better than using zero differentials. */
+ differential_reflect(&dD, ray->D, &ray->dD, sd->N, &dN);
+
/* evaluate closure */
float3 light_eval = direct_emissive_eval(kg,
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index ed9a917ff2d..2fb1743f00d 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -268,6 +268,7 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg,
const float3 P,
const float3 Ng,
const float3 I,
+ const differential3 *dI,
int shader, int object, int prim,
float u, float v, float t,
float time,
@@ -390,11 +391,18 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg,
}
#ifdef __RAY_DIFFERENTIALS__
- /* no ray differentials here yet */
- sd->dP = differential3_zero();
- sd->dI = differential3_zero();
- sd->du = differential_zero();
- sd->dv = differential_zero();
+ if(dI) {
+ sd->dI = *dI;
+ differential_transfer(&sd->dP, differential3_zero(), I, *dI, Ng, t);
+ differential_dudv(&sd->du, &sd->dv, sd->dPdu, sd->dPdv, sd->dP, sd->Ng);
+ }
+ else {
+ sd->dP = differential3_zero();
+ sd->dI = differential3_zero();
+ sd->du = differential_zero();
+ sd->dv = differential_zero();
+ }
+
#endif
}
@@ -412,7 +420,7 @@ ccl_device void shader_setup_from_displace(KernelGlobals *kg, ShaderData *sd,
shader |= SHADER_SMOOTH_NORMAL;
shader_setup_from_sample(kg, sd,
- P, Ng, I,
+ P, Ng, I, NULL,
shader, object, prim,
u, v, 0.0f, 0.5f,
!(kernel_tex_fetch(__object_flag, object) & SD_OBJECT_TRANSFORM_APPLIED),
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index a6516cd203b..8ed7416f51d 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -383,7 +383,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a
break;
# ifdef __TEXTURES__
case NODE_TEX_ENVIRONMENT:
- svm_node_tex_environment(kg, sd, stack, node);
+ svm_node_tex_environment(kg, sd, path_flag, stack, node);
break;
case NODE_TEX_SKY:
svm_node_tex_sky(kg, sd, stack, node, &offset);
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index ccc0a328f2e..4baf72fae4c 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -24,29 +24,24 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y,
{
float4 r;
# ifdef __OIIO__
- if(kg->oiio && kg->oiio->tex_paths.size() > id) {
+ if(kg->oiio && kg->oiio->tex_paths.size() > id && kg->oiio->tex_paths[id]) {
OIIO::TextureOpt options;
options.swrap = options.twrap = OIIO::TextureOpt::WrapPeriodic;
-#if 0
- options.interpmode = OIIO::TextureOpt::InterpBilinear;
- options.mipmode = OIIO::TextureOpt::MipModeNoMIP;
-#else
+
if(fast_lookup) {
options.interpmode = OIIO::TextureOpt::InterpClosest;
options.mipmode = OIIO::TextureOpt::MipModeOneLevel;
}
else {
- options.interpmode = OIIO::TextureOpt::InterpSmartBicubic;
+ options.interpmode = OIIO::TextureOpt::InterpBilinear;
options.mipmode = OIIO::TextureOpt::MipModeAniso;
}
-#endif
- if(kg->oiio->tex_paths[id]) {
- bool success = kg->oiio->tex_sys->texture(kg->oiio->tex_paths[id], kg->oiio->tex_sys->get_perthread_info(), options, x, 1.0f - y, ds.dx, ds.dy, dt.dx, dt.dy, 3, (float*)&r);
- if(!success) {
- (void) kg->oiio->tex_sys->geterror();
- }
+ bool success = kg->oiio->tex_sys->texture(kg->oiio->tex_paths[id], kg->oiio->tex_sys->get_perthread_info(), options, x, 1.0f - y, ds.dx, ds.dy, dt.dx, dt.dy, 3, (float*)&r);
+ if(!success) {
+ (void) kg->oiio->tex_sys->geterror();
}
- } else
+ }
+ else
# endif
r = kernel_tex_image_interp(kg, id, x, y);
const float alpha = r.w;
@@ -227,7 +222,7 @@ ccl_device void svm_node_tex_image_box(KernelGlobals *kg, ShaderData *sd, float
stack_store_float(stack, alpha_offset, f.w);
}
-ccl_device void svm_node_tex_environment(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
+ccl_device void svm_node_tex_environment(KernelGlobals *kg, ShaderData *sd, int path_flag, float *stack, uint4 node)
{
uint id = node.y;
uint co_offset, out_offset, alpha_offset, srgb;
@@ -245,8 +240,9 @@ ccl_device void svm_node_tex_environment(KernelGlobals *kg, ShaderData *sd, floa
else
uv = direction_to_mirrorball(co);
+ bool fast_lookup = path_flag & (PATH_RAY_DIFFUSE | PATH_RAY_SHADOW | PATH_RAY_DIFFUSE_ANCESTOR | PATH_RAY_VOLUME_SCATTER);
uint use_alpha = stack_valid(alpha_offset);
- float4 f = svm_image_texture(kg, id, uv.x, uv.y, differential_zero(), differential_zero(), srgb, use_alpha, false);
+ float4 f = svm_image_texture(kg, id, uv.x, uv.y, differential_zero(), differential_zero(), srgb, use_alpha, fast_lookup);
if(stack_valid(out_offset))
stack_store_float3(stack, out_offset, make_float3(f.x, f.y, f.z));
More information about the Bf-blender-cvs
mailing list