2023-06-14 16:52:36 +10:00
|
|
|
/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: Apache-2.0 */
|
2011-04-27 11:58:34 +00:00
|
|
|
|
Cycles: merge of cycles-x branch, a major update to the renderer
This includes much improved GPU rendering performance, viewport interactivity,
new shadow catcher, revamped sampling settings, subsurface scattering anisotropy,
new GPU volume sampling, improved PMJ sampling pattern, and more.
Some features have also been removed or changed, breaking backwards compatibility.
Including the removal of the OpenCL backend, for which alternatives are under
development.
Release notes and code docs:
https://wiki.blender.org/wiki/Reference/Release_Notes/3.0/Cycles
https://wiki.blender.org/wiki/Source/Render/Cycles
Credits:
* Sergey Sharybin
* Brecht Van Lommel
* Patrick Mours (OptiX backend)
* Christophe Hery (subsurface scattering anisotropy)
* William Leeson (PMJ sampling pattern)
* Alaska (various fixes and tweaks)
* Thomas Dinges (various fixes)
For the full commit history, see the cycles-x branch. This squashes together
all the changes since intermediate changes would often fail building or tests.
Ref T87839, T87837, T87836
Fixes T90734, T89353, T80267, T80267, T77185, T69800
2021-09-20 17:59:20 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
2024-12-26 17:53:57 +01:00
|
|
|
#include "kernel/globals.h"
|
|
|
|
|
|
2021-10-24 14:19:19 +02:00
|
|
|
#include "kernel/camera/projection.h"
|
|
|
|
|
#include "kernel/sample/mapping.h"
|
|
|
|
|
#include "kernel/util/differential.h"
|
|
|
|
|
#include "kernel/util/lookup_table.h"
|
Cycles: merge of cycles-x branch, a major update to the renderer
This includes much improved GPU rendering performance, viewport interactivity,
new shadow catcher, revamped sampling settings, subsurface scattering anisotropy,
new GPU volume sampling, improved PMJ sampling pattern, and more.
Some features have also been removed or changed, breaking backwards compatibility.
Including the removal of the OpenCL backend, for which alternatives are under
development.
Release notes and code docs:
https://wiki.blender.org/wiki/Reference/Release_Notes/3.0/Cycles
https://wiki.blender.org/wiki/Source/Render/Cycles
Credits:
* Sergey Sharybin
* Brecht Van Lommel
* Patrick Mours (OptiX backend)
* Christophe Hery (subsurface scattering anisotropy)
* William Leeson (PMJ sampling pattern)
* Alaska (various fixes and tweaks)
* Thomas Dinges (various fixes)
For the full commit history, see the cycles-x branch. This squashes together
all the changes since intermediate changes would often fail building or tests.
Ref T87839, T87837, T87836
Fixes T90734, T89353, T80267, T80267, T77185, T69800
2021-09-20 17:59:20 +02:00
|
|
|
|
2025-04-25 19:27:30 +02:00
|
|
|
#ifdef WITH_OSL
|
|
|
|
|
# include "kernel/osl/camera.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
|
|
|
|
|
|
/* Perspective Camera */
|
|
|
|
|
|
2023-05-24 18:56:58 +02:00
|
|
|
ccl_device float2 camera_sample_aperture(ccl_constant KernelCamera *cam, const float2 rand)
|
2011-09-16 13:14:02 +00:00
|
|
|
{
|
2024-12-29 17:32:00 +01:00
|
|
|
const float blades = cam->blades;
|
2014-08-27 10:51:50 +02:00
|
|
|
float2 bokeh;
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2011-09-16 13:14:02 +00:00
|
|
|
if (blades == 0.0f) {
|
|
|
|
|
/* sample disk */
|
2023-08-23 17:25:27 +02:00
|
|
|
bokeh = sample_uniform_disk(rand);
|
2011-09-16 13:14:02 +00:00
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
/* sample polygon */
|
2024-12-29 17:32:00 +01:00
|
|
|
const float rotation = cam->bladesrotation;
|
2023-05-24 18:56:58 +02:00
|
|
|
bokeh = regular_polygon_sample(blades, rotation, rand);
|
2011-09-16 13:14:02 +00:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2014-08-27 10:51:50 +02:00
|
|
|
/* anamorphic lens bokeh */
|
2018-01-12 02:14:27 +01:00
|
|
|
bokeh.x *= cam->inv_aperture_ratio;
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2014-08-27 10:51:50 +02:00
|
|
|
return bokeh;
|
2011-09-16 13:14:02 +00:00
|
|
|
}
|
|
|
|
|
|
2025-04-25 19:27:30 +02:00
|
|
|
ccl_device Spectrum camera_sample_perspective(KernelGlobals kg,
|
|
|
|
|
const float2 raster_xy,
|
|
|
|
|
const float2 rand_lens,
|
|
|
|
|
ccl_private Ray *ray)
|
2011-04-27 11:58:34 +00:00
|
|
|
{
|
|
|
|
|
/* create ray form raster position */
|
2024-12-29 17:32:00 +01:00
|
|
|
const ProjectionTransform rastertocamera = kernel_data.cam.rastertocamera;
|
2024-12-19 09:41:55 +01:00
|
|
|
const float3 raster = make_float3(raster_xy);
|
2015-07-21 15:36:35 +02:00
|
|
|
float3 Pcamera = transform_perspective(&rastertocamera, raster);
|
|
|
|
|
|
|
|
|
|
if (kernel_data.cam.have_perspective_motion) {
|
|
|
|
|
/* TODO(sergey): Currently we interpolate projected coordinate which
|
|
|
|
|
* gives nice looking result and which is simple, but is in fact a bit
|
|
|
|
|
* different comparing to constructing projective matrix from an
|
|
|
|
|
* interpolated field of view.
|
|
|
|
|
*/
|
|
|
|
|
if (ray->time < 0.5f) {
|
2024-12-29 17:32:00 +01:00
|
|
|
const ProjectionTransform rastertocamera_pre = kernel_data.cam.perspective_pre;
|
|
|
|
|
const float3 Pcamera_pre = transform_perspective(&rastertocamera_pre, raster);
|
2015-07-21 15:36:35 +02:00
|
|
|
Pcamera = interp(Pcamera_pre, Pcamera, ray->time * 2.0f);
|
|
|
|
|
}
|
|
|
|
|
else {
|
2024-12-29 17:32:00 +01:00
|
|
|
const ProjectionTransform rastertocamera_post = kernel_data.cam.perspective_post;
|
|
|
|
|
const float3 Pcamera_post = transform_perspective(&rastertocamera_post, raster);
|
2015-07-21 15:36:35 +02:00
|
|
|
Pcamera = interp(Pcamera, Pcamera_post, (ray->time - 0.5f) * 2.0f);
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2021-02-17 01:47:18 +01:00
|
|
|
float3 P = zero_float3();
|
2016-10-22 23:25:39 +02:00
|
|
|
float3 D = Pcamera;
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
|
/* modify ray for depth of field */
|
2024-12-29 17:32:00 +01:00
|
|
|
const float aperturesize = kernel_data.cam.aperturesize;
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2011-09-16 13:14:02 +00:00
|
|
|
if (aperturesize > 0.0f) {
|
|
|
|
|
/* sample point on aperture */
|
2024-12-29 17:32:00 +01:00
|
|
|
const float2 lens_uv = camera_sample_aperture(&kernel_data.cam, rand_lens) * aperturesize;
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
|
/* compute point on plane of focus */
|
2024-12-29 17:32:00 +01:00
|
|
|
const float ft = kernel_data.cam.focaldistance / D.z;
|
|
|
|
|
const float3 Pfocus = D * ft;
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
|
/* update ray for effect of lens */
|
2024-12-19 09:41:55 +01:00
|
|
|
P = make_float3(lens_uv);
|
2016-10-22 23:25:39 +02:00
|
|
|
D = normalize(Pfocus - P);
|
2011-04-27 11:58:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* transform ray from camera to world */
|
|
|
|
|
Transform cameratoworld = kernel_data.cam.cameratoworld;
|
|
|
|
|
|
2018-03-10 01:36:09 +01:00
|
|
|
if (kernel_data.cam.num_motion_steps) {
|
|
|
|
|
transform_motion_array_interpolate(&cameratoworld,
|
2022-06-17 17:16:37 +02:00
|
|
|
kernel_data_array(camera_motion),
|
2018-03-10 01:36:09 +01:00
|
|
|
kernel_data.cam.num_motion_steps,
|
|
|
|
|
ray->time);
|
2015-02-21 12:33:21 +05:00
|
|
|
}
|
2012-04-30 12:49:26 +00:00
|
|
|
|
2016-10-22 23:25:39 +02:00
|
|
|
P = transform_point(&cameratoworld, P);
|
|
|
|
|
D = normalize(transform_direction(&cameratoworld, D));
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2024-12-29 17:32:00 +01:00
|
|
|
const bool use_stereo = kernel_data.cam.interocular_offset != 0.0f;
|
2016-10-24 12:26:12 +02:00
|
|
|
if (!use_stereo) {
|
2016-10-22 15:59:23 +02:00
|
|
|
/* No stereo */
|
2016-10-22 23:25:39 +02:00
|
|
|
ray->P = P;
|
|
|
|
|
ray->D = D;
|
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
#ifdef __RAY_DIFFERENTIALS__
|
2024-12-29 17:32:00 +01:00
|
|
|
const float3 Dcenter = transform_direction(&cameratoworld, Pcamera);
|
|
|
|
|
const float3 Dcenter_normalized = normalize(Dcenter);
|
Cycles: merge of cycles-x branch, a major update to the renderer
This includes much improved GPU rendering performance, viewport interactivity,
new shadow catcher, revamped sampling settings, subsurface scattering anisotropy,
new GPU volume sampling, improved PMJ sampling pattern, and more.
Some features have also been removed or changed, breaking backwards compatibility.
Including the removal of the OpenCL backend, for which alternatives are under
development.
Release notes and code docs:
https://wiki.blender.org/wiki/Reference/Release_Notes/3.0/Cycles
https://wiki.blender.org/wiki/Source/Render/Cycles
Credits:
* Sergey Sharybin
* Brecht Van Lommel
* Patrick Mours (OptiX backend)
* Christophe Hery (subsurface scattering anisotropy)
* William Leeson (PMJ sampling pattern)
* Alaska (various fixes and tweaks)
* Thomas Dinges (various fixes)
For the full commit history, see the cycles-x branch. This squashes together
all the changes since intermediate changes would often fail building or tests.
Ref T87839, T87837, T87836
Fixes T90734, T89353, T80267, T80267, T77185, T69800
2021-09-20 17:59:20 +02:00
|
|
|
|
|
|
|
|
/* TODO: can this be optimized to give compact differentials directly? */
|
|
|
|
|
ray->dP = differential_zero_compact();
|
|
|
|
|
differential3 dD;
|
2024-12-19 09:41:55 +01:00
|
|
|
dD.dx = normalize(Dcenter + make_float3(kernel_data.cam.dx)) - Dcenter_normalized;
|
|
|
|
|
dD.dy = normalize(Dcenter + make_float3(kernel_data.cam.dy)) - Dcenter_normalized;
|
Cycles: merge of cycles-x branch, a major update to the renderer
This includes much improved GPU rendering performance, viewport interactivity,
new shadow catcher, revamped sampling settings, subsurface scattering anisotropy,
new GPU volume sampling, improved PMJ sampling pattern, and more.
Some features have also been removed or changed, breaking backwards compatibility.
Including the removal of the OpenCL backend, for which alternatives are under
development.
Release notes and code docs:
https://wiki.blender.org/wiki/Reference/Release_Notes/3.0/Cycles
https://wiki.blender.org/wiki/Source/Render/Cycles
Credits:
* Sergey Sharybin
* Brecht Van Lommel
* Patrick Mours (OptiX backend)
* Christophe Hery (subsurface scattering anisotropy)
* William Leeson (PMJ sampling pattern)
* Alaska (various fixes and tweaks)
* Thomas Dinges (various fixes)
For the full commit history, see the cycles-x branch. This squashes together
all the changes since intermediate changes would often fail building or tests.
Ref T87839, T87837, T87836
Fixes T90734, T89353, T80267, T80267, T77185, T69800
2021-09-20 17:59:20 +02:00
|
|
|
ray->dD = differential_make_compact(dD);
|
2016-10-22 15:59:23 +02:00
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
/* Spherical stereo */
|
2018-01-12 02:14:27 +01:00
|
|
|
spherical_stereo_transform(&kernel_data.cam, &P, &D);
|
2016-10-22 23:25:39 +02:00
|
|
|
ray->P = P;
|
|
|
|
|
ray->D = D;
|
2016-10-22 15:59:23 +02:00
|
|
|
|
|
|
|
|
#ifdef __RAY_DIFFERENTIALS__
|
|
|
|
|
/* Ray differentials, computed from scratch using the raster coordinates
|
|
|
|
|
* because we don't want to be affected by depth of field. We compute
|
2019-07-07 15:38:41 +10:00
|
|
|
* ray origin and direction for the center and two neighboring pixels
|
2016-10-22 15:59:23 +02:00
|
|
|
* and simply take their differences. */
|
2024-12-29 17:32:00 +01:00
|
|
|
const float3 Pnostereo = transform_point(&cameratoworld, zero_float3());
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2016-10-22 15:59:23 +02:00
|
|
|
float3 Pcenter = Pnostereo;
|
|
|
|
|
float3 Dcenter = Pcamera;
|
|
|
|
|
Dcenter = normalize(transform_direction(&cameratoworld, Dcenter));
|
2018-01-12 02:14:27 +01:00
|
|
|
spherical_stereo_transform(&kernel_data.cam, &Pcenter, &Dcenter);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2016-10-22 15:59:23 +02:00
|
|
|
float3 Px = Pnostereo;
|
|
|
|
|
float3 Dx = transform_perspective(&rastertocamera,
|
2023-05-24 18:56:58 +02:00
|
|
|
make_float3(raster.x + 1.0f, raster.y, 0.0f));
|
2016-10-22 15:59:23 +02:00
|
|
|
Dx = normalize(transform_direction(&cameratoworld, Dx));
|
2018-01-12 02:14:27 +01:00
|
|
|
spherical_stereo_transform(&kernel_data.cam, &Px, &Dx);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2024-12-29 17:32:00 +01:00
|
|
|
differential3 dP;
|
|
|
|
|
differential3 dD;
|
Cycles: merge of cycles-x branch, a major update to the renderer
This includes much improved GPU rendering performance, viewport interactivity,
new shadow catcher, revamped sampling settings, subsurface scattering anisotropy,
new GPU volume sampling, improved PMJ sampling pattern, and more.
Some features have also been removed or changed, breaking backwards compatibility.
Including the removal of the OpenCL backend, for which alternatives are under
development.
Release notes and code docs:
https://wiki.blender.org/wiki/Reference/Release_Notes/3.0/Cycles
https://wiki.blender.org/wiki/Source/Render/Cycles
Credits:
* Sergey Sharybin
* Brecht Van Lommel
* Patrick Mours (OptiX backend)
* Christophe Hery (subsurface scattering anisotropy)
* William Leeson (PMJ sampling pattern)
* Alaska (various fixes and tweaks)
* Thomas Dinges (various fixes)
For the full commit history, see the cycles-x branch. This squashes together
all the changes since intermediate changes would often fail building or tests.
Ref T87839, T87837, T87836
Fixes T90734, T89353, T80267, T80267, T77185, T69800
2021-09-20 17:59:20 +02:00
|
|
|
|
|
|
|
|
dP.dx = Px - Pcenter;
|
|
|
|
|
dD.dx = Dx - Dcenter;
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2016-10-22 15:59:23 +02:00
|
|
|
float3 Py = Pnostereo;
|
|
|
|
|
float3 Dy = transform_perspective(&rastertocamera,
|
2023-05-24 18:56:58 +02:00
|
|
|
make_float3(raster.x, raster.y + 1.0f, 0.0f));
|
2016-10-22 15:59:23 +02:00
|
|
|
Dy = normalize(transform_direction(&cameratoworld, Dy));
|
2018-01-12 02:14:27 +01:00
|
|
|
spherical_stereo_transform(&kernel_data.cam, &Py, &Dy);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
Cycles: merge of cycles-x branch, a major update to the renderer
This includes much improved GPU rendering performance, viewport interactivity,
new shadow catcher, revamped sampling settings, subsurface scattering anisotropy,
new GPU volume sampling, improved PMJ sampling pattern, and more.
Some features have also been removed or changed, breaking backwards compatibility.
Including the removal of the OpenCL backend, for which alternatives are under
development.
Release notes and code docs:
https://wiki.blender.org/wiki/Reference/Release_Notes/3.0/Cycles
https://wiki.blender.org/wiki/Source/Render/Cycles
Credits:
* Sergey Sharybin
* Brecht Van Lommel
* Patrick Mours (OptiX backend)
* Christophe Hery (subsurface scattering anisotropy)
* William Leeson (PMJ sampling pattern)
* Alaska (various fixes and tweaks)
* Thomas Dinges (various fixes)
For the full commit history, see the cycles-x branch. This squashes together
all the changes since intermediate changes would often fail building or tests.
Ref T87839, T87837, T87836
Fixes T90734, T89353, T80267, T80267, T77185, T69800
2021-09-20 17:59:20 +02:00
|
|
|
dP.dy = Py - Pcenter;
|
|
|
|
|
dD.dy = Dy - Dcenter;
|
|
|
|
|
ray->dD = differential_make_compact(dD);
|
|
|
|
|
ray->dP = differential_make_compact(dP);
|
2011-04-27 11:58:34 +00:00
|
|
|
#endif
|
2016-10-22 15:59:23 +02:00
|
|
|
}
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
|
/* clipping */
|
2024-12-29 17:32:00 +01:00
|
|
|
const float z_inv = 1.0f / normalize(Pcamera).z;
|
|
|
|
|
const float nearclip = kernel_data.cam.nearclip * z_inv;
|
2016-10-22 15:59:23 +02:00
|
|
|
ray->P += nearclip * ray->D;
|
Cycles: merge of cycles-x branch, a major update to the renderer
This includes much improved GPU rendering performance, viewport interactivity,
new shadow catcher, revamped sampling settings, subsurface scattering anisotropy,
new GPU volume sampling, improved PMJ sampling pattern, and more.
Some features have also been removed or changed, breaking backwards compatibility.
Including the removal of the OpenCL backend, for which alternatives are under
development.
Release notes and code docs:
https://wiki.blender.org/wiki/Reference/Release_Notes/3.0/Cycles
https://wiki.blender.org/wiki/Source/Render/Cycles
Credits:
* Sergey Sharybin
* Brecht Van Lommel
* Patrick Mours (OptiX backend)
* Christophe Hery (subsurface scattering anisotropy)
* William Leeson (PMJ sampling pattern)
* Alaska (various fixes and tweaks)
* Thomas Dinges (various fixes)
For the full commit history, see the cycles-x branch. This squashes together
all the changes since intermediate changes would often fail building or tests.
Ref T87839, T87837, T87836
Fixes T90734, T89353, T80267, T80267, T77185, T69800
2021-09-20 17:59:20 +02:00
|
|
|
ray->dP += nearclip * ray->dD;
|
2022-07-13 16:54:53 +02:00
|
|
|
ray->tmin = 0.0f;
|
|
|
|
|
ray->tmax = kernel_data.cam.cliplength * z_inv;
|
2025-04-25 19:27:30 +02:00
|
|
|
|
|
|
|
|
return one_spectrum();
|
2011-04-27 11:58:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Orthographic Camera */
|
2025-04-25 19:27:30 +02:00
|
|
|
ccl_device Spectrum camera_sample_orthographic(KernelGlobals kg,
|
|
|
|
|
const float2 raster_xy,
|
|
|
|
|
const float2 rand_lens,
|
|
|
|
|
ccl_private Ray *ray)
|
2011-04-27 11:58:34 +00:00
|
|
|
{
|
|
|
|
|
/* create ray form raster position */
|
2024-12-29 17:32:00 +01:00
|
|
|
const ProjectionTransform rastertocamera = kernel_data.cam.rastertocamera;
|
|
|
|
|
const float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_xy));
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2016-10-22 23:25:39 +02:00
|
|
|
float3 P;
|
|
|
|
|
float3 D = make_float3(0.0f, 0.0f, 1.0f);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2013-03-21 02:38:11 +00:00
|
|
|
/* modify ray for depth of field */
|
2024-12-29 17:32:00 +01:00
|
|
|
const float aperturesize = kernel_data.cam.aperturesize;
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2013-03-21 02:38:11 +00:00
|
|
|
if (aperturesize > 0.0f) {
|
|
|
|
|
/* sample point on aperture */
|
2024-12-29 17:32:00 +01:00
|
|
|
const float2 lens_uv = camera_sample_aperture(&kernel_data.cam, rand_lens) * aperturesize;
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2013-03-21 02:38:11 +00:00
|
|
|
/* compute point on plane of focus */
|
2024-12-29 17:32:00 +01:00
|
|
|
const float3 Pfocus = D * kernel_data.cam.focaldistance;
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2024-06-17 17:45:55 +02:00
|
|
|
/* Update ray for effect of lens */
|
2024-12-29 17:32:00 +01:00
|
|
|
const float3 lens_uvw = make_float3(lens_uv);
|
2024-06-17 17:45:55 +02:00
|
|
|
|
2023-05-24 18:56:58 +02:00
|
|
|
D = normalize(Pfocus - lens_uvw);
|
2024-06-17 17:45:55 +02:00
|
|
|
/* Compute position the ray will be if it traveled until it intersected the near clip plane.
|
2024-06-18 12:09:40 +10:00
|
|
|
* This allows for correct DOF while allowing near clipping. */
|
2024-06-17 17:45:55 +02:00
|
|
|
P = Pcamera + lens_uvw + (D * (kernel_data.cam.nearclip / D.z));
|
2013-03-21 02:38:11 +00:00
|
|
|
}
|
2013-04-06 11:52:40 +00:00
|
|
|
else {
|
2024-06-17 17:45:55 +02:00
|
|
|
P = Pcamera + make_float3(0.0f, 0.0f, kernel_data.cam.nearclip);
|
2013-04-06 11:52:40 +00:00
|
|
|
}
|
2011-04-27 11:58:34 +00:00
|
|
|
/* transform ray from camera to world */
|
|
|
|
|
Transform cameratoworld = kernel_data.cam.cameratoworld;
|
|
|
|
|
|
2018-03-10 01:36:09 +01:00
|
|
|
if (kernel_data.cam.num_motion_steps) {
|
|
|
|
|
transform_motion_array_interpolate(&cameratoworld,
|
2022-06-17 17:16:37 +02:00
|
|
|
kernel_data_array(camera_motion),
|
2018-03-10 01:36:09 +01:00
|
|
|
kernel_data.cam.num_motion_steps,
|
|
|
|
|
ray->time);
|
2015-02-21 12:33:21 +05:00
|
|
|
}
|
2012-04-30 12:49:26 +00:00
|
|
|
|
2016-10-22 23:25:39 +02:00
|
|
|
ray->P = transform_point(&cameratoworld, P);
|
|
|
|
|
ray->D = normalize(transform_direction(&cameratoworld, D));
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
|
#ifdef __RAY_DIFFERENTIALS__
|
|
|
|
|
/* ray differential */
|
Cycles: merge of cycles-x branch, a major update to the renderer
This includes much improved GPU rendering performance, viewport interactivity,
new shadow catcher, revamped sampling settings, subsurface scattering anisotropy,
new GPU volume sampling, improved PMJ sampling pattern, and more.
Some features have also been removed or changed, breaking backwards compatibility.
Including the removal of the OpenCL backend, for which alternatives are under
development.
Release notes and code docs:
https://wiki.blender.org/wiki/Reference/Release_Notes/3.0/Cycles
https://wiki.blender.org/wiki/Source/Render/Cycles
Credits:
* Sergey Sharybin
* Brecht Van Lommel
* Patrick Mours (OptiX backend)
* Christophe Hery (subsurface scattering anisotropy)
* William Leeson (PMJ sampling pattern)
* Alaska (various fixes and tweaks)
* Thomas Dinges (various fixes)
For the full commit history, see the cycles-x branch. This squashes together
all the changes since intermediate changes would often fail building or tests.
Ref T87839, T87837, T87836
Fixes T90734, T89353, T80267, T80267, T77185, T69800
2021-09-20 17:59:20 +02:00
|
|
|
differential3 dP;
|
2024-12-19 09:41:55 +01:00
|
|
|
dP.dx = make_float3(kernel_data.cam.dx);
|
|
|
|
|
dP.dy = make_float3(kernel_data.cam.dx);
|
2011-04-27 11:58:34 +00:00
|
|
|
|
Cycles: merge of cycles-x branch, a major update to the renderer
This includes much improved GPU rendering performance, viewport interactivity,
new shadow catcher, revamped sampling settings, subsurface scattering anisotropy,
new GPU volume sampling, improved PMJ sampling pattern, and more.
Some features have also been removed or changed, breaking backwards compatibility.
Including the removal of the OpenCL backend, for which alternatives are under
development.
Release notes and code docs:
https://wiki.blender.org/wiki/Reference/Release_Notes/3.0/Cycles
https://wiki.blender.org/wiki/Source/Render/Cycles
Credits:
* Sergey Sharybin
* Brecht Van Lommel
* Patrick Mours (OptiX backend)
* Christophe Hery (subsurface scattering anisotropy)
* William Leeson (PMJ sampling pattern)
* Alaska (various fixes and tweaks)
* Thomas Dinges (various fixes)
For the full commit history, see the cycles-x branch. This squashes together
all the changes since intermediate changes would often fail building or tests.
Ref T87839, T87837, T87836
Fixes T90734, T89353, T80267, T80267, T77185, T69800
2021-09-20 17:59:20 +02:00
|
|
|
ray->dP = differential_make_compact(dP);
|
|
|
|
|
ray->dD = differential_zero_compact();
|
2011-04-27 11:58:34 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* clipping */
|
2022-07-13 16:54:53 +02:00
|
|
|
ray->tmin = 0.0f;
|
|
|
|
|
ray->tmax = kernel_data.cam.cliplength;
|
2012-02-28 16:44:54 +00:00
|
|
|
|
2025-04-25 19:27:30 +02:00
|
|
|
return one_spectrum();
|
2024-03-24 17:20:16 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-25 19:27:30 +02:00
|
|
|
/* Custom Camera */
|
2012-09-17 11:25:29 +00:00
|
|
|
|
2025-04-25 19:27:30 +02:00
|
|
|
ccl_device_inline void camera_sample_to_ray(ccl_constant KernelCamera *cam,
|
|
|
|
|
const ccl_global DecomposedTransform *cam_motion,
|
|
|
|
|
float3 P,
|
|
|
|
|
float3 D,
|
2024-03-24 17:20:16 +01:00
|
|
|
#ifdef __RAY_DIFFERENTIALS__
|
2025-04-25 19:27:30 +02:00
|
|
|
float3 Pcenter,
|
|
|
|
|
float3 Dcenter,
|
|
|
|
|
float3 Px,
|
|
|
|
|
float3 Dx,
|
|
|
|
|
float3 Py,
|
|
|
|
|
float3 Dy,
|
2024-03-24 17:20:16 +01:00
|
|
|
#endif
|
2025-04-25 19:27:30 +02:00
|
|
|
ccl_private Ray *ray)
|
|
|
|
|
{
|
|
|
|
|
/* Transform the ray from camera to world. */
|
2018-01-12 02:14:27 +01:00
|
|
|
Transform cameratoworld = cam->cameratoworld;
|
2012-02-28 16:44:54 +00:00
|
|
|
|
2018-03-10 01:36:09 +01:00
|
|
|
if (cam->num_motion_steps) {
|
|
|
|
|
transform_motion_array_interpolate(
|
|
|
|
|
&cameratoworld, cam_motion, cam->num_motion_steps, ray->time);
|
2015-05-09 18:57:51 +05:00
|
|
|
}
|
2012-04-30 12:49:26 +00:00
|
|
|
|
2016-10-22 15:59:23 +02:00
|
|
|
/* Stereo transform */
|
2024-12-29 17:32:00 +01:00
|
|
|
const bool use_stereo = cam->interocular_offset != 0.0f;
|
2016-10-24 12:26:12 +02:00
|
|
|
if (use_stereo) {
|
2018-01-12 02:14:27 +01:00
|
|
|
spherical_stereo_transform(cam, &P, &D);
|
2016-10-22 15:59:23 +02:00
|
|
|
}
|
2012-02-28 16:44:54 +00:00
|
|
|
|
2021-10-28 22:38:07 +02:00
|
|
|
P = transform_point(&cameratoworld, P);
|
|
|
|
|
D = normalize(transform_direction(&cameratoworld, D));
|
|
|
|
|
|
2016-10-22 23:25:39 +02:00
|
|
|
ray->P = P;
|
|
|
|
|
ray->D = D;
|
|
|
|
|
|
2012-02-28 16:44:54 +00:00
|
|
|
#ifdef __RAY_DIFFERENTIALS__
|
2016-10-24 12:26:12 +02:00
|
|
|
if (use_stereo) {
|
2024-03-24 17:20:16 +01:00
|
|
|
spherical_stereo_transform(cam, &Pcenter, &Dcenter);
|
2018-01-12 02:14:27 +01:00
|
|
|
spherical_stereo_transform(cam, &Px, &Dx);
|
|
|
|
|
spherical_stereo_transform(cam, &Py, &Dy);
|
2024-03-24 17:20:16 +01:00
|
|
|
|
|
|
|
|
differential3 dP;
|
|
|
|
|
Pcenter = transform_point(&cameratoworld, Pcenter);
|
|
|
|
|
dP.dx = transform_point(&cameratoworld, Px) - Pcenter;
|
|
|
|
|
dP.dy = transform_point(&cameratoworld, Py) - Pcenter;
|
|
|
|
|
ray->dP = differential_make_compact(dP);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ray->dP = differential_zero_compact();
|
2016-10-22 15:59:23 +02:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2024-03-24 17:20:16 +01:00
|
|
|
differential3 dD;
|
|
|
|
|
Dcenter = normalize(transform_direction(&cameratoworld, Dcenter));
|
|
|
|
|
dD.dx = normalize(transform_direction(&cameratoworld, Dx)) - Dcenter;
|
|
|
|
|
dD.dy = normalize(transform_direction(&cameratoworld, Dy)) - Dcenter;
|
Cycles: merge of cycles-x branch, a major update to the renderer
This includes much improved GPU rendering performance, viewport interactivity,
new shadow catcher, revamped sampling settings, subsurface scattering anisotropy,
new GPU volume sampling, improved PMJ sampling pattern, and more.
Some features have also been removed or changed, breaking backwards compatibility.
Including the removal of the OpenCL backend, for which alternatives are under
development.
Release notes and code docs:
https://wiki.blender.org/wiki/Reference/Release_Notes/3.0/Cycles
https://wiki.blender.org/wiki/Source/Render/Cycles
Credits:
* Sergey Sharybin
* Brecht Van Lommel
* Patrick Mours (OptiX backend)
* Christophe Hery (subsurface scattering anisotropy)
* William Leeson (PMJ sampling pattern)
* Alaska (various fixes and tweaks)
* Thomas Dinges (various fixes)
For the full commit history, see the cycles-x branch. This squashes together
all the changes since intermediate changes would often fail building or tests.
Ref T87839, T87837, T87836
Fixes T90734, T89353, T80267, T80267, T77185, T69800
2021-09-20 17:59:20 +02:00
|
|
|
ray->dD = differential_make_compact(dD);
|
2012-02-28 16:44:54 +00:00
|
|
|
#endif
|
2016-10-15 00:11:42 +02:00
|
|
|
|
|
|
|
|
/* clipping */
|
2024-12-29 17:32:00 +01:00
|
|
|
const float nearclip = cam->nearclip;
|
2016-10-22 15:59:23 +02:00
|
|
|
ray->P += nearclip * ray->D;
|
Cycles: merge of cycles-x branch, a major update to the renderer
This includes much improved GPU rendering performance, viewport interactivity,
new shadow catcher, revamped sampling settings, subsurface scattering anisotropy,
new GPU volume sampling, improved PMJ sampling pattern, and more.
Some features have also been removed or changed, breaking backwards compatibility.
Including the removal of the OpenCL backend, for which alternatives are under
development.
Release notes and code docs:
https://wiki.blender.org/wiki/Reference/Release_Notes/3.0/Cycles
https://wiki.blender.org/wiki/Source/Render/Cycles
Credits:
* Sergey Sharybin
* Brecht Van Lommel
* Patrick Mours (OptiX backend)
* Christophe Hery (subsurface scattering anisotropy)
* William Leeson (PMJ sampling pattern)
* Alaska (various fixes and tweaks)
* Thomas Dinges (various fixes)
For the full commit history, see the cycles-x branch. This squashes together
all the changes since intermediate changes would often fail building or tests.
Ref T87839, T87837, T87836
Fixes T90734, T89353, T80267, T80267, T77185, T69800
2021-09-20 17:59:20 +02:00
|
|
|
ray->dP += nearclip * ray->dD;
|
2022-07-13 16:54:53 +02:00
|
|
|
ray->tmin = 0.0f;
|
|
|
|
|
ray->tmax = cam->cliplength;
|
2012-02-28 16:44:54 +00:00
|
|
|
}
|
|
|
|
|
|
2025-04-25 19:27:30 +02:00
|
|
|
ccl_device_inline Spectrum camera_sample_custom(KernelGlobals kg,
|
|
|
|
|
ccl_constant KernelCamera *cam,
|
|
|
|
|
const ccl_global DecomposedTransform *cam_motion,
|
|
|
|
|
const float2 raster,
|
|
|
|
|
const float2 rand_lens,
|
|
|
|
|
ccl_private Ray *ray)
|
|
|
|
|
{
|
|
|
|
|
#ifdef WITH_OSL
|
|
|
|
|
/* Transform raster position to camera space. */
|
|
|
|
|
const ProjectionTransform rastertocamera = cam->rastertocamera;
|
|
|
|
|
float3 sensor = transform_perspective(&rastertocamera, make_float3(raster.x, raster.y, 0.0f));
|
|
|
|
|
float3 dSdx = transform_perspective_direction(&rastertocamera, make_float3(1.0f, 0.0f, 0.0f));
|
|
|
|
|
float3 dSdy = transform_perspective_direction(&rastertocamera, make_float3(0.0f, 1.0f, 0.0f));
|
|
|
|
|
/* Execute OSL shader to sample position, direction and transmission. */
|
|
|
|
|
packed_float3 P, dPdx, dPdy, D, dDdx, dDdy, throughput;
|
|
|
|
|
throughput = osl_eval_camera(kg, sensor, dSdx, dSdy, rand_lens, P, dPdx, dPdy, D, dDdx, dDdy);
|
|
|
|
|
/* Zero throughput indicates failed sampling. */
|
|
|
|
|
if (is_zero(throughput)) {
|
|
|
|
|
return zero_spectrum();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
camera_sample_to_ray(cam,
|
|
|
|
|
cam_motion,
|
|
|
|
|
P,
|
|
|
|
|
D,
|
|
|
|
|
# ifdef __RAY_DIFFERENTIALS__
|
|
|
|
|
P,
|
|
|
|
|
D,
|
|
|
|
|
P + dPdx,
|
|
|
|
|
D + dDdx,
|
|
|
|
|
P + dPdy,
|
|
|
|
|
D + dDdy,
|
|
|
|
|
# endif
|
|
|
|
|
ray);
|
|
|
|
|
|
|
|
|
|
return throughput;
|
|
|
|
|
#else
|
|
|
|
|
(void)kg;
|
|
|
|
|
(void)cam;
|
|
|
|
|
(void)cam_motion;
|
|
|
|
|
(void)raster;
|
|
|
|
|
(void)rand_lens;
|
|
|
|
|
(void)ray;
|
|
|
|
|
return zero_spectrum();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Panorama Camera */
|
|
|
|
|
|
|
|
|
|
ccl_device_inline float3 camera_panorama_direction(ccl_constant KernelCamera *cam,
|
|
|
|
|
const float x,
|
|
|
|
|
const float y)
|
|
|
|
|
{
|
|
|
|
|
const ProjectionTransform rastertocamera = cam->rastertocamera;
|
|
|
|
|
const float3 Pcamera = transform_perspective(&rastertocamera, make_float3(x, y, 0.0f));
|
|
|
|
|
return panorama_to_direction(cam, Pcamera.x, Pcamera.y);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ccl_device_inline Spectrum camera_sample_panorama(ccl_constant KernelCamera *cam,
|
|
|
|
|
const ccl_global DecomposedTransform *cam_motion,
|
|
|
|
|
const float2 raster,
|
|
|
|
|
const float2 rand_lens,
|
|
|
|
|
ccl_private Ray *ray)
|
|
|
|
|
{
|
|
|
|
|
/* Create ray from raster position. */
|
|
|
|
|
float3 P = zero_float3();
|
|
|
|
|
float3 D = camera_panorama_direction(cam, raster.x, raster.y);
|
|
|
|
|
|
|
|
|
|
#ifdef __RAY_DIFFERENTIALS__
|
|
|
|
|
/* Ray differentials, computed from scratch using the raster coordinates
|
|
|
|
|
* because we don't want to be affected by depth of field. We compute
|
|
|
|
|
* ray origin and direction for the center and two neighboring pixels
|
|
|
|
|
* and simply take their differences. */
|
|
|
|
|
float3 Dcenter = D;
|
|
|
|
|
float3 Dx = camera_panorama_direction(cam, raster.x + 1.0f, raster.y);
|
|
|
|
|
float3 Dy = camera_panorama_direction(cam, raster.x, raster.y + 1.0f);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* Here, zero indicates failed sampling, e.g. when the raster position is outside
|
|
|
|
|
* the fisheye lens. */
|
|
|
|
|
if (is_zero(D)) {
|
|
|
|
|
return zero_spectrum();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Perform depth-of-field sampling. */
|
|
|
|
|
const float aperturesize = cam->aperturesize;
|
|
|
|
|
|
|
|
|
|
if (aperturesize > 0.0f) {
|
|
|
|
|
/* Sample a point on the aperture. */
|
|
|
|
|
const float2 lens_uv = camera_sample_aperture(cam, rand_lens) * aperturesize;
|
|
|
|
|
|
|
|
|
|
/* Compute the intersection of the original ray with the focal plane. */
|
|
|
|
|
const float3 Dfocus = normalize(D);
|
|
|
|
|
const float3 Pfocus = Dfocus * cam->focaldistance;
|
|
|
|
|
|
|
|
|
|
/* Calculate orthonormal coordinate system perpendicular to Dfocus. */
|
|
|
|
|
const float3 U = normalize(make_float3(1.0f, 0.0f, 0.0f) - Dfocus.x * Dfocus);
|
|
|
|
|
const float3 V = normalize(cross(Dfocus, U));
|
|
|
|
|
|
|
|
|
|
/* Compute new ray by shifting its origin (to account for aperture position) and
|
|
|
|
|
* setting its direction to meet the original ray at the focal plane. */
|
|
|
|
|
P = U * lens_uv.x + V * lens_uv.y;
|
|
|
|
|
D = normalize(Pfocus - P);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
camera_sample_to_ray(cam,
|
|
|
|
|
cam_motion,
|
|
|
|
|
P,
|
|
|
|
|
D,
|
|
|
|
|
#ifdef __RAY_DIFFERENTIALS__
|
|
|
|
|
zero_float3(),
|
|
|
|
|
Dcenter,
|
|
|
|
|
zero_float3(),
|
|
|
|
|
Dx,
|
|
|
|
|
zero_float3(),
|
|
|
|
|
Dy,
|
|
|
|
|
#endif
|
|
|
|
|
ray);
|
|
|
|
|
|
|
|
|
|
return one_spectrum();
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
/* Common */
|
|
|
|
|
|
2025-04-25 19:27:30 +02:00
|
|
|
/* Generates an outgoing camera ray for the given raster position and random inputs.
|
|
|
|
|
* Returns camera sensitivity (used to initialize path throughput). */
|
|
|
|
|
ccl_device_inline Spectrum camera_sample(KernelGlobals kg,
|
|
|
|
|
const int x,
|
|
|
|
|
const int y,
|
|
|
|
|
const float2 filter_uv,
|
|
|
|
|
const float time,
|
|
|
|
|
const float2 lens_uv,
|
|
|
|
|
ccl_private Ray *ray)
|
2011-04-27 11:58:34 +00:00
|
|
|
{
|
|
|
|
|
/* pixel filter */
|
2024-12-29 17:32:00 +01:00
|
|
|
const int filter_table_offset = kernel_data.tables.filter_table_offset;
|
2023-05-24 18:56:58 +02:00
|
|
|
const float2 raster = make_float2(
|
|
|
|
|
x + lookup_table_read(kg, filter_uv.x, filter_table_offset, FILTER_TABLE_SIZE),
|
|
|
|
|
y + lookup_table_read(kg, filter_uv.y, filter_table_offset, FILTER_TABLE_SIZE));
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2015-02-26 13:27:02 +01:00
|
|
|
/* motion blur */
|
2015-10-27 13:16:04 +05:00
|
|
|
if (kernel_data.cam.shuttertime == -1.0f) {
|
2016-09-02 21:37:17 -04:00
|
|
|
ray->time = 0.5f;
|
2015-10-27 13:16:04 +05:00
|
|
|
}
|
|
|
|
|
else {
|
2015-11-20 14:42:34 +05:00
|
|
|
/* TODO(sergey): Such lookup is unneeded when there's rolling shutter
|
2016-01-14 17:01:39 +05:00
|
|
|
* effect in use but rolling shutter duration is set to 0.0.
|
2015-11-20 14:42:34 +05:00
|
|
|
*/
|
2015-10-27 13:16:04 +05:00
|
|
|
const int shutter_table_offset = kernel_data.cam.shutter_table_offset;
|
|
|
|
|
ray->time = lookup_table_read(kg, time, shutter_table_offset, SHUTTER_TABLE_SIZE);
|
2015-11-20 14:42:34 +05:00
|
|
|
/* TODO(sergey): Currently single rolling shutter effect type only
|
2020-07-07 12:44:47 +10:00
|
|
|
* where scan-lines are acquired from top to bottom and whole scan-line
|
2015-11-20 14:42:34 +05:00
|
|
|
* is acquired at once (no delay in acquisition happens between pixels
|
2019-06-12 09:04:10 +10:00
|
|
|
* of single scan-line).
|
2015-11-20 14:42:34 +05:00
|
|
|
*
|
|
|
|
|
* Might want to support more models in the future.
|
|
|
|
|
*/
|
|
|
|
|
if (kernel_data.cam.rolling_shutter_type) {
|
|
|
|
|
/* Time corresponding to a fully rolling shutter only effect:
|
|
|
|
|
* top of the frame is time 0.0, bottom of the frame is time 1.0.
|
|
|
|
|
*/
|
|
|
|
|
const float time = 1.0f - (float)y / kernel_data.cam.height;
|
|
|
|
|
const float duration = kernel_data.cam.rolling_shutter_duration;
|
|
|
|
|
if (duration != 0.0f) {
|
|
|
|
|
/* This isn't fully physical correct, but lets us to have simple
|
|
|
|
|
* controls in the interface. The idea here is basically sort of
|
|
|
|
|
* linear interpolation between how much rolling shutter effect
|
|
|
|
|
* exist on the frame and how much of it is a motion blur effect.
|
|
|
|
|
*/
|
|
|
|
|
ray->time = (ray->time - 0.5f) * duration;
|
|
|
|
|
ray->time += (time - 0.5f) * (1.0f - duration) + 0.5f;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ray->time = time;
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-10-27 13:16:04 +05:00
|
|
|
}
|
2015-02-26 13:27:02 +01:00
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
/* sample */
|
2018-03-10 01:36:09 +01:00
|
|
|
if (kernel_data.cam.type == CAMERA_PERSPECTIVE) {
|
2025-04-25 19:27:30 +02:00
|
|
|
return camera_sample_perspective(kg, raster, lens_uv, ray);
|
|
|
|
|
}
|
|
|
|
|
if (kernel_data.cam.type == CAMERA_ORTHOGRAPHIC) {
|
|
|
|
|
return camera_sample_orthographic(kg, raster, lens_uv, ray);
|
2018-03-10 01:36:09 +01:00
|
|
|
}
|
2025-04-25 19:27:30 +02:00
|
|
|
if (kernel_data.cam.type == CAMERA_PANORAMA) {
|
|
|
|
|
const ccl_global DecomposedTransform *cam_motion = kernel_data_array(camera_motion);
|
|
|
|
|
return camera_sample_panorama(&kernel_data.cam, cam_motion, raster, lens_uv, ray);
|
2018-03-10 01:36:09 +01:00
|
|
|
}
|
2025-04-25 19:27:30 +02:00
|
|
|
if (kernel_data.cam.type == CAMERA_CUSTOM) {
|
2024-12-29 17:32:00 +01:00
|
|
|
const ccl_global DecomposedTransform *cam_motion = kernel_data_array(camera_motion);
|
2025-04-25 19:27:30 +02:00
|
|
|
return camera_sample_custom(kg, &kernel_data.cam, cam_motion, raster, lens_uv, ray);
|
2018-03-10 01:36:09 +01:00
|
|
|
}
|
2025-04-25 19:27:30 +02:00
|
|
|
kernel_assert(false);
|
|
|
|
|
return zero_spectrum();
|
2011-04-27 11:58:34 +00:00
|
|
|
}
|
|
|
|
|
|
2012-11-21 13:00:57 +00:00
|
|
|
/* Utilities */
|
|
|
|
|
|
2021-10-17 16:10:10 +02:00
|
|
|
ccl_device_inline float3 camera_position(KernelGlobals kg)
|
2013-06-08 10:51:33 +00:00
|
|
|
{
|
2024-12-29 17:32:00 +01:00
|
|
|
const Transform cameratoworld = kernel_data.cam.cameratoworld;
|
2013-06-08 10:51:33 +00:00
|
|
|
return make_float3(cameratoworld.x.w, cameratoworld.y.w, cameratoworld.z.w);
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-01 18:15:54 +01:00
|
|
|
ccl_device_inline float camera_distance(KernelGlobals kg, const float3 P)
|
2012-11-21 13:00:57 +00:00
|
|
|
{
|
2024-12-29 17:32:00 +01:00
|
|
|
const Transform cameratoworld = kernel_data.cam.cameratoworld;
|
|
|
|
|
const float3 camP = make_float3(cameratoworld.x.w, cameratoworld.y.w, cameratoworld.z.w);
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2012-11-21 13:00:57 +00:00
|
|
|
if (kernel_data.cam.type == CAMERA_ORTHOGRAPHIC) {
|
2024-12-29 17:32:00 +01:00
|
|
|
const float3 camD = make_float3(cameratoworld.x.z, cameratoworld.y.z, cameratoworld.z.z);
|
2012-11-21 13:00:57 +00:00
|
|
|
return fabsf(dot((P - camP), camD));
|
|
|
|
|
}
|
2024-12-26 17:53:59 +01:00
|
|
|
return len(P - camP);
|
2020-05-10 16:12:46 +02:00
|
|
|
}
|
|
|
|
|
|
2025-01-01 18:15:54 +01:00
|
|
|
ccl_device_inline float camera_z_depth(KernelGlobals kg, const float3 P)
|
2020-05-10 16:12:46 +02:00
|
|
|
{
|
2025-04-25 19:27:30 +02:00
|
|
|
if (kernel_data.cam.type == CAMERA_PERSPECTIVE || kernel_data.cam.type == CAMERA_ORTHOGRAPHIC) {
|
2024-12-29 17:32:00 +01:00
|
|
|
const Transform worldtocamera = kernel_data.cam.worldtocamera;
|
2020-05-10 16:12:46 +02:00
|
|
|
return transform_point(&worldtocamera, P).z;
|
|
|
|
|
}
|
2024-12-29 17:32:00 +01:00
|
|
|
const Transform cameratoworld = kernel_data.cam.cameratoworld;
|
|
|
|
|
const float3 camP = make_float3(cameratoworld.x.w, cameratoworld.y.w, cameratoworld.z.w);
|
2024-12-26 17:53:59 +01:00
|
|
|
return len(P - camP);
|
2012-11-21 13:00:57 +00:00
|
|
|
}
|
|
|
|
|
|
2025-01-01 18:15:54 +01:00
|
|
|
ccl_device_inline float3 camera_direction_from_point(KernelGlobals kg, const float3 P)
|
2014-05-27 10:56:59 -03:00
|
|
|
{
|
2024-12-29 17:32:00 +01:00
|
|
|
const Transform cameratoworld = kernel_data.cam.cameratoworld;
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2014-05-27 10:56:59 -03:00
|
|
|
if (kernel_data.cam.type == CAMERA_ORTHOGRAPHIC) {
|
2024-12-29 17:32:00 +01:00
|
|
|
const float3 camD = make_float3(cameratoworld.x.z, cameratoworld.y.z, cameratoworld.z.z);
|
2014-05-27 10:56:59 -03:00
|
|
|
return -camD;
|
|
|
|
|
}
|
2024-12-29 17:32:00 +01:00
|
|
|
const float3 camP = make_float3(cameratoworld.x.w, cameratoworld.y.w, cameratoworld.z.w);
|
2024-12-26 17:53:59 +01:00
|
|
|
return normalize(camP - P);
|
2014-05-27 10:56:59 -03:00
|
|
|
}
|
|
|
|
|
|
2021-10-17 16:10:10 +02:00
|
|
|
ccl_device_inline float3 camera_world_to_ndc(KernelGlobals kg,
|
Cycles: Kernel address space changes for MSL
This is the first of a sequence of changes to support compiling Cycles kernels as MSL (Metal Shading Language) in preparation for a Metal GPU device implementation.
MSL requires that all pointer types be declared with explicit address space attributes (device, thread, etc...). There is already precedent for this with Cycles' address space macros (ccl_global, ccl_private, etc...), therefore the first step of MSL-enablement is to apply these consistently. Line-for-line this represents the largest change required to enable MSL. Applying this change first will simplify future patches as well as offering the emergent benefit of enhanced descriptiveness.
The vast majority of deltas in this patch fall into one of two cases:
- Ensuring ccl_private is specified for thread-local pointer types
- Ensuring ccl_global is specified for device-wide pointer types
Additionally, the ccl_addr_space qualifier can be removed. Prior to Cycles X, ccl_addr_space was used as a context-dependent address space qualifier, but now it is either redundant (e.g. in struct typedefs), or can be replaced by ccl_global in the case of pointer types. Associated function variants (e.g. lcg_step_float_addrspace) are also redundant.
In cases where address space qualifiers are chained with "const", this patch places the address space qualifier first. The rationale for this is that the choice of address space is likely to have the greater impact on runtime performance and overall architecture.
The final part of this patch is the addition of a metal/compat.h header. This is partially complete and will be extended in future patches, paving the way for the full Metal implementation.
Ref T92212
Reviewed By: brecht
Maniphest Tasks: T92212
Differential Revision: https://developer.blender.org/D12864
2021-10-14 13:53:40 +01:00
|
|
|
ccl_private ShaderData *sd,
|
|
|
|
|
float3 P)
|
2013-06-08 10:51:33 +00:00
|
|
|
{
|
2025-04-25 19:27:30 +02:00
|
|
|
if (kernel_data.cam.type == CAMERA_PERSPECTIVE || kernel_data.cam.type == CAMERA_ORTHOGRAPHIC) {
|
2013-06-08 10:51:33 +00:00
|
|
|
/* perspective / ortho */
|
2024-12-26 17:53:59 +01:00
|
|
|
if (sd->object == PRIM_NONE && kernel_data.cam.type == CAMERA_PERSPECTIVE) {
|
2013-06-08 10:51:33 +00:00
|
|
|
P += camera_position(kg);
|
2024-12-26 17:53:59 +01:00
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2024-12-29 17:32:00 +01:00
|
|
|
const ProjectionTransform tfm = kernel_data.cam.worldtondc;
|
2013-06-08 10:51:33 +00:00
|
|
|
return transform_perspective(&tfm, P);
|
|
|
|
|
}
|
2025-04-25 19:27:30 +02:00
|
|
|
/* panorama or custom */
|
2024-12-29 17:32:00 +01:00
|
|
|
const Transform tfm = kernel_data.cam.worldtocamera;
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2024-12-26 17:53:59 +01:00
|
|
|
if (sd->object != OBJECT_NONE) {
|
|
|
|
|
P = normalize(transform_point(&tfm, P));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
P = normalize(transform_direction(&tfm, P));
|
|
|
|
|
}
|
2019-04-17 06:17:24 +02:00
|
|
|
|
2025-04-25 19:27:30 +02:00
|
|
|
if (kernel_data.cam.type == CAMERA_PANORAMA) {
|
|
|
|
|
return make_float3(direction_to_panorama(&kernel_data.cam, P));
|
|
|
|
|
}
|
2025-05-27 21:30:45 +02:00
|
|
|
/* TODO: Fall back to camera coordinates until we have inverse mappings for custom cameras. */
|
|
|
|
|
return P;
|
2013-06-08 10:51:33 +00:00
|
|
|
}
|
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
CCL_NAMESPACE_END
|