From 18cda8be8768b1e4ad9c359295142272e7aac6bf Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 10 May 2020 16:12:46 +0200 Subject: [PATCH] Cycles: change perspective depth pass to be more standard Now it matches Eevee, OpenGL and other renderers. Panoramic camera depth passes are unchanged, and are still distance from the camera center. --- intern/cycles/kernel/kernel_camera.h | 16 +++++++++++++++- intern/cycles/kernel/kernel_passes.h | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/intern/cycles/kernel/kernel_camera.h b/intern/cycles/kernel/kernel_camera.h index 62ce04ba48f..445cf9eb44b 100644 --- a/intern/cycles/kernel/kernel_camera.h +++ b/intern/cycles/kernel/kernel_camera.h @@ -441,8 +441,22 @@ ccl_device_inline float camera_distance(KernelGlobals *kg, float3 P) float3 camD = make_float3(cameratoworld.x.z, cameratoworld.y.z, cameratoworld.z.z); return fabsf(dot((P - camP), camD)); } - else + else { return len(P - camP); + } +} + +ccl_device_inline float camera_z_depth(KernelGlobals *kg, float3 P) +{ + if (kernel_data.cam.type != CAMERA_PANORAMA) { + Transform worldtocamera = kernel_data.cam.worldtocamera; + return transform_point(&worldtocamera, P).z; + } + else { + Transform cameratoworld = kernel_data.cam.cameratoworld; + float3 camP = make_float3(cameratoworld.x.w, cameratoworld.y.w, cameratoworld.z.w); + return len(P - camP); + } } ccl_device_inline float3 camera_direction_from_point(KernelGlobals *kg, float3 P) diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h index 7437e540a1f..753cf4561b2 100644 --- a/intern/cycles/kernel/kernel_passes.h +++ b/intern/cycles/kernel/kernel_passes.h @@ -194,7 +194,7 @@ ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, average(shader_bsdf_alpha(kg, sd)) >= kernel_data.film.pass_alpha_threshold) { if (state->sample == 0) { if (flag & PASSMASK(DEPTH)) { - float depth = camera_distance(kg, sd->P); + float depth = camera_z_depth(kg, sd->P); kernel_write_pass_float(buffer + kernel_data.film.pass_depth, depth); } if (flag & PASSMASK(OBJECT_ID)) {