Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2021-09-20 18:59:20 +0300
committerBrecht Van Lommel <brecht@blender.org>2021-09-21 15:55:54 +0300
commit08031197250aeecbaca3803254e6f25b8c7b7b37 (patch)
tree6fe7ab045f0dc0a423d6557c4073f34309ef4740 /intern/cycles/blender/addon
parentfa6b1007bad065440950cd67deb16a04f368856f (diff)
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
Diffstat (limited to 'intern/cycles/blender/addon')
-rw-r--r--intern/cycles/blender/addon/__init__.py9
-rw-r--r--intern/cycles/blender/addon/engine.py132
-rw-r--r--intern/cycles/blender/addon/presets.py50
-rw-r--r--intern/cycles/blender/addon/properties.py499
-rw-r--r--intern/cycles/blender/addon/ui.py480
-rw-r--r--intern/cycles/blender/addon/version_update.py44
6 files changed, 401 insertions, 813 deletions
diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py
index f728050a3cf..1ce25a253f9 100644
--- a/intern/cycles/blender/addon/__init__.py
+++ b/intern/cycles/blender/addon/__init__.py
@@ -58,7 +58,6 @@ class CyclesRender(bpy.types.RenderEngine):
bl_use_eevee_viewport = True
bl_use_preview = True
bl_use_exclude_layers = True
- bl_use_save_buffers = True
bl_use_spherical_stereo = True
bl_use_custom_freestyle = True
bl_use_alembic_procedural = True
@@ -85,6 +84,12 @@ class CyclesRender(bpy.types.RenderEngine):
def render(self, depsgraph):
engine.render(self, depsgraph)
+ def render_frame_finish(self):
+ engine.render_frame_finish(self)
+
+ def draw(self, context, depsgraph):
+ engine.draw(self, depsgraph, context.space_data)
+
def bake(self, depsgraph, obj, pass_type, pass_filter, width, height):
engine.bake(self, depsgraph, obj, pass_type, pass_filter, width, height)
@@ -98,7 +103,7 @@ class CyclesRender(bpy.types.RenderEngine):
engine.sync(self, depsgraph, context.blend_data)
def view_draw(self, context, depsgraph):
- engine.draw(self, depsgraph, context.region, context.space_data, context.region_data)
+ engine.view_draw(self, depsgraph, context.region, context.space_data, context.region_data)
def update_script_node(self, node):
if engine.with_osl():
diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py
index 489a883f098..e0e8ca10bef 100644
--- a/intern/cycles/blender/addon/engine.py
+++ b/intern/cycles/blender/addon/engine.py
@@ -18,62 +18,17 @@
from __future__ import annotations
-def _is_using_buggy_driver():
- import gpu
- # We need to be conservative here because in multi-GPU systems display card
- # might be quite old, but others one might be just good.
- #
- # So We shouldn't disable possible good dedicated cards just because display
- # card seems weak. And instead we only blacklist configurations which are
- # proven to cause problems.
- if gpu.platform.vendor_get() == "ATI Technologies Inc.":
- import re
- version = gpu.platform.version_get()
- if version.endswith("Compatibility Profile Context"):
- # Old HD 4xxx and 5xxx series drivers did not have driver version
- # in the version string, but those cards do not quite work and
- # causing crashes.
- return True
- regex = re.compile(".*Compatibility Profile Context ([0-9]+(\\.[0-9]+)+)$")
- if not regex.match(version):
- # Skip cards like FireGL
- return False
- version = regex.sub("\\1", version).split('.')
- return int(version[0]) == 8
- return False
-
-
-def _workaround_buggy_drivers():
- if _is_using_buggy_driver():
- import _cycles
- if hasattr(_cycles, "opencl_disable"):
- print("Cycles: OpenGL driver known to be buggy, disabling OpenCL platform.")
- _cycles.opencl_disable()
-
-
def _configure_argument_parser():
import argparse
# No help because it conflicts with general Python scripts argument parsing
parser = argparse.ArgumentParser(description="Cycles Addon argument parser",
add_help=False)
- parser.add_argument("--cycles-resumable-num-chunks",
- help="Number of chunks to split sample range into",
- default=None)
- parser.add_argument("--cycles-resumable-current-chunk",
- help="Current chunk of samples range to render",
- default=None)
- parser.add_argument("--cycles-resumable-start-chunk",
- help="Start chunk to render",
- default=None)
- parser.add_argument("--cycles-resumable-end-chunk",
- help="End chunk to render",
- default=None)
parser.add_argument("--cycles-print-stats",
help="Print rendering statistics to stderr",
action='store_true')
parser.add_argument("--cycles-device",
help="Set the device to use for Cycles, overriding user preferences and the scene setting."
- "Valid options are 'CPU', 'CUDA', 'OPTIX' or 'OPENCL'."
+ "Valid options are 'CPU', 'CUDA' or 'OPTIX'."
"Additionally, you can append '+CPU' to any GPU type for hybrid rendering.",
default=None)
return parser
@@ -89,21 +44,6 @@ def _parse_command_line():
parser = _configure_argument_parser()
args, _ = parser.parse_known_args(argv[argv.index("--") + 1:])
- if args.cycles_resumable_num_chunks is not None:
- if args.cycles_resumable_current_chunk is not None:
- import _cycles
- _cycles.set_resumable_chunk(
- int(args.cycles_resumable_num_chunks),
- int(args.cycles_resumable_current_chunk),
- )
- elif args.cycles_resumable_start_chunk is not None and \
- args.cycles_resumable_end_chunk:
- import _cycles
- _cycles.set_resumable_chunk_range(
- int(args.cycles_resumable_num_chunks),
- int(args.cycles_resumable_start_chunk),
- int(args.cycles_resumable_end_chunk),
- )
if args.cycles_print_stats:
import _cycles
_cycles.enable_print_stats()
@@ -118,23 +58,11 @@ def init():
import _cycles
import os.path
- # Workaround possibly buggy legacy drivers which crashes on the OpenCL
- # device enumeration.
- #
- # This checks are not really correct because they might still fail
- # in the case of multiple GPUs. However, currently buggy drivers
- # are really old and likely to be used in single GPU systems only
- # anyway.
- #
- # Can't do it in the background mode, so we hope OpenCL is no enabled
- # in the user preferences.
- if not bpy.app.background:
- _workaround_buggy_drivers()
-
path = os.path.dirname(__file__)
user_path = os.path.dirname(os.path.abspath(bpy.utils.user_resource('CONFIG', path='')))
+ temp_path = bpy.app.tempdir
- _cycles.init(path, user_path, bpy.app.background)
+ _cycles.init(path, user_path, temp_path, bpy.app.background)
_parse_command_line()
@@ -177,6 +105,25 @@ def render(engine, depsgraph):
_cycles.render(engine.session, depsgraph.as_pointer())
+def render_frame_finish(engine):
+ if not engine.session:
+ return
+
+ import _cycles
+ _cycles.render_frame_finish(engine.session)
+
+def draw(engine, depsgraph, space_image):
+ if not engine.session:
+ return
+
+ depsgraph_ptr = depsgraph.as_pointer()
+ space_image_ptr = space_image.as_pointer()
+ screen_ptr = space_image.id_data.as_pointer()
+
+ import _cycles
+ _cycles.draw(engine.session, depsgraph_ptr, screen_ptr, space_image_ptr)
+
+
def bake(engine, depsgraph, obj, pass_type, pass_filter, width, height):
import _cycles
session = getattr(engine, "session", None)
@@ -204,14 +151,14 @@ def sync(engine, depsgraph, data):
_cycles.sync(engine.session, depsgraph.as_pointer())
-def draw(engine, depsgraph, region, v3d, rv3d):
+def view_draw(engine, depsgraph, region, v3d, rv3d):
import _cycles
depsgraph = depsgraph.as_pointer()
v3d = v3d.as_pointer()
rv3d = rv3d.as_pointer()
# draw render image
- _cycles.draw(engine.session, depsgraph, v3d, rv3d)
+ _cycles.view_draw(engine.session, depsgraph, v3d, rv3d)
def available_devices():
@@ -224,11 +171,6 @@ def with_osl():
return _cycles.with_osl
-def with_network():
- import _cycles
- return _cycles.with_network
-
-
def system_info():
import _cycles
return _cycles.system_info()
@@ -243,6 +185,7 @@ def list_render_passes(scene, srl):
# Data passes.
if srl.use_pass_z: yield ("Depth", "Z", 'VALUE')
if srl.use_pass_mist: yield ("Mist", "Z", 'VALUE')
+ if srl.use_pass_position: yield ("Position", "XYZ", 'VECTOR')
if srl.use_pass_normal: yield ("Normal", "XYZ", 'VECTOR')
if srl.use_pass_vector: yield ("Vector", "XYZW", 'VECTOR')
if srl.use_pass_uv: yield ("UV", "UVA", 'VECTOR')
@@ -265,6 +208,7 @@ def list_render_passes(scene, srl):
if srl.use_pass_environment: yield ("Env", "RGB", 'COLOR')
if srl.use_pass_shadow: yield ("Shadow", "RGB", 'COLOR')
if srl.use_pass_ambient_occlusion: yield ("AO", "RGB", 'COLOR')
+ if crl.use_pass_shadow_catcher: yield ("Shadow Catcher", "RGB", 'COLOR')
# Debug passes.
if crl.pass_debug_render_time: yield ("Debug Render Time", "X", 'VALUE')
@@ -283,30 +227,20 @@ def list_render_passes(scene, srl):
yield ("CryptoAsset" + '{:02d}'.format(i), "RGBA", 'COLOR')
# Denoising passes.
- if (scene.cycles.use_denoising and crl.use_denoising) or crl.denoising_store_passes:
+ if scene.cycles.use_denoising and crl.use_denoising:
yield ("Noisy Image", "RGBA", 'COLOR')
- if crl.denoising_store_passes:
- yield ("Denoising Normal", "XYZ", 'VECTOR')
- yield ("Denoising Albedo", "RGB", 'COLOR')
- yield ("Denoising Depth", "Z", 'VALUE')
-
- if scene.cycles.denoiser == 'NLM':
- yield ("Denoising Shadowing", "X", 'VALUE')
- yield ("Denoising Variance", "RGB", 'COLOR')
- yield ("Denoising Intensity", "X", 'VALUE')
-
- clean_options = ("denoising_diffuse_direct", "denoising_diffuse_indirect",
- "denoising_glossy_direct", "denoising_glossy_indirect",
- "denoising_transmission_direct", "denoising_transmission_indirect")
- if any(getattr(crl, option) for option in clean_options):
- yield ("Denoising Clean", "RGB", 'COLOR')
+ if crl.use_pass_shadow_catcher:
+ yield ("Noisy Shadow Catcher", "RGBA", 'COLOR')
+ if crl.denoising_store_passes:
+ yield ("Denoising Normal", "XYZ", 'VECTOR')
+ yield ("Denoising Albedo", "RGB", 'COLOR')
# Custom AOV passes.
for aov in srl.aovs:
if aov.type == 'VALUE':
yield (aov.name, "X", 'VALUE')
else:
- yield (aov.name, "RGBA", 'COLOR')
+ yield (aov.name, "RGB", 'COLOR')
def register_passes(engine, scene, view_layer):
diff --git a/intern/cycles/blender/addon/presets.py b/intern/cycles/blender/addon/presets.py
index bf33e5dc010..37c39904e30 100644
--- a/intern/cycles/blender/addon/presets.py
+++ b/intern/cycles/blender/addon/presets.py
@@ -60,32 +60,48 @@ class AddPresetSampling(AddPresetBase, Operator):
]
preset_values = [
+ "cycles.use_adaptive_sampling",
"cycles.samples",
- "cycles.preview_samples",
- "cycles.aa_samples",
- "cycles.preview_aa_samples",
- "cycles.diffuse_samples",
- "cycles.glossy_samples",
- "cycles.transmission_samples",
- "cycles.ao_samples",
- "cycles.mesh_light_samples",
- "cycles.subsurface_samples",
- "cycles.volume_samples",
- "cycles.use_square_samples",
- "cycles.progressive",
- "cycles.seed",
- "cycles.sample_clamp_direct",
- "cycles.sample_clamp_indirect",
- "cycles.sample_all_lights_direct",
- "cycles.sample_all_lights_indirect",
+ "cycles.adaptive_threshold",
+ "cycles.adaptive_min_samples",
+ "cycles.time_limit",
+ "cycles.use_denoising",
+ "cycles.denoiser",
+ "cycles.denoising_input_passes",
+ "cycles.denoising_prefilter",
]
preset_subdir = "cycles/sampling"
+class AddPresetViewportSampling(AddPresetBase, Operator):
+ '''Add a Viewport Sampling Preset'''
+ bl_idname = "render.cycles_viewport_sampling_preset_add"
+ bl_label = "Add Viewport Sampling Preset"
+ preset_menu = "CYCLES_PT_viewport_sampling_presets"
+
+ preset_defines = [
+ "cycles = bpy.context.scene.cycles"
+ ]
+
+ preset_values = [
+ "cycles.use_preview_adaptive_sampling",
+ "cycles.preview_samples",
+ "cycles.preview_adaptive_threshold",
+ "cycles.preview_adaptive_min_samples",
+ "cycles.use_preview_denoising",
+ "cycles.preview_denoiser",
+ "cycles.preview_denoising_input_passes",
+ "cycles.preview_denoising_prefilter",
+ "cycles.preview_denoising_start_sample",
+ ]
+
+ preset_subdir = "cycles/viewport_sampling"
+
classes = (
AddPresetIntegrator,
AddPresetSampling,
+ AddPresetViewportSampling,
)
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 0c3af3fabeb..c2570e71efd 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -39,11 +39,6 @@ enum_devices = (
('GPU', "GPU Compute", "Use GPU compute device for rendering, configured in the system tab in the user preferences"),
)
-from _cycles import with_network
-if with_network:
- enum_devices += (('NETWORK', "Networked Device", "Use networked device for rendering"),)
-del with_network
-
enum_feature_set = (
('SUPPORTED', "Supported", "Only use finished and supported features"),
('EXPERIMENTAL', "Experimental", "Use experimental and incomplete features that might be broken or change in the future", 'ERROR', 1),
@@ -84,15 +79,6 @@ enum_curve_shape = (
('THICK', "3D Curves", "Render hair as 3D curve, for accurate results when viewing hair close up"),
)
-enum_tile_order = (
- ('CENTER', "Center", "Render from center to the edges"),
- ('RIGHT_TO_LEFT', "Right to Left", "Render from right to left"),
- ('LEFT_TO_RIGHT', "Left to Right", "Render from left to right"),
- ('TOP_TO_BOTTOM', "Top to Bottom", "Render from top to bottom"),
- ('BOTTOM_TO_TOP', "Bottom to Top", "Render from bottom to top"),
- ('HILBERT_SPIRAL', "Hilbert Spiral", "Render in a Hilbert Spiral"),
-)
-
enum_use_layer_samples = (
('USE', "Use", "Per render layer number of samples override scene samples"),
('BOUNDED', "Bounded", "Bound per render layer number of samples by global samples"),
@@ -101,15 +87,9 @@ enum_use_layer_samples = (
enum_sampling_pattern = (
('SOBOL', "Sobol", "Use Sobol random sampling pattern"),
- ('CORRELATED_MUTI_JITTER', "Correlated Multi-Jitter", "Use Correlated Multi-Jitter random sampling pattern"),
('PROGRESSIVE_MUTI_JITTER', "Progressive Multi-Jitter", "Use Progressive Multi-Jitter random sampling pattern"),
)
-enum_integrator = (
- ('BRANCHED_PATH', "Branched Path Tracing", "Path tracing integrator that branches on the first bounce, giving more control over the number of light and material samples"),
- ('PATH', "Path Tracing", "Pure path tracing integrator"),
-)
-
enum_volume_sampling = (
('DISTANCE', "Distance", "Use distance sampling, best for dense volumes with lights far away"),
('EQUIANGULAR', "Equiangular", "Use equiangular sampling, best for volumes with low density with light inside or near the volume"),
@@ -131,7 +111,6 @@ enum_device_type = (
('CPU', "CPU", "CPU", 0),
('CUDA', "CUDA", "CUDA", 1),
('OPTIX', "OptiX", "OptiX", 3),
- ('OPENCL', "OpenCL", "OpenCL", 2)
)
enum_texture_limit = (
@@ -144,39 +123,46 @@ enum_texture_limit = (
('4096', "4096", "Limit texture size to 4096 pixels", 6),
('8192', "8192", "Limit texture size to 8192 pixels", 7),
)
-
+
+# NOTE: Identifiers are expected to be an upper case version of identifiers from `Pass::get_type_enum()`
enum_view3d_shading_render_pass = (
('', "General", ""),
- ('COMBINED', "Combined", "Show the Combined Render pass", 1),
- ('EMISSION', "Emission", "Show the Emission render pass", 33),
- ('BACKGROUND', "Background", "Show the Background render pass", 34),
- ('AO', "Ambient Occlusion", "Show the Ambient Occlusion render pass", 35),
+ ('COMBINED', "Combined", "Show the Combined Render pass"),
+ ('EMISSION', "Emission", "Show the Emission render pass"),
+ ('BACKGROUND', "Background", "Show the Background render pass"),
+ ('AO', "Ambient Occlusion", "Show the Ambient Occlusion render pass"),
+ ('SHADOW', "Shadow", "Show the Shadow render pass"),
+ ('SHADOW_CATCHER', "Shadow Catcher", "Show the Shadow Catcher render pass"),
('', "Light", ""),
- ('DIFFUSE_DIRECT', "Diffuse Direct", "Show the Diffuse Direct render pass", 38),
- ('DIFFUSE_INDIRECT', "Diffuse Indirect", "Show the Diffuse Indirect render pass", 39),
- ('DIFFUSE_COLOR', "Diffuse Color", "Show the Diffuse Color render pass", 40),
+ ('DIFFUSE_DIRECT', "Diffuse Direct", "Show the Diffuse Direct render pass"),
+ ('DIFFUSE_INDIRECT', "Diffuse Indirect", "Show the Diffuse Indirect render pass"),
+ ('DIFFUSE_COLOR', "Diffuse Color", "Show the Diffuse Color render pass"),
- ('GLOSSY_DIRECT', "Glossy Direct", "Show the Glossy Direct render pass", 41),
- ('GLOSSY_INDIRECT', "Glossy Indirect", "Show the Glossy Indirect render pass", 42),
- ('GLOSSY_COLOR', "Glossy Color", "Show the Glossy Color render pass", 43),
+ ('GLOSSY_DIRECT', "Glossy Direct", "Show the Glossy Direct render pass"),
+ ('GLOSSY_INDIRECT', "Glossy Indirect", "Show the Glossy Indirect render pass"),
+ ('GLOSSY_COLOR', "Glossy Color", "Show the Glossy Color render pass"),
('', "", ""),
- ('TRANSMISSION_DIRECT', "Transmission Direct", "Show the Transmission Direct render pass", 44),
- ('TRANSMISSION_INDIRECT', "Transmission Indirect", "Show the Transmission Indirect render pass", 45),
- ('TRANSMISSION_COLOR', "Transmission Color", "Show the Transmission Color render pass", 46),
+ ('TRANSMISSION_DIRECT', "Transmission Direct", "Show the Transmission Direct render pass"),
+ ('TRANSMISSION_INDIRECT', "Transmission Indirect", "Show the Transmission Indirect render pass"),
+ ('TRANSMISSION_COLOR', "Transmission Color", "Show the Transmission Color render pass"),
- ('VOLUME_DIRECT', "Volume Direct", "Show the Volume Direct render pass", 50),
- ('VOLUME_INDIRECT', "Volume Indirect", "Show the Volume Indirect render pass", 51),
+ ('VOLUME_DIRECT', "Volume Direct", "Show the Volume Direct render pass"),
+ ('VOLUME_INDIRECT', "Volume Indirect", "Show the Volume Indirect render pass"),
('', "Data", ""),
- ('NORMAL', "Normal", "Show the Normal render pass", 3),
- ('UV', "UV", "Show the UV render pass", 4),
- ('MIST', "Mist", "Show the Mist render pass", 32),
+ ('POSITION', "Position", "Show the Position render pass"),
+ ('NORMAL', "Normal", "Show the Normal render pass"),
+ ('UV', "UV", "Show the UV render pass"),
+ ('MIST', "Mist", "Show the Mist render pass"),
+ ('DENOISING_ALBEDO', "Denoising Albedo", "Albedo pass used by denoiser"),
+ ('DENOISING_NORMAL', "Denoising Normal", "Normal pass used by denoiser"),
+ ('SAMPLE_COUNT', "Sample Count", "Per-pixel number of samples"),
)
@@ -208,18 +194,23 @@ def enum_preview_denoiser(self, context):
def enum_denoiser(self, context):
- items = [('NLM', "NLM", "Cycles native non-local means denoiser, running on any compute device", 1)]
+ items = []
items += enum_optix_denoiser(self, context)
items += enum_openimagedenoise_denoiser(self, context)
return items
enum_denoising_input_passes = (
- ('RGB', "Color", "Use only color as input", 1),
- ('RGB_ALBEDO', "Color + Albedo", "Use color and albedo data as input", 2),
- ('RGB_ALBEDO_NORMAL', "Color + Albedo + Normal", "Use color, albedo and normal data as input", 3),
+ ('RGB', "None", "Don't use utility passes for denoising", 1),
+ ('RGB_ALBEDO', "Albedo", "Use albedo pass for denoising", 2),
+ ('RGB_ALBEDO_NORMAL', "Albedo and Normal", "Use albedo and normal passes for denoising", 3),
)
+enum_denoising_prefilter = (
+ ('NONE', "None", "No prefiltering, use when guiding passes are noise-free", 1),
+ ('FAST', "Fast", "Denoise color and guiding passes together. Improves quality when guiding passes are noisy using least amount of extra processing time", 2),
+ ('ACCURATE', "Accurate", "Prefilter noisy guiding passes before denoising color. Improves quality when guiding passes are noisy using extra processing time", 3),
+)
def update_render_passes(self, context):
scene = context.scene
@@ -252,13 +243,6 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
description="Use Open Shading Language (CPU rendering only)",
)
- progressive: EnumProperty(
- name="Integrator",
- description="Method to sample lights and materials",
- items=enum_integrator,
- default='PATH',
- )
-
preview_pause: BoolProperty(
name="Pause Preview",
description="Pause all viewport preview renders",
@@ -268,110 +252,88 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
use_denoising: BoolProperty(
name="Use Denoising",
description="Denoise the rendered image",
- default=False,
+ default=True,
update=update_render_passes,
)
- use_preview_denoising: BoolProperty(
- name="Use Viewport Denoising",
- description="Denoise the image in the 3D viewport",
- default=False,
- )
-
denoiser: EnumProperty(
name="Denoiser",
description="Denoise the image with the selected denoiser. "
- "For denoising the image after rendering, denoising data render passes "
- "also adapt to the selected denoiser",
+ "For denoising the image after rendering",
items=enum_denoiser,
- default=1,
+ default=4, # Use integer to avoid error in builds without OpenImageDenoise.
update=update_render_passes,
)
+ denoising_prefilter: EnumProperty(
+ name="Denoising Prefilter",
+ description="Prefilter noisy guiding (albedo and normal) passes to improve denoising quality when using OpenImageDenoiser",
+ items=enum_denoising_prefilter,
+ default='ACCURATE',
+ )
+ denoising_input_passes: EnumProperty(
+ name="Denoising Input Passes",
+ description="Passes used by the denoiser to distinguish noise from shader and geometry detail",
+ items=enum_denoising_input_passes,
+ default='RGB_ALBEDO_NORMAL',
+ )
+
+ use_preview_denoising: BoolProperty(
+ name="Use Viewport Denoising",
+ description="Denoise the image in the 3D viewport",
+ default=False,
+ )
preview_denoiser: EnumProperty(
name="Viewport Denoiser",
description="Denoise the image after each preview update with the selected denoiser",
items=enum_preview_denoiser,
default=0,
)
-
- use_square_samples: BoolProperty(
- name="Square Samples",
- description="Square sampling values for easier artist control",
- default=False,
+ preview_denoising_prefilter: EnumProperty(
+ name="Viewport Denoising Prefilter",
+ description="Prefilter noisy guiding (albedo and normal) passes to improve denoising quality when using OpenImageDenoiser",
+ items=enum_denoising_prefilter,
+ default='FAST',
+ )
+ preview_denoising_input_passes: EnumProperty(
+ name="Viewport Denoising Input Passes",
+ description="Passes used by the denoiser to distinguish noise from shader and geometry detail",
+ items=enum_denoising_input_passes,
+ default='RGB_ALBEDO',
+ )
+ preview_denoising_start_sample: IntProperty(
+ name="Start Denoising",
+ description="Sample to start denoising the preview at",
+ min=0, max=(1 << 24),
+ default=1,
)
samples: IntProperty(
name="Samples",
description="Number of samples to render for each pixel",
min=1, max=(1 << 24),
- default=128,
+ default=4096,
)
preview_samples: IntProperty(
name="Viewport Samples",
description="Number of samples to render in the viewport, unlimited if 0",
min=0, max=(1 << 24),
- default=32,
- )
- aa_samples: IntProperty(
- name="AA Samples",
- description="Number of antialiasing samples to render for each pixel",
- min=1, max=2097151,
- default=128,
- )
- preview_aa_samples: IntProperty(
- name="AA Samples",
- description="Number of antialiasing samples to render in the viewport, unlimited if 0",
- min=0, max=2097151,
- default=32,
+ default=1024,
)
- diffuse_samples: IntProperty(
- name="Diffuse Samples",
- description="Number of diffuse bounce samples to render for each AA sample",
- min=1, max=1024,
- default=1,
- )
- glossy_samples: IntProperty(
- name="Glossy Samples",
- description="Number of glossy bounce samples to render for each AA sample",
- min=1, max=1024,
- default=1,
- )
- transmission_samples: IntProperty(
- name="Transmission Samples",
- description="Number of transmission bounce samples to render for each AA sample",
- min=1, max=1024,
- default=1,
- )
- ao_samples: IntProperty(
- name="Ambient Occlusion Samples",
- description="Number of ambient occlusion samples to render for each AA sample",
- min=1, max=1024,
- default=1,
- )
- mesh_light_samples: IntProperty(
- name="Mesh Light Samples",
- description="Number of mesh emission light samples to render for each AA sample",
- min=1, max=1024,
- default=1,
- )
- subsurface_samples: IntProperty(
- name="Subsurface Samples",
- description="Number of subsurface scattering samples to render for each AA sample",
- min=1, max=1024,
- default=1,
- )
- volume_samples: IntProperty(
- name="Volume Samples",
- description="Number of volume scattering samples to render for each AA sample",
- min=1, max=1024,
- default=1,
+ time_limit: FloatProperty(
+ name="Time Limit",
+ description="Limit the render time (excluding synchronization time)."
+ "Zero disables the limit",
+ min=0.0,
+ default=0.0,
+ step=100.0,
+ unit='TIME_ABSOLUTE',
)
sampling_pattern: EnumProperty(
name="Sampling Pattern",
description="Random sampling pattern used by the integrator",
items=enum_sampling_pattern,
- default='SOBOL',
+ default='PROGRESSIVE_MUTI_JITTER',
)
use_layer_samples: EnumProperty(
@@ -381,17 +343,6 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
default='USE',
)
- sample_all_lights_direct: BoolProperty(
- name="Sample All Direct Lights",
- description="Sample all lights (for direct samples), rather than randomly picking one",
- default=True,
- )
-
- sample_all_lights_indirect: BoolProperty(
- name="Sample All Indirect Lights",
- description="Sample all lights (for indirect samples), rather than randomly picking one",
- default=True,
- )
light_sampling_threshold: FloatProperty(
name="Light Sampling Threshold",
description="Probabilistically terminate light samples when the light contribution is below this threshold (more noise but faster rendering). "
@@ -403,19 +354,39 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
use_adaptive_sampling: BoolProperty(
name="Use Adaptive Sampling",
description="Automatically reduce the number of samples per pixel based on estimated noise level",
- default=False,
+ default=True,
)
-
adaptive_threshold: FloatProperty(
name="Adaptive Sampling Threshold",
description="Noise level step to stop sampling at, lower values reduce noise at the cost of render time. Zero for automatic setting based on number of AA samples",
min=0.0, max=1.0,
- default=0.0,
+ soft_min=0.001,
+ default=0.01,
precision=4,
)
adaptive_min_samples: IntProperty(
name="Adaptive Min Samples",
- description="Minimum AA samples for adaptive sampling, to discover noisy features before stopping sampling. Zero for automatic setting based on number of AA samples",
+ description="Minimum AA samples for adaptive sampling, to discover noisy features before stopping sampling. Zero for automatic setting based on noise threshold",
+ min=0, max=4096,
+ default=0,
+ )
+
+ use_preview_adaptive_sampling: BoolProperty(
+ name="Use Adaptive Sampling",
+ description="Automatically reduce the number of samples per pixel based on estimated noise level, for viewport renders",
+ default=True,
+ )
+ preview_adaptive_threshold: FloatProperty(
+ name="Adaptive Sampling Threshold",
+ description="Noise level step to stop sampling at, lower values reduce noise at the cost of render time. Zero for automatic setting based on number of AA samples, for viewport renders",
+ min=0.0, max=1.0,
+ soft_min=0.001,
+ default=0.1,
+ precision=4,
+ )
+ preview_adaptive_min_samples: IntProperty(
+ name="Adaptive Min Samples",
+ description="Minimum AA samples for adaptive sampling, to discover noisy features before stopping sampling. Zero for automatic setting based on noise threshold, for viewport renders",
min=0, max=4096,
default=0,
)
@@ -632,53 +603,6 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
default=10.0,
)
- debug_tile_size: IntProperty(
- name="Tile Size",
- description="",
- min=1, max=4096,
- default=1024,
- )
-
- preview_start_resolution: IntProperty(
- name="Start Resolution",
- description="Resolution to start rendering preview at, "
- "progressively increasing it to the full viewport size",
- min=8, max=16384,
- default=64,
- subtype='PIXEL'
- )
- preview_denoising_start_sample: IntProperty(
- name="Start Denoising",
- description="Sample to start denoising the preview at",
- min=0, max=(1 << 24),
- default=1,
- )
- preview_denoising_input_passes: EnumProperty(
- name="Viewport Input Passes",
- description="Passes used by the denoiser to distinguish noise from shader and geometry detail",
- items=enum_denoising_input_passes,
- default='RGB_ALBEDO',
- )
-
- debug_reset_timeout: FloatProperty(
- name="Reset timeout",
- description="",
- min=0.01, max=10.0,
- default=0.1,
- )
- debug_cancel_timeout: FloatProperty(
- name="Cancel timeout",
- description="",
- min=0.01, max=10.0,
- default=0.1,
- )
- debug_text_timeout: FloatProperty(
- name="Text timeout",
- description="",
- min=0.01, max=10.0,
- default=1.0,
- )
-
debug_bvh_type: EnumProperty(
name="Viewport BVH Type",
description="Choose between faster updates, or faster render",
@@ -701,38 +625,24 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
default=0,
min=0, max=16,
)
- tile_order: EnumProperty(
- name="Tile Order",
- description="Tile order for rendering",
- items=enum_tile_order,
- default='HILBERT_SPIRAL',
- options=set(), # Not animatable!
- )
- use_progressive_refine: BoolProperty(
- name="Progressive Refine",
- description="Instead of rendering each tile until it is finished, "
- "refine the whole image progressively "
- "(this renders somewhat slower, "
- "but time can be saved by manually stopping the render when the noise is low enough)",
- default=False,
- )
bake_type: EnumProperty(
name="Bake Type",
default='COMBINED',
description="Type of pass to bake",
items=(
- ('COMBINED', "Combined", ""),
- ('AO', "Ambient Occlusion", ""),
- ('SHADOW', "Shadow", ""),
- ('NORMAL', "Normal", ""),
- ('UV', "UV", ""),
- ('ROUGHNESS', "Roughness", ""),
- ('EMIT', "Emit", ""),
- ('ENVIRONMENT', "Environment", ""),
- ('DIFFUSE', "Diffuse", ""),
- ('GLOSSY', "Glossy", ""),
- ('TRANSMISSION', "Transmission", ""),
+ ('COMBINED', "Combined", "", 0),
+ ('AO', "Ambient Occlusion", "", 1),
+ ('SHADOW', "Shadow", "", 2),
+ ('POSITION', "Position", "", 11),
+ ('NORMAL', "Normal", "", 3),
+ ('UV', "UV", "", 4),
+ ('ROUGHNESS', "Roughness", "", 5),
+ ('EMIT', "Emit", "", 6),
+ ('ENVIRONMENT', "Environment", "", 7),
+ ('DIFFUSE', "Diffuse", "", 8),
+ ('GLOSSY', "Glossy", "", 9),
+ ('TRANSMISSION', "Transmission", "", 10),
),
)
@@ -827,6 +737,18 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
min=0, max=1024,
)
+ use_auto_tile: BoolProperty(
+ name="Auto Tiles",
+ description="Automatically split image into tiles",
+ default=True,
+ )
+ tile_size: IntProperty(
+ name="Tile Size",
+ default=2048,
+ description="",
+ min=0, max=16384,
+ )
+
# Various fine-tuning debug flags
def _devices_update_callback(self, context):
@@ -844,45 +766,13 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
items=enum_bvh_layouts,
default='EMBREE',
)
- debug_use_cpu_split_kernel: BoolProperty(name="Split Kernel", default=False)
debug_use_cuda_adaptive_compile: BoolProperty(name="Adaptive Compile", default=False)
- debug_use_cuda_split_kernel: BoolProperty(name="Split Kernel", default=False)
-
- debug_optix_cuda_streams: IntProperty(name="CUDA Streams", default=1, min=1)
- debug_optix_curves_api: BoolProperty(name="Native OptiX Curve Primitive", default=False)
-
- debug_opencl_kernel_type: EnumProperty(
- name="OpenCL Kernel Type",
- default='DEFAULT',
- items=(
- ('DEFAULT', "Default", ""),
- ('MEGA', "Mega", ""),
- ('SPLIT', "Split", ""),
- ),
- update=CyclesRenderSettings._devices_update_callback
- )
- debug_opencl_device_type: EnumProperty(
- name="OpenCL Device Type",
- default='ALL',
- items=(
- ('NONE', "None", ""),
- ('ALL', "All", ""),
- ('DEFAULT', "Default", ""),
- ('CPU', "CPU", ""),
- ('GPU', "GPU", ""),
- ('ACCELERATOR', "Accelerator", ""),
- ),
- update=CyclesRenderSettings._devices_update_callback
- )
-
- debug_use_opencl_debug: BoolProperty(name="Debug OpenCL", default=False)
-
- debug_opencl_mem_limit: IntProperty(
- name="Memory limit",
- default=0,
- description="Artificial limit on OpenCL memory usage in MB (0 to disable limit)"
+ debug_use_optix_debug: BoolProperty(
+ name="OptiX Module Debug",
+ description="Load OptiX module in debug mode: lower logging verbosity level, enable validations, and lower optimization level",
+ default=False
)
@classmethod
@@ -1031,12 +921,6 @@ class CyclesLightSettings(bpy.types.PropertyGroup):
description="Light casts shadows",
default=True,
)
- samples: IntProperty(
- name="Samples",
- description="Number of light samples to render for each AA sample",
- min=1, max=10000,
- default=1,
- )
max_bounces: IntProperty(
name="Max Bounces",
description="Maximum number of bounces the light will contribute to the render",
@@ -1084,12 +968,6 @@ class CyclesWorldSettings(bpy.types.PropertyGroup):
min=4, max=8192,
default=1024,
)
- samples: IntProperty(
- name="Samples",
- description="Number of light samples to render for each AA sample",
- min=1, max=10000,
- default=1,
- )
max_bounces: IntProperty(
name="Max Bounces",
description="Maximum number of bounces the background light will contribute to the render",
@@ -1343,91 +1221,25 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
update=update_render_passes,
)
+ use_pass_shadow_catcher: BoolProperty(
+ name="Shadow Catcher",
+ description="Pass containing shadows and light which is to be multiplied into backdrop",
+ default=False,
+ update=update_render_passes,
+ )
+
use_denoising: BoolProperty(
name="Use Denoising",
description="Denoise the rendered image",
default=True,
update=update_render_passes,
)
- denoising_diffuse_direct: BoolProperty(
- name="Diffuse Direct",
- description="Denoise the direct diffuse lighting",
- default=True,
- )
- denoising_diffuse_indirect: BoolProperty(
- name="Diffuse Indirect",
- description="Denoise the indirect diffuse lighting",
- default=True,
- )
- denoising_glossy_direct: BoolProperty(
- name="Glossy Direct",
- description="Denoise the direct glossy lighting",
- default=True,
- )
- denoising_glossy_indirect: BoolProperty(
- name="Glossy Indirect",
- description="Denoise the indirect glossy lighting",
- default=True,
- )
- denoising_transmission_direct: BoolProperty(
- name="Transmission Direct",
- description="Denoise the direct transmission lighting",
- default=True,
- )
- denoising_transmission_indirect: BoolProperty(
- name="Transmission Indirect",
- description="Denoise the indirect transmission lighting",
- default=True,
- )
- denoising_strength: FloatProperty(
- name="Denoising Strength",
- description="Controls neighbor pixel weighting for the denoising filter (lower values preserve more detail, but aren't as smooth)",
- min=0.0, max=1.0,
- default=0.5,
- )
- denoising_feature_strength: FloatProperty(
- name="Denoising Feature Strength",
- description="Controls removal of noisy image feature passes (lower values preserve more detail, but aren't as smooth)",
- min=0.0, max=1.0,
- default=0.5,
- )
- denoising_radius: IntProperty(
- name="Denoising Radius",
- description="Size of the image area that's used to denoise a pixel (higher values are smoother, but might lose detail and are slower)",
- min=1, max=25,
- default=8,
- subtype="PIXEL",
- )
- denoising_relative_pca: BoolProperty(
- name="Relative Filter",
- description="When removing pixels that don't carry information, use a relative threshold instead of an absolute one (can help to reduce artifacts, but might cause detail loss around edges)",
- default=False,
- )
denoising_store_passes: BoolProperty(
name="Store Denoising Passes",
description="Store the denoising feature passes and the noisy image. The passes adapt to the denoiser selected for rendering",
default=False,
update=update_render_passes,
)
- denoising_neighbor_frames: IntProperty(
- name="Neighbor Frames",
- description="Number of neighboring frames to use for denoising animations (more frames produce smoother results at the cost of performance)",
- min=0, max=7,
- default=0,
- )
-
- denoising_optix_input_passes: EnumProperty(
- name="Input Passes",
- description="Passes used by the denoiser to distinguish noise from shader and geometry detail",
- items=enum_denoising_input_passes,
- default='RGB_ALBEDO',
- )
- denoising_openimagedenoise_input_passes: EnumProperty(
- name="Input Passes",
- description="Passes used by the denoiser to distinguish noise from shader and geometry detail",
- items=enum_denoising_input_passes,
- default='RGB_ALBEDO_NORMAL',
- )
@classmethod
def register(cls):
@@ -1454,14 +1266,12 @@ class CyclesPreferences(bpy.types.AddonPreferences):
def get_device_types(self, context):
import _cycles
- has_cuda, has_optix, has_opencl = _cycles.get_device_types()
+ has_cuda, has_optix = _cycles.get_device_types()
list = [('NONE', "None", "Don't use compute device", 0)]
if has_cuda:
list.append(('CUDA', "CUDA", "Use CUDA for GPU acceleration", 1))
if has_optix:
list.append(('OPTIX', "OptiX", "Use OptiX for GPU acceleration", 3))
- if has_opencl:
- list.append(('OPENCL', "OpenCL", "Use OpenCL for GPU acceleration", 2))
return list
compute_device_type: EnumProperty(
@@ -1486,7 +1296,7 @@ class CyclesPreferences(bpy.types.AddonPreferences):
def update_device_entries(self, device_list):
for device in device_list:
- if not device[1] in {'CUDA', 'OPTIX', 'OPENCL', 'CPU'}:
+ if not device[1] in {'CUDA', 'OPTIX', 'CPU'}:
continue
# Try to find existing Device entry
entry = self.find_existing_device_entry(device)
@@ -1520,22 +1330,23 @@ class CyclesPreferences(bpy.types.AddonPreferences):
elif entry.type == 'CPU':
cpu_devices.append(entry)
# Extend all GPU devices with CPU.
- if compute_device_type in {'CUDA', 'OPTIX', 'OPENCL'}:
+ if compute_device_type != 'CPU':
devices.extend(cpu_devices)
return devices
- # For backwards compatibility, only returns CUDA and OpenCL but still
- # refreshes all devices.
- def get_devices(self, compute_device_type=''):
+ # Refresh device list. This does not happen automatically on Blender
+ # startup due to unstable OpenCL implementations that can cause crashes.
+ def refresh_devices(self):
import _cycles
# Ensure `self.devices` is not re-allocated when the second call to
# get_devices_for_type is made, freeing items from the first list.
for device_type in ('CUDA', 'OPTIX', 'OPENCL'):
self.update_device_entries(_cycles.available_devices(device_type))
- cuda_devices = self.get_devices_for_type('CUDA')
- opencl_devices = self.get_devices_for_type('OPENCL')
- return cuda_devices, opencl_devices
+ # Deprecated: use refresh_devices instead.
+ def get_devices(self, compute_device_type=''):
+ self.refresh_devices()
+ return None
def get_num_gpu_devices(self):
import _cycles
@@ -1601,6 +1412,10 @@ class CyclesView3DShadingSettings(bpy.types.PropertyGroup):
items=enum_view3d_shading_render_pass,
default='COMBINED',
)
+ show_active_pixels: BoolProperty(
+ name="Show Active Pixels",
+ description="When using adaptive sampling highlight pixels which are being sampled",
+ )
def register():
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 47f7b4c6d73..d02627b9936 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -34,6 +34,12 @@ class CYCLES_PT_sampling_presets(PresetPanel, Panel):
preset_add_operator = "render.cycles_sampling_preset_add"
COMPAT_ENGINES = {'CYCLES'}
+class CYCLES_PT_viewport_sampling_presets(PresetPanel, Panel):
+ bl_label = "Viewport Sampling Presets"
+ preset_subdir = "cycles/viewport_sampling"
+ preset_operator = "script.execute_preset"
+ preset_add_operator = "render.cycles_viewport_sampling_preset_add"
+ COMPAT_ENGINES = {'CYCLES'}
class CYCLES_PT_integrator_presets(PresetPanel, Panel):
bl_label = "Integrator Presets"
@@ -54,6 +60,15 @@ class CyclesButtonsPanel:
return context.engine in cls.COMPAT_ENGINES
+class CyclesDebugButtonsPanel(CyclesButtonsPanel):
+ @classmethod
+ def poll(cls, context):
+ prefs = bpy.context.preferences
+ return (CyclesButtonsPanel.poll(context)
+ and prefs.experimental.use_cycles_debug
+ and prefs.view.show_developer_ui)
+
+
# Adapt properties editor panel to display in node editor. We have to
# copy the class rather than inherit due to the way bpy registration works.
def node_panel(cls):
@@ -78,12 +93,6 @@ def use_cpu(context):
return (get_device_type(context) == 'NONE' or cscene.device == 'CPU')
-def use_opencl(context):
- cscene = context.scene.cycles
-
- return (get_device_type(context) == 'OPENCL' and cscene.device == 'GPU')
-
-
def use_cuda(context):
cscene = context.scene.cycles
@@ -96,12 +105,6 @@ def use_optix(context):
return (get_device_type(context) == 'OPTIX' and cscene.device == 'GPU')
-def use_branched_path(context):
- cscene = context.scene.cycles
-
- return (cscene.progressive == 'BRANCHED_PATH' and not use_optix(context))
-
-
def use_sample_all_lights(context):
cscene = context.scene.cycles
@@ -115,57 +118,33 @@ def show_device_active(context):
return context.preferences.addons[__package__].preferences.has_active_device()
-def draw_samples_info(layout, context):
- cscene = context.scene.cycles
- integrator = cscene.progressive
+def get_effective_preview_denoiser(context):
+ scene = context.scene
+ cscene = scene.cycles
+
+ if cscene.preview_denoiser != "AUTO":
+ return cscene.preview_denoiser
+
+ if context.preferences.addons[__package__].preferences.get_devices_for_type('OPTIX'):
+ return 'OPTIX'
+
+ return 'OIDN'
- # Calculate sample values
- if integrator == 'PATH':
- aa = cscene.samples
- if cscene.use_square_samples:
- aa = aa * aa
- else:
- aa = cscene.aa_samples
- d = cscene.diffuse_samples
- g = cscene.glossy_samples
- t = cscene.transmission_samples
- ao = cscene.ao_samples
- ml = cscene.mesh_light_samples
- sss = cscene.subsurface_samples
- vol = cscene.volume_samples
-
- if cscene.use_square_samples:
- aa = aa * aa
- d = d * d
- g = g * g
- t = t * t
- ao = ao * ao
- ml = ml * ml
- sss = sss * sss
- vol = vol * vol
-
- # Draw interface
- # Do not draw for progressive, when Square Samples are disabled
- if use_branched_path(context) or (cscene.use_square_samples and integrator == 'PATH'):
- col = layout.column(align=True)
- col.scale_y = 0.6
- col.label(text="Total Samples:")
- col.separator()
- if integrator == 'PATH':
- col.label(text="%s AA" % aa)
- else:
- col.label(text="%s AA, %s Diffuse, %s Glossy, %s Transmission" %
- (aa, d * aa, g * aa, t * aa))
- col.separator()
- col.label(text="%s AO, %s Mesh Light, %s Subsurface, %s Volume" %
- (ao * aa, ml * aa, sss * aa, vol * aa))
class CYCLES_RENDER_PT_sampling(CyclesButtonsPanel, Panel):
bl_label = "Sampling"
+ def draw(self, context):
+ pass
+
+
+class CYCLES_RENDER_PT_sampling_viewport(CyclesButtonsPanel, Panel):
+ bl_label = "Viewport"
+ bl_parent_id = "CYCLES_RENDER_PT_sampling"
+
def draw_header_preset(self, context):
- CYCLES_PT_sampling_presets.draw_panel_header(self.layout)
+ CYCLES_PT_viewport_sampling_presets.draw_panel_header(self.layout)
def draw(self, context):
layout = self.layout
@@ -176,29 +155,31 @@ class CYCLES_RENDER_PT_sampling(CyclesButtonsPanel, Panel):
layout.use_property_split = True
layout.use_property_decorate = False
- if not use_optix(context):
- layout.prop(cscene, "progressive")
+ heading = layout.column(align=True, heading="Noise Threshold")
+ row = heading.row(align=True)
+ row.prop(cscene, "use_preview_adaptive_sampling", text="")
+ sub = row.row()
+ sub.active = cscene.use_preview_adaptive_sampling
+ sub.prop(cscene, "preview_adaptive_threshold", text="")
- if not use_branched_path(context):
+ if cscene.use_preview_adaptive_sampling:
col = layout.column(align=True)
- col.prop(cscene, "samples", text="Render")
- col.prop(cscene, "preview_samples", text="Viewport")
+ col.prop(cscene, "preview_samples", text=" Max Samples")
+ col.prop(cscene, "preview_adaptive_min_samples", text="Min Samples")
else:
- col = layout.column(align=True)
- col.prop(cscene, "aa_samples", text="Render")
- col.prop(cscene, "preview_aa_samples", text="Viewport")
+ layout.prop(cscene, "preview_samples", text="Samples")
- if not use_branched_path(context):
- draw_samples_info(layout, context)
+class CYCLES_RENDER_PT_sampling_viewport_denoise(CyclesButtonsPanel, Panel):
+ bl_label = "Denoise"
+ bl_parent_id = 'CYCLES_RENDER_PT_sampling_viewport'
+ bl_options = {'DEFAULT_CLOSED'}
-class CYCLES_RENDER_PT_sampling_sub_samples(CyclesButtonsPanel, Panel):
- bl_label = "Sub Samples"
- bl_parent_id = "CYCLES_RENDER_PT_sampling"
+ def draw_header(self, context):
+ scene = context.scene
+ cscene = scene.cycles
- @classmethod
- def poll(cls, context):
- return use_branched_path(context)
+ self.layout.prop(context.scene.cycles, "use_preview_denoising", text="")
def draw(self, context):
layout = self.layout
@@ -208,53 +189,61 @@ class CYCLES_RENDER_PT_sampling_sub_samples(CyclesButtonsPanel, Panel):
scene = context.scene
cscene = scene.cycles
- col = layout.column(align=True)
- col.prop(cscene, "diffuse_samples", text="Diffuse")
- col.prop(cscene, "glossy_samples", text="Glossy")
- col.prop(cscene, "transmission_samples", text="Transmission")
- col.prop(cscene, "ao_samples", text="AO")
+ col = layout.column()
+ col.active = cscene.use_preview_denoising
+ col.prop(cscene, "preview_denoiser", text="Denoiser")
+ col.prop(cscene, "preview_denoising_input_passes", text="Passes")
- sub = col.row(align=True)
- sub.active = use_sample_all_lights(context)
- sub.prop(cscene, "mesh_light_samples", text="Mesh Light")
- col.prop(cscene, "subsurface_samples", text="Subsurface")
- col.prop(cscene, "volume_samples", text="Volume")
+ effective_preview_denoiser = get_effective_preview_denoiser(context)
+ if effective_preview_denoiser == 'OPENIMAGEDENOISE':
+ col.prop(cscene, "preview_denoising_prefilter", text="Prefilter")
- draw_samples_info(layout, context)
+ col.prop(cscene, "preview_denoising_start_sample", text="Start Sample")
-class CYCLES_RENDER_PT_sampling_adaptive(CyclesButtonsPanel, Panel):
- bl_label = "Adaptive Sampling"
+class CYCLES_RENDER_PT_sampling_render(CyclesButtonsPanel, Panel):
+ bl_label = "Render"
bl_parent_id = "CYCLES_RENDER_PT_sampling"
- bl_options = {'DEFAULT_CLOSED'}
- def draw_header(self, context):
- layout = self.layout
- scene = context.scene
- cscene = scene.cycles
-
- layout.prop(cscene, "use_adaptive_sampling", text="")
+ def draw_header_preset(self, context):
+ CYCLES_PT_sampling_presets.draw_panel_header(self.layout)
def draw(self, context):
layout = self.layout
- layout.use_property_split = True
- layout.use_property_decorate = False
scene = context.scene
cscene = scene.cycles
- layout.active = cscene.use_adaptive_sampling
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ heading = layout.column(align=True, heading="Noise Threshold")
+ row = heading.row(align=True)
+ row.prop(cscene, "use_adaptive_sampling", text="")
+ sub = row.row()
+ sub.active = cscene.use_adaptive_sampling
+ sub.prop(cscene, "adaptive_threshold", text="")
col = layout.column(align=True)
- col.prop(cscene, "adaptive_threshold", text="Noise Threshold")
- col.prop(cscene, "adaptive_min_samples", text="Min Samples")
+ if cscene.use_adaptive_sampling:
+ col.prop(cscene, "samples", text=" Max Samples")
+ col.prop(cscene, "adaptive_min_samples", text="Min Samples")
+ else:
+ col.prop(cscene, "samples", text="Samples")
+ col.prop(cscene, "time_limit")
-class CYCLES_RENDER_PT_sampling_denoising(CyclesButtonsPanel, Panel):
- bl_label = "Denoising"
- bl_parent_id = "CYCLES_RENDER_PT_sampling"
+class CYCLES_RENDER_PT_sampling_render_denoise(CyclesButtonsPanel, Panel):
+ bl_label = "Denoise"
+ bl_parent_id = 'CYCLES_RENDER_PT_sampling_render'
bl_options = {'DEFAULT_CLOSED'}
+ def draw_header(self, context):
+ scene = context.scene
+ cscene = scene.cycles
+
+ self.layout.prop(context.scene.cycles, "use_denoising", text="")
+
def draw(self, context):
layout = self.layout
layout.use_property_split = True
@@ -263,33 +252,12 @@ class CYCLES_RENDER_PT_sampling_denoising(CyclesButtonsPanel, Panel):
scene = context.scene
cscene = scene.cycles
- heading = layout.column(align=True, heading="Render")
- row = heading.row(align=True)
- row.prop(cscene, "use_denoising", text="")
- sub = row.row()
-
- sub.active = cscene.use_denoising
- for view_layer in scene.view_layers:
- if view_layer.cycles.denoising_store_passes:
- sub.active = True
-
- sub.prop(cscene, "denoiser", text="")
-
- layout.separator()
-
- heading = layout.column(align=False, heading="Viewport")
- row = heading.row(align=True)
- row.prop(cscene, "use_preview_denoising", text="")
- sub = row.row()
- sub.active = cscene.use_preview_denoising
- sub.prop(cscene, "preview_denoiser", text="")
-
- sub = heading.row(align=True)
- sub.active = cscene.use_preview_denoising
- sub.prop(cscene, "preview_denoising_start_sample", text="Start Sample")
- sub = heading.row(align=True)
- sub.active = cscene.use_preview_denoising
- sub.prop(cscene, "preview_denoising_input_passes", text="Input Passes")
+ col = layout.column()
+ col.active = cscene.use_denoising
+ col.prop(cscene, "denoiser", text="Denoiser")
+ col.prop(cscene, "denoising_input_passes", text="Passes")
+ if cscene.denoiser == 'OPENIMAGEDENOISE':
+ col.prop(cscene, "denoising_prefilter", text="Prefilter")
class CYCLES_RENDER_PT_sampling_advanced(CyclesButtonsPanel, Panel):
@@ -313,8 +281,6 @@ class CYCLES_RENDER_PT_sampling_advanced(CyclesButtonsPanel, Panel):
col.active = not(cscene.use_adaptive_sampling)
col.prop(cscene, "sampling_pattern", text="Pattern")
- layout.prop(cscene, "use_square_samples")
-
layout.separator()
col = layout.column(align=True)
@@ -322,11 +288,6 @@ class CYCLES_RENDER_PT_sampling_advanced(CyclesButtonsPanel, Panel):
col.prop(cscene, "min_transparent_bounces")
col.prop(cscene, "light_sampling_threshold", text="Light Threshold")
- if cscene.progressive != 'PATH' and use_branched_path(context):
- col = layout.column(align=True)
- col.prop(cscene, "sample_all_lights_direct")
- col.prop(cscene, "sample_all_lights_indirect")
-
for view_layer in scene.view_layers:
if view_layer.samples > 0:
layout.separator()
@@ -334,62 +295,6 @@ class CYCLES_RENDER_PT_sampling_advanced(CyclesButtonsPanel, Panel):
break
-class CYCLES_RENDER_PT_sampling_total(CyclesButtonsPanel, Panel):
- bl_label = "Total Samples"
- bl_parent_id = "CYCLES_RENDER_PT_sampling"
-
- @classmethod
- def poll(cls, context):
- scene = context.scene
- cscene = scene.cycles
-
- if cscene.use_square_samples:
- return True
-
- return cscene.progressive != 'PATH' and use_branched_path(context)
-
- def draw(self, context):
- layout = self.layout
- cscene = context.scene.cycles
- integrator = cscene.progressive
-
- # Calculate sample values
- if integrator == 'PATH':
- aa = cscene.samples
- if cscene.use_square_samples:
- aa = aa * aa
- else:
- aa = cscene.aa_samples
- d = cscene.diffuse_samples
- g = cscene.glossy_samples
- t = cscene.transmission_samples
- ao = cscene.ao_samples
- ml = cscene.mesh_light_samples
- sss = cscene.subsurface_samples
- vol = cscene.volume_samples
-
- if cscene.use_square_samples:
- aa = aa * aa
- d = d * d
- g = g * g
- t = t * t
- ao = ao * ao
- ml = ml * ml
- sss = sss * sss
- vol = vol * vol
-
- col = layout.column(align=True)
- col.scale_y = 0.6
- if integrator == 'PATH':
- col.label(text="%s AA" % aa)
- else:
- col.label(text="%s AA, %s Diffuse, %s Glossy, %s Transmission" %
- (aa, d * aa, g * aa, t * aa))
- col.separator()
- col.label(text="%s AO, %s Mesh Light, %s Subsurface, %s Volume" %
- (ao * aa, ml * aa, sss * aa, vol * aa))
-
-
class CYCLES_RENDER_PT_subdivision(CyclesButtonsPanel, Panel):
bl_label = "Subdivision"
bl_options = {'DEFAULT_CLOSED'}
@@ -548,6 +453,8 @@ class CYCLES_RENDER_PT_light_paths_fast_gi(CyclesButtonsPanel, Panel):
layout.use_property_split = True
layout.use_property_decorate = False
+ layout.active = cscene.use_fast_gi
+
col = layout.column(align=True)
col.prop(cscene, "ao_bounces", text="Viewport Bounces")
col.prop(cscene, "ao_bounces_render", text="Render Bounces")
@@ -716,19 +623,13 @@ class CYCLES_RENDER_PT_performance_tiles(CyclesButtonsPanel, Panel):
layout.use_property_decorate = False
scene = context.scene
- rd = scene.render
cscene = scene.cycles
col = layout.column()
-
- sub = col.column(align=True)
- sub.prop(rd, "tile_x", text="Tiles X")
- sub.prop(rd, "tile_y", text="Y")
- col.prop(cscene, "tile_order", text="Order")
-
+ col.prop(cscene, "use_auto_tile")
sub = col.column()
- sub.active = not rd.use_save_buffers and not cscene.use_adaptive_sampling
- sub.prop(cscene, "use_progressive_refine")
+ sub.active = cscene.use_auto_tile
+ sub.prop(cscene, "tile_size")
class CYCLES_RENDER_PT_performance_acceleration_structure(CyclesButtonsPanel, Panel):
@@ -778,7 +679,6 @@ class CYCLES_RENDER_PT_performance_final_render(CyclesButtonsPanel, Panel):
col = layout.column()
- col.prop(rd, "use_save_buffers")
col.prop(rd, "use_persistent_data", text="Persistent Data")
@@ -797,7 +697,6 @@ class CYCLES_RENDER_PT_performance_viewport(CyclesButtonsPanel, Panel):
col = layout.column()
col.prop(rd, "preview_pixel_size", text="Pixel Size")
- col.prop(cscene, "preview_start_resolution", text="Start Pixels")
class CYCLES_RENDER_PT_filter(CyclesButtonsPanel, Panel):
@@ -818,7 +717,6 @@ class CYCLES_RENDER_PT_filter(CyclesButtonsPanel, Panel):
col = layout.column(heading="Include")
col.prop(view_layer, "use_sky", text="Environment")
- col.prop(view_layer, "use_ao", text="Ambient Occlusion")
col.prop(view_layer, "use_solid", text="Surfaces")
col.prop(view_layer, "use_strand", text="Hair")
col.prop(view_layer, "use_volumes", text="Volumes")
@@ -827,6 +725,9 @@ class CYCLES_RENDER_PT_filter(CyclesButtonsPanel, Panel):
sub = col.row()
sub.prop(view_layer, "use_motion_blur", text="Motion Blur")
sub.active = rd.use_motion_blur
+ sub = col.row()
+ sub.prop(view_layer.cycles, 'use_denoising', text='Denoising')
+ sub.active = scene.cycles.use_denoising
class CYCLES_RENDER_PT_override(CyclesButtonsPanel, Panel):
@@ -872,6 +773,7 @@ class CYCLES_RENDER_PT_passes_data(CyclesButtonsPanel, Panel):
col.prop(view_layer, "use_pass_combined")
col.prop(view_layer, "use_pass_z")
col.prop(view_layer, "use_pass_mist")
+ col.prop(view_layer, "use_pass_position")
col.prop(view_layer, "use_pass_normal")
sub = col.column()
sub.active = not rd.use_motion_blur
@@ -928,6 +830,7 @@ class CYCLES_RENDER_PT_passes_light(CyclesButtonsPanel, Panel):
col.prop(view_layer, "use_pass_environment")
col.prop(view_layer, "use_pass_shadow")
col.prop(view_layer, "use_pass_ambient_occlusion", text="Ambient Occlusion")
+ col.prop(cycles_view_layer, "use_pass_shadow_catcher")
class CYCLES_RENDER_PT_passes_crypto(CyclesButtonsPanel, ViewLayerCryptomattePanel, Panel):
@@ -942,70 +845,6 @@ class CYCLES_RENDER_PT_passes_aov(CyclesButtonsPanel, ViewLayerAOVPanel):
bl_parent_id = "CYCLES_RENDER_PT_passes"
-class CYCLES_RENDER_PT_denoising(CyclesButtonsPanel, Panel):
- bl_label = "Denoising"
- bl_context = "view_layer"
- bl_options = {'DEFAULT_CLOSED'}
-
- @classmethod
- def poll(cls, context):
- cscene = context.scene.cycles
- return CyclesButtonsPanel.poll(context) and cscene.use_denoising
-
- def draw_header(self, context):
- scene = context.scene
- view_layer = context.view_layer
- cycles_view_layer = view_layer.cycles
-
- layout = self.layout
- layout.prop(cycles_view_layer, "use_denoising", text="")
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
- layout.use_property_decorate = False
-
- scene = context.scene
- view_layer = context.view_layer
- cycles_view_layer = view_layer.cycles
- denoiser = scene.cycles.denoiser
-
- layout.active = denoiser != 'NONE' and cycles_view_layer.use_denoising
-
- col = layout.column()
-
- if denoiser == 'OPTIX':
- col.prop(cycles_view_layer, "denoising_optix_input_passes")
- return
- elif denoiser == 'OPENIMAGEDENOISE':
- col.prop(cycles_view_layer, "denoising_openimagedenoise_input_passes")
- return
-
- col.prop(cycles_view_layer, "denoising_radius", text="Radius")
-
- col = layout.column()
- col.prop(cycles_view_layer, "denoising_strength", slider=True, text="Strength")
- col.prop(cycles_view_layer, "denoising_feature_strength", slider=True, text="Feature Strength")
- col.prop(cycles_view_layer, "denoising_relative_pca")
-
- layout.separator()
-
- col = layout.column()
- col.active = cycles_view_layer.use_denoising or cycles_view_layer.denoising_store_passes
-
- row = col.row(heading="Diffuse", align=True)
- row.prop(cycles_view_layer, "denoising_diffuse_direct", text="Direct", toggle=True)
- row.prop(cycles_view_layer, "denoising_diffuse_indirect", text="Indirect", toggle=True)
-
- row = col.row(heading="Glossy", align=True)
- row.prop(cycles_view_layer, "denoising_glossy_direct", text="Direct", toggle=True)
- row.prop(cycles_view_layer, "denoising_glossy_indirect", text="Indirect", toggle=True)
-
- row = col.row(heading="Transmission", align=True)
- row.prop(cycles_view_layer, "denoising_transmission_direct", text="Direct", toggle=True)
- row.prop(cycles_view_layer, "denoising_transmission_indirect", text="Indirect", toggle=True)
-
-
class CYCLES_PT_post_processing(CyclesButtonsPanel, Panel):
bl_label = "Post Processing"
bl_options = {'DEFAULT_CLOSED'}
@@ -1417,10 +1256,6 @@ class CYCLES_LIGHT_PT_light(CyclesButtonsPanel, Panel):
if not (light.type == 'AREA' and clamp.is_portal):
sub = col.column()
- if use_branched_path(context):
- subsub = sub.row(align=True)
- subsub.active = use_sample_all_lights(context)
- subsub.prop(clamp, "samples")
sub.prop(clamp, "max_bounces")
sub = col.column(align=True)
@@ -1526,34 +1361,6 @@ class CYCLES_WORLD_PT_volume(CyclesButtonsPanel, Panel):
panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Volume')
-class CYCLES_WORLD_PT_ambient_occlusion(CyclesButtonsPanel, Panel):
- bl_label = "Ambient Occlusion"
- bl_context = "world"
- bl_options = {'DEFAULT_CLOSED'}
-
- @classmethod
- def poll(cls, context):
- return context.world and CyclesButtonsPanel.poll(context)
-
- def draw_header(self, context):
- light = context.world.light_settings
- self.layout.prop(light, "use_ambient_occlusion", text="")
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
- layout.use_property_decorate = False
-
- light = context.world.light_settings
- scene = context.scene
-
- col = layout.column()
- sub = col.column()
- sub.active = light.use_ambient_occlusion or scene.render.use_simplify
- sub.prop(light, "ao_factor", text="Factor")
- col.prop(light, "distance", text="Distance")
-
-
class CYCLES_WORLD_PT_mist(CyclesButtonsPanel, Panel):
bl_label = "Mist Pass"
bl_context = "world"
@@ -1650,10 +1457,6 @@ class CYCLES_WORLD_PT_settings_surface(CyclesButtonsPanel, Panel):
subsub = sub.row(align=True)
subsub.active = cworld.sampling_method == 'MANUAL'
subsub.prop(cworld, "sample_map_resolution")
- if use_branched_path(context):
- subsub = sub.column(align=True)
- subsub.active = use_sample_all_lights(context)
- subsub.prop(cworld, "samples")
sub.prop(cworld, "max_bounces")
@@ -1677,8 +1480,7 @@ class CYCLES_WORLD_PT_settings_volume(CyclesButtonsPanel, Panel):
col = layout.column()
sub = col.column()
- sub.active = use_cpu(context)
- sub.prop(cworld, "volume_sampling", text="Sampling")
+ col.prop(cworld, "volume_sampling", text="Sampling")
col.prop(cworld, "volume_interpolation", text="Interpolation")
col.prop(cworld, "homogeneous_volume", text="Homogeneous")
sub = col.column()
@@ -1817,8 +1619,7 @@ class CYCLES_MATERIAL_PT_settings_volume(CyclesButtonsPanel, Panel):
col = layout.column()
sub = col.column()
- sub.active = use_cpu(context)
- sub.prop(cmat, "volume_sampling", text="Sampling")
+ col.prop(cmat, "volume_sampling", text="Sampling")
col.prop(cmat, "volume_interpolation", text="Interpolation")
col.prop(cmat, "homogeneous_volume", text="Homogeneous")
sub = col.column()
@@ -1845,9 +1646,6 @@ class CYCLES_RENDER_PT_bake(CyclesButtonsPanel, Panel):
cbk = scene.render.bake
rd = scene.render
- if use_optix(context):
- layout.label(text="Baking is performed using CUDA instead of OptiX", icon='INFO')
-
if rd.use_bake_multires:
layout.operator("object.bake_image", icon='RENDER_STILL')
layout.prop(rd, "use_bake_multires")
@@ -1905,7 +1703,6 @@ class CYCLES_RENDER_PT_bake_influence(CyclesButtonsPanel, Panel):
col.prop(cbk, "use_pass_diffuse")
col.prop(cbk, "use_pass_glossy")
col.prop(cbk, "use_pass_transmission")
- col.prop(cbk, "use_pass_ambient_occlusion")
col.prop(cbk, "use_pass_emit")
elif cscene.bake_type in {'DIFFUSE', 'GLOSSY', 'TRANSMISSION'}:
@@ -1989,19 +1786,12 @@ class CYCLES_RENDER_PT_bake_output(CyclesButtonsPanel, Panel):
layout.prop(cbk, "use_clear", text="Clear Image")
-class CYCLES_RENDER_PT_debug(CyclesButtonsPanel, Panel):
+class CYCLES_RENDER_PT_debug(CyclesDebugButtonsPanel, Panel):
bl_label = "Debug"
bl_context = "render"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'CYCLES'}
- @classmethod
- def poll(cls, context):
- prefs = bpy.context.preferences
- return (CyclesButtonsPanel.poll(context)
- and prefs.experimental.use_cycles_debug
- and prefs.view.show_developer_ui)
-
def draw(self, context):
layout = self.layout
@@ -2018,29 +1808,18 @@ class CYCLES_RENDER_PT_debug(CyclesButtonsPanel, Panel):
row.prop(cscene, "debug_use_cpu_avx", toggle=True)
row.prop(cscene, "debug_use_cpu_avx2", toggle=True)
col.prop(cscene, "debug_bvh_layout")
- col.prop(cscene, "debug_use_cpu_split_kernel")
col.separator()
col = layout.column()
col.label(text="CUDA Flags:")
col.prop(cscene, "debug_use_cuda_adaptive_compile")
- col.prop(cscene, "debug_use_cuda_split_kernel")
col.separator()
col = layout.column()
col.label(text="OptiX Flags:")
- col.prop(cscene, "debug_optix_cuda_streams")
- col.prop(cscene, "debug_optix_curves_api")
-
- col.separator()
-
- col = layout.column()
- col.label(text="OpenCL Flags:")
- col.prop(cscene, "debug_opencl_device_type", text="Device")
- col.prop(cscene, "debug_use_opencl_debug", text="Debug")
- col.prop(cscene, "debug_opencl_mem_limit")
+ col.prop(cscene, "debug_use_optix_debug")
col.separator()
@@ -2141,20 +1920,22 @@ class CYCLES_RENDER_PT_simplify_culling(CyclesButtonsPanel, Panel):
sub.prop(cscene, "distance_cull_margin", text="")
-class CYCLES_VIEW3D_PT_shading_render_pass(Panel):
+class CyclesShadingButtonsPanel(CyclesButtonsPanel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'HEADER'
- bl_label = "Render Pass"
bl_parent_id = 'VIEW3D_PT_shading'
- COMPAT_ENGINES = {'CYCLES'}
@classmethod
def poll(cls, context):
return (
- context.engine in cls.COMPAT_ENGINES and
+ CyclesButtonsPanel.poll(context) and
context.space_data.shading.type == 'RENDERED'
)
+
+class CYCLES_VIEW3D_PT_shading_render_pass(CyclesShadingButtonsPanel, Panel):
+ bl_label = "Render Pass"
+
def draw(self, context):
shading = context.space_data.shading
@@ -2162,6 +1943,26 @@ class CYCLES_VIEW3D_PT_shading_render_pass(Panel):
layout.prop(shading.cycles, "render_pass", text="")
+class CYCLES_VIEW3D_PT_shading_debug(CyclesDebugButtonsPanel,
+ CyclesShadingButtonsPanel,
+ Panel):
+ bl_label = "Debug"
+
+ @classmethod
+ def poll(cls, context):
+ return (
+ CyclesDebugButtonsPanel.poll(context) and
+ CyclesShadingButtonsPanel.poll(context)
+ )
+
+ def draw(self, context):
+ shading = context.space_data.shading
+
+ layout = self.layout
+ layout.active = context.scene.cycles.use_preview_adaptive_sampling
+ layout.prop(shading.cycles, "show_active_pixels")
+
+
class CYCLES_VIEW3D_PT_shading_lighting(Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'HEADER'
@@ -2275,11 +2076,13 @@ def get_panels():
classes = (
CYCLES_PT_sampling_presets,
+ CYCLES_PT_viewport_sampling_presets,
CYCLES_PT_integrator_presets,
CYCLES_RENDER_PT_sampling,
- CYCLES_RENDER_PT_sampling_sub_samples,
- CYCLES_RENDER_PT_sampling_adaptive,
- CYCLES_RENDER_PT_sampling_denoising,
+ CYCLES_RENDER_PT_sampling_viewport,
+ CYCLES_RENDER_PT_sampling_viewport_denoise,
+ CYCLES_RENDER_PT_sampling_render,
+ CYCLES_RENDER_PT_sampling_render_denoise,
CYCLES_RENDER_PT_sampling_advanced,
CYCLES_RENDER_PT_light_paths,
CYCLES_RENDER_PT_light_paths_max_bounces,
@@ -2296,6 +2099,7 @@ classes = (
CYCLES_VIEW3D_PT_simplify_greasepencil,
CYCLES_VIEW3D_PT_shading_lighting,
CYCLES_VIEW3D_PT_shading_render_pass,
+ CYCLES_VIEW3D_PT_shading_debug,
CYCLES_RENDER_PT_motion_blur,
CYCLES_RENDER_PT_motion_blur_curve,
CYCLES_RENDER_PT_film,
@@ -2314,7 +2118,6 @@ classes = (
CYCLES_RENDER_PT_passes_aov,
CYCLES_RENDER_PT_filter,
CYCLES_RENDER_PT_override,
- CYCLES_RENDER_PT_denoising,
CYCLES_PT_post_processing,
CYCLES_CAMERA_PT_dof,
CYCLES_CAMERA_PT_dof_aperture,
@@ -2333,7 +2136,6 @@ classes = (
CYCLES_WORLD_PT_preview,
CYCLES_WORLD_PT_surface,
CYCLES_WORLD_PT_volume,
- CYCLES_WORLD_PT_ambient_occlusion,
CYCLES_WORLD_PT_mist,
CYCLES_WORLD_PT_ray_visibility,
CYCLES_WORLD_PT_settings,
diff --git a/intern/cycles/blender/addon/version_update.py b/intern/cycles/blender/addon/version_update.py
index 827f84b9873..57da7d7995c 100644
--- a/intern/cycles/blender/addon/version_update.py
+++ b/intern/cycles/blender/addon/version_update.py
@@ -109,7 +109,7 @@ def do_versions(self):
library_versions.setdefault(library.version, []).append(library)
# Do versioning per library, since they might have different versions.
- max_need_versioning = (2, 93, 7)
+ max_need_versioning = (3, 0, 25)
for version, libraries in library_versions.items():
if version > max_need_versioning:
continue
@@ -166,10 +166,6 @@ def do_versions(self):
if not cscene.is_property_set("filter_type"):
cscene.pixel_filter_type = 'GAUSSIAN'
- # Tile Order
- if not cscene.is_property_set("tile_order"):
- cscene.tile_order = 'CENTER'
-
if version <= (2, 76, 10):
cscene = scene.cycles
if cscene.is_property_set("filter_type"):
@@ -186,10 +182,6 @@ def do_versions(self):
if version <= (2, 79, 0):
cscene = scene.cycles
# Default changes
- if not cscene.is_property_set("aa_samples"):
- cscene.aa_samples = 4
- if not cscene.is_property_set("preview_aa_samples"):
- cscene.preview_aa_samples = 4
if not cscene.is_property_set("blur_glossy"):
cscene.blur_glossy = 0.0
if not cscene.is_property_set("sample_clamp_indirect"):
@@ -203,7 +195,6 @@ def do_versions(self):
view_layer.use_pass_cryptomatte_material = cview_layer.get("use_pass_crypto_material", False)
view_layer.use_pass_cryptomatte_asset = cview_layer.get("use_pass_crypto_asset", False)
view_layer.pass_cryptomatte_depth = cview_layer.get("pass_crypto_depth", 6)
- view_layer.use_pass_cryptomatte_accurate = cview_layer.get("pass_crypto_accurate", True)
if version <= (2, 93, 7):
if scene.render.engine == 'CYCLES':
@@ -229,6 +220,35 @@ def do_versions(self):
cscene.ao_bounces = 1
cscene.ao_bounces_render = 1
+ if version <= (3, 0, 25):
+ cscene = scene.cycles
+
+ # Default changes.
+ if not cscene.is_property_set("samples"):
+ cscene.samples = 128
+ if not cscene.is_property_set("preview_samples"):
+ cscene.preview_samples = 32
+ if not cscene.is_property_set("use_adaptive_sampling"):
+ cscene.use_adaptive_sampling = False
+ cscene.use_preview_adaptive_sampling = False
+ if not cscene.is_property_set("use_denoising"):
+ cscene.use_denoising = False
+ if not cscene.is_property_set("use_preview_denoising"):
+ cscene.use_preview_denoising = False
+ if not cscene.is_property_set("sampling_pattern"):
+ cscene.sampling_pattern = 'PROGRESSIVE_MUTI_JITTER'
+
+ # Removal of square samples.
+ cscene = scene.cycles
+ use_square_samples = cscene.get("use_square_samples", False)
+
+ if use_square_samples:
+ cscene.samples *= cscene.samples
+ cscene.preview_samples *= cscene.preview_samples
+ for layer in scene.view_layers:
+ layer.samples *= layer.samples
+ cscene["use_square_samples"] = False
+
# Lamps
for light in bpy.data.lights:
if light.library not in libraries:
@@ -249,10 +269,6 @@ def do_versions(self):
if version <= (2, 76, 9):
cworld = world.cycles
- # World MIS Samples
- if not cworld.is_property_set("samples"):
- cworld.samples = 4
-
# World MIS Resolution
if not cworld.is_property_set("sample_map_resolution"):
cworld.sample_map_resolution = 256