29 if (kfilm_convert->pass_sample_count ==
PASS_UNUSED) {
30 return kfilm_convert->scale;
33 if (kfilm_convert->pass_use_filter) {
34 const uint sample_count = *(
35 (
ccl_global const uint *)(buffer + kfilm_convert->pass_sample_count));
36 return 1.0f / sample_count;
46 if (kfilm_convert->pass_sample_count ==
PASS_UNUSED) {
47 return kfilm_convert->scale_exposure;
52 if (kfilm_convert->pass_use_exposure) {
53 return scale * kfilm_convert->exposure;
65 if (kfilm_convert->pass_sample_count ==
PASS_UNUSED) {
66 *scale = kfilm_convert->scale;
67 *scale_exposure = kfilm_convert->scale_exposure;
71 const uint sample_count = *(
72 (
ccl_global const uint *)(buffer + kfilm_convert->pass_sample_count));
75 *scale_exposure = 0.0f;
79 if (kfilm_convert->pass_use_filter) {
80 *scale = 1.0f / sample_count;
86 if (kfilm_convert->pass_use_exposure) {
87 *scale_exposure = *scale * kfilm_convert->exposure;
90 *scale_exposure = *scale;
110 ccl_global const float *in = buffer + kfilm_convert->pass_offset;
113 pixel[0] = (f == 0.0f) ? 1e10f : f * scale_exposure;
126 ccl_global const float *in = buffer + kfilm_convert->pass_offset;
131 pixel[0] =
saturatef(1.0f - f * scale_exposure);
147 ccl_global const float *in = buffer + kfilm_convert->pass_offset;
163 ccl_global const float *in = buffer + kfilm_convert->pass_offset;
166 pixel[0] = f * scale_exposure;
182 ccl_global const float *in = buffer + kfilm_convert->pass_offset;
187 ccl_global const float *in_indirect = buffer + kfilm_convert->pass_indirect;
188 const float3 f_indirect =
make_float3(in_indirect[0], in_indirect[1], in_indirect[2]);
194 ccl_global const float *in_divide = buffer + kfilm_convert->pass_divide;
199 f *= kfilm_convert->exposure;
211 if (kfilm_convert->num_components >= 4) {
213 float scale, scale_exposure;
216 ccl_global const float *in_combined = buffer + kfilm_convert->pass_combined;
217 const float alpha = in_combined[3] * scale;
236 ccl_global const float *in = buffer + kfilm_convert->pass_offset;
245 if (kfilm_convert->num_components >= 4) {
247 float scale, scale_exposure;
250 ccl_global const float *in_combined = buffer + kfilm_convert->pass_combined;
251 const float alpha = in_combined[3] * scale;
273 ccl_global const float *in = buffer + kfilm_convert->pass_offset;
274 ccl_global const float *in_weight = buffer + kfilm_convert->pass_motion_weight;
276 const float weight = in_weight[0];
277 const float weight_inv = (weight > 0.0f) ? 1.0f / weight : 0.0f;
279 const float4 motion =
make_float4(in[0], in[1], in[2], in[3]) * weight_inv;
297 ccl_global const float *in = buffer + kfilm_convert->pass_offset;
299 const float4 f =
make_float4(in[0], in[1], in[2], in[3]);
304 pixel[1] = f.y * scale;
306 pixel[3] = f.w * scale;
317 float scale, scale_exposure;
320 ccl_global const float *in = buffer + kfilm_convert->pass_offset;
323 const float alpha = in[3] * scale;
343 float scale, scale_exposure;
352 ccl_global const float *in = buffer + kfilm_convert->pass_offset;
355 const float alpha = in[3] * scale;
373 float scale, scale_exposure;
376 ccl_global const float *in_catcher = buffer + kfilm_convert->pass_shadow_catcher;
378 const float3 pixel =
make_float3(in_catcher[0], in_catcher[1], in_catcher[2]) * scale_exposure;
387 x = (
b.x != 0.0f) ? a.
x /
b.x : 1.0f;
388 y = (
b.y != 0.0f) ? a.y /
b.y : 1.0f;
389 z = (
b.z != 0.0f) ? a.z /
b.z : 1.0f;
402 if (kfilm_convert->is_denoised) {
410 ccl_global const float *in_catcher_sample_count =
411 buffer + kfilm_convert->pass_shadow_catcher_sample_count;
412 const float num_samples = in_catcher_sample_count[0];
413 if (num_samples == 0.0f) {
418 ccl_global const float *in_catcher = buffer + kfilm_convert->pass_shadow_catcher;
428 ccl_global const float *in_combined = buffer + kfilm_convert->pass_combined;
429 ccl_global const float *in_matte = buffer + kfilm_convert->pass_shadow_catcher_matte;
433 const float3 color_catcher =
make_float3(in_catcher[0], in_catcher[1], in_catcher[2]);
434 const float3 color_combined =
make_float3(in_combined[0], in_combined[1], in_combined[2]);
441 const float3 combined_no_matte = color_combined - color_matte;
446 const float transparency = in_combined[3] * scale;
453 const float3 pixel = (1.0f - alpha) *
one_float3() + alpha * shadow_catcher;
472 float scale, scale_exposure;
477 ccl_global const float *in_matte = buffer + kfilm_convert->pass_shadow_catcher_matte;
480 const float3 color_matte =
make_float3(in_matte[0], in_matte[1], in_matte[2]) * scale_exposure;
482 const float transparency = in_matte[3] * scale;
483 const float alpha =
saturatef(1.0f - transparency);
485 const float alpha_matte = (1.0f - alpha) * (1.0f -
saturatef(
average(shadow_catcher))) + alpha;
487 if (kfilm_convert->use_approximate_shadow_catcher_background) {
490 ccl_global const float *in_background = buffer + kfilm_convert->pass_background;
492 in_background[0], in_background[1], in_background[2]) *
494 const float3 alpha_over = color_matte + color_background * (1.0f - alpha_matte);
495 return make_float4(alpha_over.
x, alpha_over.
y, alpha_over.
z, 1.0f);
498 return make_float4(color_matte.
x, color_matte.
y, color_matte.
z, alpha_matte);
510 pixel[0] = pixel_value.
x;
511 pixel[1] = pixel_value.
y;
512 pixel[2] = pixel_value.
z;
520 kernel_assert(kfilm_convert->num_components == 3 || kfilm_convert->num_components == 4);
525 pixel[0] = pixel_value.x;
526 pixel[1] = pixel_value.y;
527 pixel[2] = pixel_value.z;
528 if (kfilm_convert->num_components == 4) {
529 pixel[3] = pixel_value.w;
542 if (kfilm_convert->show_active_pixels && kfilm_convert->pass_adaptive_aux_buffer !=
PASS_UNUSED)
544 if (buffer[kfilm_convert->pass_adaptive_aux_buffer + 3] == 0.0f) {
547 pixel[0] = mix_rgb.
x;
548 pixel[1] = mix_rgb.
y;
549 pixel[2] = mix_rgb.
z;
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
local_group_size(16, 16) .push_constant(Type b
#define kernel_assert(cond)
#define ccl_device_forceinline
#define ccl_device_inline
#define CCL_NAMESPACE_END
ccl_device_inline float average(const float2 a)
ccl_device_inline float2 interp(const float2 a, const float2 b, float t)
ccl_device_inline float3 one_float3()
CCL_NAMESPACE_BEGIN ccl_device_inline float4 zero_float4()
ccl_device_inline bool film_get_scale_and_scale_exposure(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict scale, ccl_private float *ccl_restrict scale_exposure)
ccl_device_inline void film_get_pass_pixel_combined(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
CCL_NAMESPACE_BEGIN ccl_device_forceinline float film_transparency_to_alpha(float transparency)
ccl_device_inline void film_get_pass_pixel_depth(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
ccl_device_inline void film_get_pass_pixel_light_path(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
ccl_device_inline void film_get_pass_pixel_float3(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
ccl_device_inline void film_apply_pass_pixel_overlays_rgba(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
ccl_device_inline float4 film_calculate_shadow_catcher_matte_with_shadow(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer)
ccl_device_inline void film_get_pass_pixel_motion(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
ccl_device_inline void film_get_pass_pixel_float4(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
ccl_device_inline void film_get_pass_pixel_shadow_catcher_matte_with_shadow(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
ccl_device_inline float3 safe_divide_shadow_catcher(float3 a, float3 b)
ccl_device_inline float film_get_scale(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer)
ccl_device_inline void film_get_pass_pixel_float(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
ccl_device_inline float film_get_scale_exposure(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer)
ccl_device_inline float3 film_calculate_shadow_catcher_denoised(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer)
ccl_device_inline void film_get_pass_pixel_sample_count(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
ccl_device_inline void film_get_pass_pixel_mist(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
ccl_device_inline float3 film_calculate_shadow_catcher(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer)
ccl_device_inline void film_get_pass_pixel_shadow_catcher(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
ccl_device_inline void film_get_pass_pixel_cryptomatte(ccl_global const KernelFilmConvert *ccl_restrict kfilm_convert, ccl_global const float *ccl_restrict buffer, ccl_private float *ccl_restrict pixel)
ccl_device_inline float3 safe_divide_even_color(float3 a, float3 b)