diff options
author | Brecht Van Lommel <brecht@blender.org> | 2020-05-10 17:12:46 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2020-06-02 05:54:44 +0300 |
commit | 18cda8be8768b1e4ad9c359295142272e7aac6bf (patch) | |
tree | fd01cf95d243c9090431427719fa12d86a608d2b /intern | |
parent | 98c301d25ec7792075f6fb3826035f00e75a0926 (diff) |
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.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/kernel_camera.h | 16 | ||||
-rw-r--r-- | 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)) { |