blender/intern/cycles/render/pass.h
Brecht Van Lommel 0803119725 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-21 14:55:54 +02:00

107 lines
3.1 KiB
C++

/*
* Copyright 2011-2021 Blender Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <ostream> // NOLINT
#include "util/util_string.h"
#include "util/util_vector.h"
#include "kernel/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)
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);
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);
/* 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