Blender V4.3
data_passes.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
7#include "kernel/geom/geom.h"
8
10
12#include "kernel/film/write.h"
13
15
17 size_t depth,
18 float id,
19 float matte_weight)
20{
21 film_write_cryptomatte_slots(buffer, depth * 2, id, matte_weight);
22 return depth * 4;
23}
24
27 ccl_private const ShaderData *sd,
29{
30#ifdef __PASSES__
31 const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag);
32
33 if (!(path_flag & PATH_RAY_TRANSPARENT_BACKGROUND)) {
34 return;
35 }
36
37 /* Don't write data passes for paths that were split off for shadow catchers
38 * to avoid double-counting. */
39 if (path_flag & PATH_RAY_SHADOW_CATCHER_PASS) {
40 return;
41 }
42
43 const int flag = kernel_data.film.pass_flag;
44
45 if (!(flag & PASS_ANY)) {
46 return;
47 }
48
50
51 if (!(path_flag & PATH_RAY_SINGLE_PASS_DONE)) {
52 if (INTEGRATOR_STATE(state, path, sample) == 0) {
53 if (flag & PASSMASK(DEPTH)) {
54 const float depth = camera_z_depth(kg, sd->P);
55 film_overwrite_pass_float(buffer + kernel_data.film.pass_depth, depth);
56 }
57 if (flag & PASSMASK(OBJECT_ID)) {
58 const float id = object_pass_id(kg, sd->object);
59 film_overwrite_pass_float(buffer + kernel_data.film.pass_object_id, id);
60 }
61 if (flag & PASSMASK(MATERIAL_ID)) {
62 const float id = shader_pass_id(kg, sd);
63 film_overwrite_pass_float(buffer + kernel_data.film.pass_material_id, id);
64 }
65 if (flag & PASSMASK(POSITION)) {
66 const float3 position = sd->P;
67 film_overwrite_pass_float3(buffer + kernel_data.film.pass_position, position);
68 }
69 }
70
71 if (!(sd->flag & (SD_TRANSPARENT | SD_RAY_PORTAL)) ||
72 kernel_data.film.pass_alpha_threshold == 0.0f ||
73 average(surface_shader_alpha(kg, sd)) >= kernel_data.film.pass_alpha_threshold)
74 {
75 if (flag & PASSMASK(NORMAL)) {
76 const float3 normal = surface_shader_average_normal(kg, sd);
77 film_write_pass_float3(buffer + kernel_data.film.pass_normal, normal);
78 }
79 if (flag & PASSMASK(ROUGHNESS)) {
80 const float roughness = surface_shader_average_roughness(sd);
81 film_write_pass_float(buffer + kernel_data.film.pass_roughness, roughness);
82 }
83 if (flag & PASSMASK(UV)) {
84 const float3 uv = primitive_uv(kg, sd);
85 film_write_pass_float3(buffer + kernel_data.film.pass_uv, uv);
86 }
87 if (flag & PASSMASK(MOTION)) {
88 const float4 speed = primitive_motion_vector(kg, sd);
89 film_write_pass_float4(buffer + kernel_data.film.pass_motion, speed);
90 film_write_pass_float(buffer + kernel_data.film.pass_motion_weight, 1.0f);
91 }
92
94 }
95 }
96
97 if (kernel_data.film.cryptomatte_passes) {
98 const Spectrum throughput = INTEGRATOR_STATE(state, path, throughput);
99 const float matte_weight = average(throughput) *
100 (1.0f - average(surface_shader_transparency(kg, sd)));
101 if (matte_weight > 0.0f) {
102 ccl_global float *cryptomatte_buffer = buffer + kernel_data.film.pass_cryptomatte;
103 if (kernel_data.film.cryptomatte_passes & CRYPT_OBJECT) {
104 const float id = object_cryptomatte_id(kg, sd->object);
105 cryptomatte_buffer += film_write_cryptomatte_pass(
106 cryptomatte_buffer, kernel_data.film.cryptomatte_depth, id, matte_weight);
107 }
108 if (kernel_data.film.cryptomatte_passes & CRYPT_MATERIAL) {
109 const float id = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).cryptomatte_id;
110 cryptomatte_buffer += film_write_cryptomatte_pass(
111 cryptomatte_buffer, kernel_data.film.cryptomatte_depth, id, matte_weight);
112 }
113 if (kernel_data.film.cryptomatte_passes & CRYPT_ASSET) {
114 const float id = object_cryptomatte_asset_id(kg, sd->object);
115 cryptomatte_buffer += film_write_cryptomatte_pass(
116 cryptomatte_buffer, kernel_data.film.cryptomatte_depth, id, matte_weight);
117 }
118 }
119 }
120
121 if (flag & PASSMASK(DIFFUSE_COLOR)) {
122 const Spectrum throughput = INTEGRATOR_STATE(state, path, throughput);
123 film_write_pass_spectrum(buffer + kernel_data.film.pass_diffuse_color,
124 surface_shader_diffuse(kg, sd) * throughput);
125 }
126 if (flag & PASSMASK(GLOSSY_COLOR)) {
127 const Spectrum throughput = INTEGRATOR_STATE(state, path, throughput);
128 film_write_pass_spectrum(buffer + kernel_data.film.pass_glossy_color,
129 surface_shader_glossy(kg, sd) * throughput);
130 }
131 if (flag & PASSMASK(TRANSMISSION_COLOR)) {
132 const Spectrum throughput = INTEGRATOR_STATE(state, path, throughput);
133 film_write_pass_spectrum(buffer + kernel_data.film.pass_transmission_color,
134 surface_shader_transmission(kg, sd) * throughput);
135 }
136 if (flag & PASSMASK(MIST)) {
137 /* Bring depth into 0..1 range. */
138 const float mist_start = kernel_data.film.mist_start;
139 const float mist_inv_depth = kernel_data.film.mist_inv_depth;
140
141 const float depth = camera_distance(kg, sd->P);
142 float mist = saturatef((depth - mist_start) * mist_inv_depth);
143
144 /* Falloff */
145 const float mist_falloff = kernel_data.film.mist_falloff;
146
147 if (mist_falloff == 1.0f)
148 ;
149 else if (mist_falloff == 2.0f)
150 mist = mist * mist;
151 else if (mist_falloff == 0.5f)
152 mist = sqrtf(mist);
153 else
154 mist = powf(mist, mist_falloff);
155
156 /* Modulate by transparency */
157 const Spectrum throughput = INTEGRATOR_STATE(state, path, throughput);
158 const Spectrum alpha = surface_shader_alpha(kg, sd);
159 const float mist_output = (1.0f - mist) * average(throughput * alpha);
160
161 /* Note that the final value in the render buffer we want is 1 - mist_output,
162 * to avoid having to tracking this in the Integrator state we do the negation
163 * after rendering. */
164 film_write_pass_float(buffer + kernel_data.film.pass_mist, mist_output);
165 }
166#endif
167}
168
171{
172#ifdef __PASSES__
173 const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag);
174
175 if (!(path_flag & PATH_RAY_TRANSPARENT_BACKGROUND)) {
176 return;
177 }
178
179 /* Don't write data passes for paths that were split off for shadow catchers
180 * to avoid double-counting. */
181 if (path_flag & PATH_RAY_SHADOW_CATCHER_PASS) {
182 return;
183 }
184
185 const int flag = kernel_data.film.pass_flag;
186
187 if (!(flag & PASS_ANY)) {
188 return;
189 }
190
191 if (!(path_flag & PATH_RAY_SINGLE_PASS_DONE)) {
193
194 if (INTEGRATOR_STATE(state, path, sample) == 0) {
195 if (flag & PASSMASK(DEPTH)) {
196 film_overwrite_pass_float(buffer + kernel_data.film.pass_depth, 0.0f);
197 }
198 if (flag & PASSMASK(OBJECT_ID)) {
199 film_overwrite_pass_float(buffer + kernel_data.film.pass_object_id, 0.0f);
200 }
201 if (flag & PASSMASK(MATERIAL_ID)) {
202 film_overwrite_pass_float(buffer + kernel_data.film.pass_material_id, 0.0f);
203 }
204 if (flag & PASSMASK(POSITION)) {
205 film_overwrite_pass_float3(buffer + kernel_data.film.pass_position, zero_float3());
206 }
207 }
208 }
209#endif
210}
211
ccl_device_inline void film_write_cryptomatte_slots(ccl_global float *buffer, int num_slots, float id, float weight)
ccl_device_inline void film_write_data_passes_background(KernelGlobals kg, IntegratorState state, ccl_global float *ccl_restrict render_buffer)
CCL_NAMESPACE_BEGIN ccl_device_inline size_t film_write_cryptomatte_pass(ccl_global float *ccl_restrict buffer, size_t depth, float id, float matte_weight)
Definition data_passes.h:16
ccl_device_inline void film_write_data_passes(KernelGlobals kg, IntegratorState state, ccl_private const ShaderData *sd, ccl_global float *ccl_restrict render_buffer)
Definition data_passes.h:25
#define kernel_data
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_restrict
#define ccl_private
#define ccl_device_inline
#define ccl_global
#define powf(x, y)
#define CCL_NAMESPACE_END
#define saturatef(x)
#define sqrtf(x)
ccl_device_inline float camera_distance(KernelGlobals kg, float3 P)
ccl_device_inline float camera_z_depth(KernelGlobals kg, float3 P)
ccl_gpu_kernel_postfix ccl_global KernelWorkTile const int ccl_global float * render_buffer
ccl_device_inline float object_pass_id(KernelGlobals kg, int object)
ccl_device_inline float object_cryptomatte_asset_id(KernelGlobals kg, int object)
ccl_device int shader_pass_id(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device_inline float object_cryptomatte_id(KernelGlobals kg, int object)
@ SD_RAY_PORTAL
@ SD_TRANSPARENT
@ PATH_RAY_SHADOW_CATCHER_PASS
@ PATH_RAY_SINGLE_PASS_DONE
@ PATH_RAY_TRANSPARENT_BACKGROUND
@ CRYPT_ASSET
@ CRYPT_OBJECT
@ CRYPT_MATERIAL
ShaderData
@ SHADER_MASK
#define PASSMASK(pass)
#define PASS_ANY
ccl_device_inline float average(const float2 a)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
Definition math_float3.h:15
static ulong state[N]
ccl_device_forceinline float4 primitive_motion_vector(KernelGlobals kg, ccl_private const ShaderData *sd)
Definition primitive.h:266
ccl_device_forceinline float3 primitive_uv(KernelGlobals kg, ccl_private const ShaderData *sd)
Definition primitive.h:198
IntegratorStateCPU *ccl_restrict IntegratorState
Definition state.h:228
#define INTEGRATOR_STATE_WRITE(state, nested_struct, member)
Definition state.h:236
#define INTEGRATOR_STATE(state, nested_struct, member)
Definition state.h:235
unsigned int uint32_t
Definition stdint.h:80
ccl_device Spectrum surface_shader_diffuse(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device float3 surface_shader_average_normal(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device Spectrum surface_shader_glossy(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device Spectrum surface_shader_transparency(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device float surface_shader_average_roughness(ccl_private const ShaderData *sd)
ccl_device Spectrum surface_shader_alpha(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device Spectrum surface_shader_transmission(KernelGlobals kg, ccl_private const ShaderData *sd)
SPECTRUM_DATA_TYPE Spectrum
uint8_t flag
Definition wm_window.cc:138
ccl_device_inline void film_overwrite_pass_float3(ccl_global float *ccl_restrict buffer, float3 value)
Definition write.h:100
ccl_device_inline void film_write_pass_spectrum(ccl_global float *ccl_restrict buffer, Spectrum value)
Definition write.h:65
ccl_device_inline void film_write_pass_float3(ccl_global float *ccl_restrict buffer, float3 value)
Definition write.h:48
CCL_NAMESPACE_BEGIN ccl_device_forceinline ccl_global float * film_pass_pixel_render_buffer(KernelGlobals kg, ConstIntegratorState state, ccl_global float *ccl_restrict render_buffer)
Definition write.h:17
ccl_device_inline void film_write_pass_float4(ccl_global float *ccl_restrict buffer, float4 value)
Definition write.h:71
ccl_device_inline void film_overwrite_pass_float(ccl_global float *ccl_restrict buffer, float value)
Definition write.h:94
ccl_device_inline void film_write_pass_float(ccl_global float *ccl_restrict buffer, float value)
Definition write.h:39