Files
blender/intern/cycles/scene/pass.h
Lukas Stockner ad35453cd1 Cycles: Add support for light groups
Light groups are a type of pass that only contains lighting from a subset of light sources.
They are created in the View layer, and light sources (lamps, objects with emissive materials
and/or the environment) can be assigned to a group.

Currently, each light group ends up generating its own version of the Combined pass.
In the future, additional types of passes (e.g. shadowcatcher) might be getting their own
per-lightgroup versions.

The lightgroup creation and assignment is not Cycles-specific, so Eevee or external render
engines could make use of it in the future.

Note that Lightgroups are identified by their name - therefore, the name of the Lightgroup
in the View Layer and the name that's set in an object's settings must match for it to be
included.
Currently, changing a Lightgroup's name does not update objects - this is planned for the
future, along with other features such as denoising for light groups and viewing them in
preview renders.

Original patch by Alex Fuller (@mistaed), with some polishing by Lukas Stockner (@lukasstockner97).

Differential Revision: https://developer.blender.org/D12871
2022-04-02 06:14:27 +02:00

98 lines
2.8 KiB
C++

/* SPDX-License-Identifier: Apache-2.0
* Copyright 2011-2022 Blender Foundation */
#pragma once
#include <ostream> // NOLINT
#include "util/string.h"
#include "util/vector.h"
#include "kernel/types.h"
#include "graph/node.h"
CCL_NAMESPACE_BEGIN
const char *pass_type_as_string(const PassType type);
enum class PassMode {
NOISY,
DENOISED,
};
const char *pass_mode_as_string(PassMode mode);
std::ostream &operator<<(std::ostream &os, PassMode mode);
struct PassInfo {
int num_components = -1;
bool use_filter = false;
bool use_exposure = false;
bool is_written = true;
PassType divide_type = PASS_NONE;
PassType direct_type = PASS_NONE;
PassType indirect_type = PASS_NONE;
/* Pass access for read can not happen directly and needs some sort of compositing (for example,
* light passes due to divide_type, or shadow catcher pass. */
bool use_compositing = false;
/* Used to disable albedo pass for denoising.
* Light and shadow catcher passes should not have discontinuity in the denoised result based on
* the underlying albedo. */
bool use_denoising_albedo = true;
/* Pass supports denoising. */
bool support_denoise = false;
};
class Pass : public Node {
public:
NODE_DECLARE
NODE_SOCKET_API(PassType, type)
NODE_SOCKET_API(PassMode, mode)
NODE_SOCKET_API(ustring, name)
NODE_SOCKET_API(bool, include_albedo)
NODE_SOCKET_API(ustring, lightgroup)
Pass();
PassInfo get_info() const;
/* The pass is written by the render pipeline (kernel or denoiser). If the pass is written it
* will have pixels allocated in a RenderBuffer. Passes which are not written do not have their
* pixels allocated to save memory. */
bool is_written() const;
protected:
/* The has been created automatically as a requirement to various rendering functionality (such
* as adaptive sampling). */
bool is_auto_;
public:
static const NodeEnum *get_type_enum();
static const NodeEnum *get_mode_enum();
static PassInfo get_info(PassType type,
const bool include_albedo = false,
const bool is_lightgroup = false);
static bool contains(const vector<Pass *> &passes, PassType type);
/* Returns nullptr if there is no pass with the given name or type+mode. */
static const Pass *find(const vector<Pass *> &passes, const string &name);
static const Pass *find(const vector<Pass *> &passes,
PassType type,
PassMode mode = PassMode::NOISY,
const ustring &lightgroup = ustring());
/* Returns PASS_UNUSED if there is no corresponding pass. */
static int get_offset(const vector<Pass *> &passes, const Pass *pass);
friend class Film;
};
std::ostream &operator<<(std::ostream &os, const Pass &pass);
CCL_NAMESPACE_END