Blender V4.3
eevee_film.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
29#pragma once
30
31#include <string>
32
33#include "BLI_math_vector.hh"
34#include "BLI_set.hh"
35
36#include "DRW_render.hh"
37
39
40#include <sstream>
41
42namespace blender::eevee {
43
44class Instance;
45
46/* -------------------------------------------------------------------- */
50class Film {
51 public:
55 static constexpr bool use_box_filter = false;
56
57 private:
58 Instance &inst_;
59
61 GPUTexture *combined_final_tx_ = nullptr;
62
64 bool use_compute_;
65
70 Texture color_accum_tx_;
71 Texture value_accum_tx_;
73 Texture depth_tx_;
75 Texture cryptomatte_tx_;
77 SwapChain<Texture, 2> combined_tx_;
79 SwapChain<Texture, 2> weight_tx_;
80
81 PassSimple accumulate_ps_ = {"Film.Accumulate"};
82 PassSimple copy_ps_ = {"Film.Copy"};
83 PassSimple cryptomatte_post_ps_ = {"Film.Cryptomatte.Post"};
84
85 FilmData &data_;
86 int2 display_extent;
87
89 /* Store the pass types needed by the viewport compositor separately, because some passes might
90 * be enabled but not used by the viewport compositor, so they needn't be written. */
91 eViewLayerEEVEEPassType viewport_compositor_enabled_passes_ = eViewLayerEEVEEPassType(0);
92 PassCategory enabled_categories_ = PassCategory(0);
93 bool use_reprojection_ = false;
94
95 public:
96 Film(Instance &inst, FilmData &data) : inst_(inst), data_(data){};
97 ~Film(){};
98
99 void init(const int2 &full_extent, const rcti *output_rect);
100
101 void sync();
102 void end_sync();
103
105 {
106 return data_;
107 }
108
110 void accumulate(View &view, GPUTexture *combined_final_tx);
111
113 void cryptomatte_sort();
114
116 void display();
117
118 float *read_pass(eViewLayerEEVEEPassType pass_type, int layer_offset);
119 float *read_aov(ViewLayerAOV *aov);
120
121 GPUTexture *get_pass_texture(eViewLayerEEVEEPassType pass_type, int layer_offset);
122 GPUTexture *get_aov_texture(ViewLayerAOV *aov);
123
125
127
130 {
131 return data_.render_extent;
132 }
133
136 {
137 return data_.extent;
138 }
140 {
141 return data_.offset;
142 }
143
146 {
147 return display_extent;
148 }
149
152 {
153 return data_.overscan;
154 }
155
157 static int overscan_pixels_get(float overscan, int2 extent)
158 {
159 return math::ceil(max_ff(0.0f, overscan) * math::reduce_max(extent));
160 }
161
163 {
164 return data_.scaling_factor;
165 }
166
167 float2 pixel_jitter_get() const;
168
170 {
171 return data_.background_opacity;
172 }
173
175 int cryptomatte_layer_max_get() const;
176 int cryptomatte_layer_len_get() const;
177
193
202
203 /* Returns layer offset in the accumulation texture. -1 if the pass is not enabled. */
205 {
206 switch (pass_type) {
208 return data_.combined_id;
210 return data_.depth_id;
212 return data_.mist_id;
214 return data_.normal_id;
216 return data_.position_id;
218 return data_.vector_id;
220 return data_.diffuse_light_id;
222 return data_.diffuse_color_id;
224 return data_.specular_light_id;
226 return data_.specular_color_id;
228 return data_.volume_light_id;
230 return data_.emission_id;
232 return data_.environment_id;
234 return data_.shadow_id;
236 return data_.ambient_occlusion_id;
238 return data_.transparent_id;
240 return data_.cryptomatte_object_id;
242 return data_.cryptomatte_asset_id;
244 return data_.cryptomatte_material_id;
245 default:
246 return -1;
247 }
248 }
249
251 const ViewLayer *view_layer)
252 {
254
255 auto build_cryptomatte_passes = [&](const char *pass_name) {
256 const int num_cryptomatte_passes = (view_layer->cryptomatte_levels + 1) / 2;
257 for (int pass = 0; pass < num_cryptomatte_passes; pass++) {
258 std::stringstream ss;
259 ss.fill('0');
260 ss << pass_name;
261 ss.width(2);
262 ss << pass;
263 result.append(ss.str());
264 }
265 };
266
267 switch (pass_type) {
269 result.append(RE_PASSNAME_COMBINED);
270 break;
272 result.append(RE_PASSNAME_Z);
273 break;
275 result.append(RE_PASSNAME_MIST);
276 break;
278 result.append(RE_PASSNAME_NORMAL);
279 break;
281 result.append(RE_PASSNAME_POSITION);
282 break;
284 result.append(RE_PASSNAME_VECTOR);
285 break;
287 result.append(RE_PASSNAME_DIFFUSE_DIRECT);
288 break;
290 result.append(RE_PASSNAME_DIFFUSE_COLOR);
291 break;
293 result.append(RE_PASSNAME_GLOSSY_DIRECT);
294 break;
296 result.append(RE_PASSNAME_GLOSSY_COLOR);
297 break;
299 result.append(RE_PASSNAME_VOLUME_LIGHT);
300 break;
302 result.append(RE_PASSNAME_EMIT);
303 break;
305 result.append(RE_PASSNAME_ENVIRONMENT);
306 break;
308 result.append(RE_PASSNAME_SHADOW);
309 break;
311 result.append(RE_PASSNAME_AO);
312 break;
314 result.append(RE_PASSNAME_TRANSPARENT);
315 break;
317 build_cryptomatte_passes(RE_PASSNAME_CRYPTOMATTE_OBJECT);
318 break;
320 build_cryptomatte_passes(RE_PASSNAME_CRYPTOMATTE_ASSET);
321 break;
323 build_cryptomatte_passes(RE_PASSNAME_CRYPTOMATTE_MATERIAL);
324 break;
325 default:
326 BLI_assert(0);
327 break;
328 }
329 return result;
330 }
331
332 private:
333 void init_aovs(const Set<std::string> &passes_used_by_viewport_compositor);
334 void sync_mist();
335
339 void update_sample_table();
340
341 void init_pass(PassSimple &pass, GPUShader *sh);
342};
343
346} // namespace blender::eevee
#define BLI_assert(a)
Definition BLI_assert.h:50
MINLINE float max_ff(float a, float b)
#define ELEM(...)
eViewLayerEEVEEPassType
@ EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL
@ EEVEE_RENDER_PASS_AO
@ EEVEE_RENDER_PASS_NORMAL
@ EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT
@ EEVEE_RENDER_PASS_DIFFUSE_LIGHT
@ EEVEE_RENDER_PASS_VOLUME_LIGHT
@ EEVEE_RENDER_PASS_DIFFUSE_COLOR
@ EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET
@ EEVEE_RENDER_PASS_Z
@ EEVEE_RENDER_PASS_ENVIRONMENT
@ EEVEE_RENDER_PASS_COMBINED
@ EEVEE_RENDER_PASS_SPECULAR_LIGHT
@ EEVEE_RENDER_PASS_VECTOR
@ EEVEE_RENDER_PASS_SPECULAR_COLOR
@ EEVEE_RENDER_PASS_EMIT
@ EEVEE_RENDER_PASS_MIST
@ EEVEE_RENDER_PASS_TRANSPARENT
@ EEVEE_RENDER_PASS_SHADOW
@ EEVEE_RENDER_PASS_POSITION
#define RE_PASSNAME_COMBINED
#define RE_PASSNAME_CRYPTOMATTE_MATERIAL
#define RE_PASSNAME_NORMAL
#define RE_PASSNAME_CRYPTOMATTE_ASSET
#define RE_PASSNAME_VECTOR
#define RE_PASSNAME_EMIT
#define RE_PASSNAME_GLOSSY_COLOR
#define RE_PASSNAME_GLOSSY_DIRECT
#define RE_PASSNAME_SHADOW
#define RE_PASSNAME_MIST
#define RE_PASSNAME_ENVIRONMENT
#define RE_PASSNAME_POSITION
#define RE_PASSNAME_DIFFUSE_COLOR
#define RE_PASSNAME_AO
#define RE_PASSNAME_Z
#define RE_PASSNAME_VOLUME_LIGHT
#define RE_PASSNAME_CRYPTOMATTE_OBJECT
#define RE_PASSNAME_TRANSPARENT
#define RE_PASSNAME_DIFFUSE_DIRECT
struct GPUShader GPUShader
void init()
void fill(const T &value) const
float2 pixel_jitter_get() const
int2 film_offset_get() const
int2 display_extent_get() const
int render_overscan_get() const
int pass_id_get(eViewLayerEEVEEPassType pass_type) const
static bool pass_is_float3(eViewLayerEEVEEPassType pass_type)
GPUTexture * get_aov_texture(ViewLayerAOV *aov)
int scaling_factor_get() const
void accumulate(View &view, GPUTexture *combined_final_tx)
static const Vector< std::string > pass_to_render_pass_names(eViewLayerEEVEEPassType pass_type, const ViewLayer *view_layer)
int cryptomatte_layer_max_get() const
int cryptomatte_layer_len_get() const
static ePassStorageType pass_storage_type(eViewLayerEEVEEPassType pass_type)
float * read_pass(eViewLayerEEVEEPassType pass_type, int layer_offset)
int2 film_extent_get() const
void write_viewport_compositor_passes()
static int overscan_pixels_get(float overscan, int2 extent)
const FilmData & get_data()
int2 render_extent_get() const
bool is_viewport_compositor_enabled() const
AOVsInfoDataBuf aovs_info
Definition eevee_film.hh:53
float * read_aov(ViewLayerAOV *aov)
Definition eevee_film.cc:98
GPUTexture * get_pass_texture(eViewLayerEEVEEPassType pass_type, int layer_offset)
eViewLayerEEVEEPassType enabled_passes_get() const
Film(Instance &inst, FilmData &data)
Definition eevee_film.hh:96
float background_opacity_get() const
static constexpr bool use_box_filter
Definition eevee_film.hh:55
A running instance of the engine.
detail::Pass< command::DrawCommandBuf > PassSimple
T reduce_max(const VecBase< T, Size > &a)
T ceil(const T &a)
short cryptomatte_levels