34 return expf(-2.0f *
v *
v);
40 return 0.35875f - 0.48829f *
cosf(
v) + 0.14128f *
cosf(2.0f *
v) - 0.01168f *
cosf(3.0f *
v);
92 SOCKET_FLOAT(pass_alpha_threshold,
"Pass Alpha Threshold", 0.0f);
111 static NodeEnum cryptomatte_passes_enum;
119 SOCKET_INT(cryptomatte_depth,
"Cryptomatte Depth", 0);
121 SOCKET_BOOLEAN(use_approximate_shadow_catcher,
"Use Approximate Shadow Catcher",
false);
147 scene->update_stats->film.times.add_entry({
"update", time});
151 device_free(device, dscene,
scene);
153 KernelFilm *kfilm = &dscene->data.film;
156 kfilm->exposure = exposure;
157 kfilm->pass_alpha_threshold = pass_alpha_threshold;
158 kfilm->pass_flag = 0;
160 kfilm->use_approximate_shadow_catcher = get_use_approximate_shadow_catcher();
162 kfilm->light_pass_flag = 0;
163 kfilm->pass_stride = 0;
200 kfilm->pass_shadow_catcher_sample_count =
PASS_UNUSED;
203 bool have_cryptomatte =
false;
204 bool have_aov_color =
false;
205 bool have_aov_value =
false;
206 bool have_lightgroup =
false;
208 for (
size_t i = 0; i <
scene->
passes.size(); i++) {
230 const int pass_flag = (1 << (pass->get_type() % 32));
232 kfilm->light_pass_flag |= pass_flag;
235 kfilm->pass_flag |= pass_flag;
241 if (pass->get_lightgroup() != ustring()) {
242 if (!have_lightgroup) {
243 kfilm->pass_lightgroup = kfilm->pass_stride;
244 have_lightgroup =
true;
250 switch (pass->get_type()) {
252 kfilm->pass_combined = kfilm->pass_stride;
255 kfilm->pass_depth = kfilm->pass_stride;
258 kfilm->pass_normal = kfilm->pass_stride;
261 kfilm->pass_position = kfilm->pass_stride;
264 kfilm->pass_roughness = kfilm->pass_stride;
267 kfilm->pass_uv = kfilm->pass_stride;
270 kfilm->pass_motion = kfilm->pass_stride;
273 kfilm->pass_motion_weight = kfilm->pass_stride;
276 kfilm->pass_object_id = kfilm->pass_stride;
279 kfilm->pass_material_id = kfilm->pass_stride;
283 kfilm->pass_mist = kfilm->pass_stride;
286 kfilm->pass_emission = kfilm->pass_stride;
289 kfilm->pass_background = kfilm->pass_stride;
292 kfilm->pass_ao = kfilm->pass_stride;
295 kfilm->pass_shadow = kfilm->pass_stride;
299 kfilm->pass_diffuse_color = kfilm->pass_stride;
302 kfilm->pass_glossy_color = kfilm->pass_stride;
305 kfilm->pass_transmission_color = kfilm->pass_stride;
308 kfilm->pass_diffuse_indirect = kfilm->pass_stride;
311 kfilm->pass_glossy_indirect = kfilm->pass_stride;
314 kfilm->pass_transmission_indirect = kfilm->pass_stride;
317 kfilm->pass_volume_indirect = kfilm->pass_stride;
320 kfilm->pass_diffuse_direct = kfilm->pass_stride;
323 kfilm->pass_glossy_direct = kfilm->pass_stride;
326 kfilm->pass_transmission_direct = kfilm->pass_stride;
329 kfilm->pass_volume_direct = kfilm->pass_stride;
333 kfilm->pass_bake_primitive = kfilm->pass_stride;
336 kfilm->pass_bake_differential = kfilm->pass_stride;
340 kfilm->pass_cryptomatte = have_cryptomatte ?
341 min(kfilm->pass_cryptomatte, kfilm->pass_stride) :
343 have_cryptomatte =
true;
347 kfilm->pass_denoising_normal = kfilm->pass_stride;
350 kfilm->pass_denoising_albedo = kfilm->pass_stride;
353 kfilm->pass_denoising_depth = kfilm->pass_stride;
357 kfilm->pass_shadow_catcher = kfilm->pass_stride;
360 kfilm->pass_shadow_catcher_sample_count = kfilm->pass_stride;
363 kfilm->pass_shadow_catcher_matte = kfilm->pass_stride;
367 kfilm->pass_adaptive_aux_buffer = kfilm->pass_stride;
370 kfilm->pass_sample_count = kfilm->pass_stride;
374 if (!have_aov_color) {
375 kfilm->pass_aov_color = kfilm->pass_stride;
376 have_aov_color =
true;
380 if (!have_aov_value) {
381 kfilm->pass_aov_value = kfilm->pass_stride;
382 have_aov_value =
true;
397 dscene->data.tables.filter_table_offset = (int)filter_table_offset_;
400 kfilm->mist_start = mist_start;
401 kfilm->mist_inv_depth = (mist_depth > 0.0f) ? 1.0f / mist_depth : 0.0f;
402 kfilm->mist_falloff = mist_falloff;
404 kfilm->cryptomatte_passes = cryptomatte_passes;
405 kfilm->cryptomatte_depth = cryptomatte_depth;
417 int offset_color = 0, offset_value = 0;
419 if (pass->get_name() ==
name) {
443 map<ustring, int> lightgroups;
446 ustring lightgroup = pass->get_lightgroup();
447 if (!lightgroup.empty()) {
448 if (!lightgroups.count(lightgroup)) {
449 lightgroups[lightgroup] = i++;
474 remove_auto_passes(
scene);
477 const PassType display_pass = get_display_pass();
478 add_auto_pass(
scene, display_pass);
490 if (adaptive_sampling.
use) {
496 const bool use_denoise = integrator->get_use_denoise();
498 if (integrator->get_use_denoise_pass_normal()) {
501 if (integrator->get_use_denoise_pass_albedo()) {
508 const bool need_background = get_use_approximate_shadow_catcher() &&
509 !background->get_transparent();
515 if (need_background) {
525 for (
const Pass *pass : passes_immutable) {
550 if (add_sample_count_pass) {
557 finalize_passes(
scene, use_denoise);
564 if (have_uv_pass != prev_have_uv_pass) {
569 if (have_motion_pass != prev_have_motion_pass) {
572 if (have_ao_pass != prev_have_ao_pass) {
576 prev_have_uv_pass = have_uv_pass;
577 prev_have_motion_pass = have_motion_pass;
578 prev_have_ao_pass = have_ao_pass;
599 pass->set_type(
type);
600 pass->set_mode(mode);
601 pass->set_name(ustring((
name) ?
name :
""));
615 new_passes.push_back(pass);
630 const int num_components_a =
a->get_info().num_components;
631 const int num_components_b =
b->get_info().num_components;
633 if (num_components_a == num_components_b) {
634 const int is_lightgroup_a = !
a->get_lightgroup().empty();
635 const int is_lightgroup_b = !
b->get_lightgroup().empty();
636 if (is_lightgroup_a == is_lightgroup_b) {
637 return (
a->get_type() <
b->get_type());
639 return is_lightgroup_b;
642 return num_components_a > num_components_b;
645 void Film::finalize_passes(
Scene *
scene,
const bool use_denoise)
657 bool duplicate_found =
false;
658 for (
Pass *new_pass : new_passes) {
660 if (new_pass->get_type() != pass->get_type() || new_pass->get_mode() != pass->get_mode()) {
666 if (!pass->get_name().empty() && !new_pass->get_name().empty() &&
667 pass->get_name() != new_pass->get_name()) {
671 if (!pass->get_name().empty() && new_pass->get_name().empty()) {
672 new_pass->set_name(pass->get_name());
676 duplicate_found =
true;
680 if (!duplicate_found) {
681 new_passes.push_back(pass);
698 uint kernel_features = 0;
705 const PassType pass_type = pass->get_type();
706 const PassMode pass_mode = pass->get_mode();
726 return kernel_features;
typedef float(TangentPoint)[2]
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
ATTR_WARN_UNUSED_RESULT const BMVert * v
int get_aov_offset(Scene *scene, string name, bool &is_color)
uint get_kernel_features(const Scene *scene) const
static void add_default(Scene *scene)
void update_passes(Scene *scene, bool add_sample_count_pass)
void device_free(Device *device, DeviceScene *dscene, Scene *scene)
void device_update(Device *device, DeviceScene *dscene, Scene *scene)
bool update_lightgroups(Scene *scene)
void tag_update(Scene *scene, uint32_t flag)
void tag_update(Scene *scene, uint32_t flag)
AdaptiveSampling get_adaptive_sampling() const
size_t add_table(DeviceScene *dscene, vector< float > &data)
void remove_table(size_t *offset)
PassInfo get_info() const
static const NodeEnum * get_type_enum()
static bool contains(const vector< Pass * > &passes, PassType type)
#define CCL_NAMESPACE_END
static float filter_func_gaussian(float v, float width)
static bool compare_pass_order(const Pass *a, const Pass *b)
static CCL_NAMESPACE_BEGIN float filter_func_box(float, float)
static float filter_func_blackman_harris(float v, float width)
static vector< float > filter_table(FilterType type, float width)
ccl_gpu_kernel_postfix ccl_global float int int int int int int int pass_stride
#define FILTER_TABLE_SIZE
@ KERNEL_FEATURE_LIGHT_PASSES
@ KERNEL_FEATURE_SHADOW_PASS
@ KERNEL_FEATURE_DENOISING
@ PASS_SHADOW_CATCHER_SAMPLE_COUNT
@ PASS_TRANSMISSION_DIRECT
@ PASS_TRANSMISSION_COLOR
@ PASS_SHADOW_CATCHER_MATTE
@ PASS_TRANSMISSION_INDIRECT
@ PASS_ADAPTIVE_AUX_BUFFER
@ PASS_CATEGORY_LIGHT_END
void util_cdf_inverted(const int resolution, const float from, const float to, Functor functor, const bool make_symmetric, vector< float > &inv_cdf)
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRefNull prop_name, int32_t value)
Allocate a new IDProperty of type IDP_INT, set its name and value.
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
#define SOCKET_FLOAT(name, ui_name, default_value,...)
#define SOCKET_INT(name, ui_name, default_value,...)
#define SOCKET_BOOLEAN(name, ui_name, default_value,...)
#define SOCKET_ENUM(name, ui_name, values, default_value,...)
void insert(const char *x, int y)
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=NULL)
void set_owner(const NodeOwner *owner_)
BakeManager * bake_manager
T * create_node(Args &&...args)
MotionType need_motion() const
vector< Shader * > shaders
LookupTables * lookup_tables
ObjectManager * object_manager
bool has_shadow_catcher()
map< ustring, int > lightgroups
SceneUpdateStats * update_stats
GeometryManager * geometry_manager