Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2013-06-07 16:45:26 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-06-07 16:45:26 +0400
commita604fb730dd62a2730a3a753adc057abb93296cb (patch)
treeba8733ea17c330407455404abbbc64717cc78f63 /intern/cycles/kernel/kernel_passes.h
parentddee696bc76481846673f613344d85310ecf0524 (diff)
Cycles: mist pass added, with start/depth/falloff control. If the pass is
enabled in a render layer a Mist Pass panel will be shown in the world properties.
Diffstat (limited to 'intern/cycles/kernel/kernel_passes.h')
-rw-r--r--intern/cycles/kernel/kernel_passes.h27
1 files changed, 27 insertions, 0 deletions
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index 57dbdc2ffc1..c7d216e4638 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -86,6 +86,31 @@ __device_inline void kernel_write_data_passes(KernelGlobals *kg, __global float
L->color_glossy += shader_bsdf_glossy(kg, sd)*throughput;
if(flag & (PASS_TRANSMISSION_INDIRECT|PASS_TRANSMISSION_COLOR|PASS_TRANSMISSION_DIRECT))
L->color_transmission += shader_bsdf_transmission(kg, sd)*throughput;
+
+ if(flag & PASS_MIST) {
+ /* bring depth into 0..1 range */
+ float mist_start = kernel_data.film.mist_start;
+ float mist_inv_depth = kernel_data.film.mist_inv_depth;
+
+ float depth = camera_distance(kg, sd->P);
+ float mist = clamp((depth - mist_start)*mist_inv_depth, 0.0f, 1.0f);
+
+ /* falloff */
+ float mist_falloff = kernel_data.film.mist_falloff;
+
+ if(mist_falloff == 1.0f)
+ ;
+ else if(mist_falloff == 2.0f)
+ mist = mist*mist;
+ else if(mist_falloff == 0.5f)
+ mist = sqrtf(mist);
+ else
+ mist = powf(mist, mist_falloff);
+
+ /* modulate by transparency */
+ float3 alpha = throughput*(make_float3(1.0f, 1.0f, 1.0f) - shader_bsdf_transparency(kg, sd));
+ L->mist += (1.0f - mist)*average(alpha);
+ }
#endif
}
@@ -128,6 +153,8 @@ __device_inline void kernel_write_light_passes(KernelGlobals *kg, __global float
shadow.w = kernel_data.film.pass_shadow_scale;
kernel_write_pass_float4(buffer + kernel_data.film.pass_shadow, sample, shadow);
}
+ if(flag & PASS_MIST)
+ kernel_write_pass_float(buffer + kernel_data.film.pass_mist, sample, L->mist);
#endif
}