Files
test2/scripts/startup/bl_ui/properties_render.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

1181 lines
34 KiB
Python
Raw Permalink Normal View History

# SPDX-FileCopyrightText: 2009-2023 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
2019-03-14 15:14:43 +11:00
from bpy.types import Panel
from bpy.app.translations import contexts as i18n_contexts
from bl_ui.properties_grease_pencil_common import GreasePencilSimplifyPanel
from bl_ui.space_view3d import (
VIEW3D_PT_shading_lighting,
VIEW3D_PT_shading_color,
VIEW3D_PT_shading_options,
VIEW3D_PT_shading_cavity,
)
from bl_ui.utils import PresetPanel
class RenderButtonsPanel:
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "render"
# COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
class RENDER_PT_context(Panel):
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "render"
bl_options = {'HIDE_HEADER'}
bl_label = ""
@classmethod
def poll(cls, context):
return context.scene
def draw(self, context):
layout = self.layout
2018-05-31 16:05:38 +02:00
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
rd = scene.render
if rd.has_multiple_engines:
2018-05-31 16:05:38 +02:00
layout.prop(rd, "engine", text="Render Engine")
class RENDER_PT_color_management(RenderButtonsPanel, Panel):
bl_label = "Color Management"
bl_options = {'DEFAULT_CLOSED'}
bl_order = 100
2023-01-24 17:58:58 +01:00
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
scene = context.scene
view = scene.view_settings
flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
col = flow.column()
col.prop(scene.display_settings, "display_device")
col.separator()
col.prop(view, "view_transform")
col.prop(view, "look")
if view.is_hdr and not context.window.support_hdr_color:
row = col.split(factor=0.4)
row.label()
row.label(text="HDR display not supported", icon="INFO")
col = flow.column()
col.prop(view, "exposure")
col.prop(view, "gamma")
Color Management: Add working color space for blend files * Store scene linear to XYZ conversion matrix in each blend file, along with the colorspace name. The matrix is the source of truth. The name is currently only used for error logging about unknown color spaces. * Add Working Space option in color management panel, to change the working space for the entire blend file. Changing this will pop up a dialog, with a default enabled option to convert all colors in the blend file to the new working space. Note this is necessarily only an approximation. * Link and append automatically converts to the color space of the main open blend file. * There is builtin support for Rec.709, Rec.2020 and ACEScg working spaces, in addition to the working space of custom OpenColorIO configs. * Undo of working space for linked datablocks isn't quite correct when going to a smaller gamut working space. This can be fixed by reloading the file so the linked datablocks are reloaded. Compatibility with blend files saved with a custom OpenColorIO config is tricky, as we can not detect this. * We assume that if the blend file has no information about the scene linear color space, it is the default one from the active OCIO config. And the same for any blend files linked or appended. This is effectively the same behavior as before. * Now that there is a warning when color spaces are missing, it is more likely that a user will notice something is wrong and only save the blend file with the correct config active. * As no automatic working space conversion happens on file load, there is an opportunity to correct things by changing the working space with "Convert Colors" disabled. This can also be scripted for all blend files in a project. Ref #144911 Pull Request: https://projects.blender.org/blender/blender/pulls/145476
2025-08-31 02:58:12 +02:00
class RENDER_PT_color_management_working_space(RenderButtonsPanel, Panel):
bl_label = "Working Space"
bl_parent_id = "RENDER_PT_color_management"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
scene = context.scene
blend_colorspace = context.blend_data.colorspace
flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
col = flow.column()
split = col.split(factor=0.4)
row = split.row()
row.label(text="File")
row.alignment = 'RIGHT'
split.operator_menu_enum(
"wm.set_working_color_space",
"working_space",
text=blend_colorspace.working_space,
text_ctxt=i18n_contexts.default,
)
col.prop(scene.sequencer_colorspace_settings, "name", text="Sequencer")
class RENDER_PT_color_management_advanced(RenderButtonsPanel, Panel):
bl_label = "Advanced"
bl_parent_id = "RENDER_PT_color_management"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
scene = context.scene
col = layout.column()
col.active = scene.view_settings.support_emulation
col.prop(scene.display_settings, "emulation")
class RENDER_PT_color_management_curves(RenderButtonsPanel, Panel):
Color management: Support white balance as part of the display transform This implements a von-Kries-style chromatic adaption using the Bradford matrix. The adaption is performed in scene linear space in the OCIO GLSL shader, with the matrix being computed on the host. The parameters specify the white point of the input, which is to be mapped to the white point of the scene linear space. The main parameter is temperature, specified in Kelvin, which defines the blackbody spectrum that is used as the input white point. Additionally, a tint parameter can be used to shift the white point away from pure blackbody spectra (e.g. to match a D illuminant). The defaults are set to match D65 so there is no immediate color shift when enabling the option. Tint = 10 is needed since the D-series illuminants aren't perfect blackbody emitters. As an alternative to manually specifying the values, there's also a color picker. When a color is selected, temperature and tint are set such that this color ends up being balanced to white. This only works if the color is close enough to a blackbody emitter - specifically, for tint values within +-150. Beyond this, there can be ambiguity in the representation. Currently, in this case, the input is just ignored and temperature/tint aren't changed. Ideally, we'd eventually give UI feedback for this. Presets are supported, and all the CIE standard illuminants are included. One part that I'm not quite happy with is that the tint parameter starts to give weird results at moderate values when the temperature is low. The reason for this can be seen here: https://commons.wikimedia.org/wiki/File:Planckian-locus.png Tint is moving along the isotherm lines (with the plot corresponding to +-150), but below 4000K some of that range is outside of the gamut. Not much can be done there, other than possibly clipping those values... Adding support for this to the compositor should be quite easy and is planned as a next step. Pull Request: https://projects.blender.org/blender/blender/pulls/123278
2024-06-27 23:27:58 +02:00
bl_label = "Curves"
bl_parent_id = "RENDER_PT_color_management"
bl_options = {'DEFAULT_CLOSED'}
2023-01-24 17:58:58 +01:00
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
def draw_header(self, context):
scene = context.scene
view = scene.view_settings
self.layout.prop(view, "use_curve_mapping", text="")
def draw(self, context):
layout = self.layout
scene = context.scene
view = scene.view_settings
layout.use_property_split = False
layout.use_property_decorate = False # No animation.
Color management: Support white balance as part of the display transform This implements a von-Kries-style chromatic adaption using the Bradford matrix. The adaption is performed in scene linear space in the OCIO GLSL shader, with the matrix being computed on the host. The parameters specify the white point of the input, which is to be mapped to the white point of the scene linear space. The main parameter is temperature, specified in Kelvin, which defines the blackbody spectrum that is used as the input white point. Additionally, a tint parameter can be used to shift the white point away from pure blackbody spectra (e.g. to match a D illuminant). The defaults are set to match D65 so there is no immediate color shift when enabling the option. Tint = 10 is needed since the D-series illuminants aren't perfect blackbody emitters. As an alternative to manually specifying the values, there's also a color picker. When a color is selected, temperature and tint are set such that this color ends up being balanced to white. This only works if the color is close enough to a blackbody emitter - specifically, for tint values within +-150. Beyond this, there can be ambiguity in the representation. Currently, in this case, the input is just ignored and temperature/tint aren't changed. Ideally, we'd eventually give UI feedback for this. Presets are supported, and all the CIE standard illuminants are included. One part that I'm not quite happy with is that the tint parameter starts to give weird results at moderate values when the temperature is low. The reason for this can be seen here: https://commons.wikimedia.org/wiki/File:Planckian-locus.png Tint is moving along the isotherm lines (with the plot corresponding to +-150), but below 4000K some of that range is outside of the gamut. Not much can be done there, other than possibly clipping those values... Adding support for this to the compositor should be quite easy and is planned as a next step. Pull Request: https://projects.blender.org/blender/blender/pulls/123278
2024-06-27 23:27:58 +02:00
layout.active = view.use_curve_mapping
2019-03-04 22:06:23 +11:00
layout.template_curve_mapping(view, "curve_mapping", type='COLOR', levels=True)
Color management: Support white balance as part of the display transform This implements a von-Kries-style chromatic adaption using the Bradford matrix. The adaption is performed in scene linear space in the OCIO GLSL shader, with the matrix being computed on the host. The parameters specify the white point of the input, which is to be mapped to the white point of the scene linear space. The main parameter is temperature, specified in Kelvin, which defines the blackbody spectrum that is used as the input white point. Additionally, a tint parameter can be used to shift the white point away from pure blackbody spectra (e.g. to match a D illuminant). The defaults are set to match D65 so there is no immediate color shift when enabling the option. Tint = 10 is needed since the D-series illuminants aren't perfect blackbody emitters. As an alternative to manually specifying the values, there's also a color picker. When a color is selected, temperature and tint are set such that this color ends up being balanced to white. This only works if the color is close enough to a blackbody emitter - specifically, for tint values within +-150. Beyond this, there can be ambiguity in the representation. Currently, in this case, the input is just ignored and temperature/tint aren't changed. Ideally, we'd eventually give UI feedback for this. Presets are supported, and all the CIE standard illuminants are included. One part that I'm not quite happy with is that the tint parameter starts to give weird results at moderate values when the temperature is low. The reason for this can be seen here: https://commons.wikimedia.org/wiki/File:Planckian-locus.png Tint is moving along the isotherm lines (with the plot corresponding to +-150), but below 4000K some of that range is outside of the gamut. Not much can be done there, other than possibly clipping those values... Adding support for this to the compositor should be quite easy and is planned as a next step. Pull Request: https://projects.blender.org/blender/blender/pulls/123278
2024-06-27 23:27:58 +02:00
class RENDER_PT_color_management_white_balance_presets(PresetPanel, Panel):
bl_label = "White Balance Presets"
preset_subdir = "color_management/white_balance"
preset_operator = "script.execute_preset"
preset_add_operator = "render.color_management_white_balance_preset_add"
class RENDER_PT_color_management_white_balance(RenderButtonsPanel, Panel):
bl_label = "White Balance"
bl_parent_id = "RENDER_PT_color_management"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE',
Color management: Support white balance as part of the display transform This implements a von-Kries-style chromatic adaption using the Bradford matrix. The adaption is performed in scene linear space in the OCIO GLSL shader, with the matrix being computed on the host. The parameters specify the white point of the input, which is to be mapped to the white point of the scene linear space. The main parameter is temperature, specified in Kelvin, which defines the blackbody spectrum that is used as the input white point. Additionally, a tint parameter can be used to shift the white point away from pure blackbody spectra (e.g. to match a D illuminant). The defaults are set to match D65 so there is no immediate color shift when enabling the option. Tint = 10 is needed since the D-series illuminants aren't perfect blackbody emitters. As an alternative to manually specifying the values, there's also a color picker. When a color is selected, temperature and tint are set such that this color ends up being balanced to white. This only works if the color is close enough to a blackbody emitter - specifically, for tint values within +-150. Beyond this, there can be ambiguity in the representation. Currently, in this case, the input is just ignored and temperature/tint aren't changed. Ideally, we'd eventually give UI feedback for this. Presets are supported, and all the CIE standard illuminants are included. One part that I'm not quite happy with is that the tint parameter starts to give weird results at moderate values when the temperature is low. The reason for this can be seen here: https://commons.wikimedia.org/wiki/File:Planckian-locus.png Tint is moving along the isotherm lines (with the plot corresponding to +-150), but below 4000K some of that range is outside of the gamut. Not much can be done there, other than possibly clipping those values... Adding support for this to the compositor should be quite easy and is planned as a next step. Pull Request: https://projects.blender.org/blender/blender/pulls/123278
2024-06-27 23:27:58 +02:00
'BLENDER_WORKBENCH',
}
def draw_header(self, context):
scene = context.scene
view = scene.view_settings
self.layout.prop(view, "use_white_balance", text="")
def draw_header_preset(self, context):
layout = self.layout
RENDER_PT_color_management_white_balance_presets.draw_panel_header(layout)
eye = layout.operator("ui.eyedropper_color", text="", icon='EYEDROPPER')
eye.prop_data_path = "scene.view_settings.white_balance_whitepoint"
def draw(self, context):
layout = self.layout
scene = context.scene
view = scene.view_settings
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
layout.active = view.use_white_balance
col = layout.column()
col.prop(view, "white_balance_temperature")
col.prop(view, "white_balance_tint")
class RENDER_PT_eevee_motion_blur(RenderButtonsPanel, Panel):
bl_label = "Motion Blur"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
scene = context.scene
props = scene.render
self.layout.prop(props, "use_motion_blur", text="")
def draw(self, context):
layout = self.layout
layout.use_property_split = True
scene = context.scene
props = scene.render
eevee_props = scene.eevee
layout.active = props.use_motion_blur
col = layout.column()
col.prop(props, "motion_blur_position", text="Position")
col.prop(props, "motion_blur_shutter")
col.separator()
col.prop(eevee_props, "motion_blur_depth_scale")
col.prop(eevee_props, "motion_blur_max")
col.prop(eevee_props, "motion_blur_steps", text="Steps")
class RENDER_PT_eevee_motion_blur_curve(RenderButtonsPanel, Panel):
bl_label = "Shutter Curve"
bl_parent_id = "RENDER_PT_eevee_motion_blur"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
rd = scene.render
layout.active = rd.use_motion_blur
col = layout.column()
col.template_curve_mapping(rd, "motion_blur_shutter_curve")
col = layout.column(align=True)
row = col.row(align=True)
row.operator("render.shutter_curve_preset", icon='SMOOTHCURVE', text="").shape = 'SMOOTH'
row.operator("render.shutter_curve_preset", icon='SPHERECURVE', text="").shape = 'ROUND'
row.operator("render.shutter_curve_preset", icon='ROOTCURVE', text="").shape = 'ROOT'
row.operator("render.shutter_curve_preset", icon='SHARPCURVE', text="").shape = 'SHARP'
row.operator("render.shutter_curve_preset", icon='LINCURVE', text="").shape = 'LINE'
row.operator("render.shutter_curve_preset", icon='NOCURVE', text="").shape = 'MAX'
class RENDER_PT_eevee_depth_of_field(RenderButtonsPanel, Panel):
bl_label = "Depth of Field"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column()
col.prop(props, "bokeh_max_size")
col.prop(props, "bokeh_threshold")
col.prop(props, "bokeh_neighbor_max")
col = layout.column(align=False, heading="Jitter Camera")
row = col.row(align=True)
sub = row.row(align=True)
sub.prop(props, "use_bokeh_jittered", text="")
sub = sub.row(align=True)
sub.active = props.use_bokeh_jittered
sub.prop(props, "bokeh_overblur")
class RENDER_PT_eevee_volumes(RenderButtonsPanel, Panel):
bl_label = "Volumes"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column(align=True)
col.prop(props, "volumetric_tile_size", text="Resolution")
col.prop(props, "volumetric_samples", text="Steps")
col.prop(props, "volumetric_sample_distribution", text="Distribution")
col = layout.column()
EEVEE-Next: Add mesh volume bounds estimation This adds correct object bounds estimation. This works by creating an occupancy texture where one bit represents one froxel. A geometry pre-pass fill this occupancy texture and doesn't do any shading. Each bit set to 0 will not be considered occupied by the object volume and will discard the material compute shader for this froxel. There is 2 method of computing the occupancy map: - Atomic XOR: For each fragment we compute the amount of froxels **center** in-front of it. We then convert that into occupancy bitmask that we apply to the occupancy texture using `imageAtomicXor`. This is straight forward and works well for any manifold geometry. - Hit List: For each fragment we write the fragment depth in a list (contained in one array texture). This list is then processed by a fullscreen pass (see `eevee_occupancy_convert_frag.glsl`) that sorts and converts all the hits to the occupancy bits. This emulate Cycles behavior by considering only back-face hits as exit events and front-face hits as entry events. The result stores it to the occupancy texture using bit-wise `OR` operation to compose it with other non-hit list objects. This also decouple the hit-list evaluation complexity from the material evaluation shader. ## Limitations ### Fast - Non-manifolds geometry objects are rendered incorrectly. - Non-manifolds geometry objects will affect other objects in front of them. ### Accurate - Limited to 16 hits per layer for now. - Non-manifolds geometry objects will affect other objects in front of them. Pull Request: https://projects.blender.org/blender/blender/pulls/113731
2023-10-19 19:22:14 +02:00
col.prop(props, "volumetric_ray_depth", text="Max Depth")
class RENDER_PT_eevee_volumes_range(RenderButtonsPanel, Panel):
bl_label = "Custom Range"
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_eevee_volumes"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
scene = context.scene
props = scene.eevee
self.layout.prop(props, "use_volume_custom_range", text="")
def draw(self, context):
scene = context.scene
props = scene.eevee
layout = self.layout
layout.active = props.use_volume_custom_range
layout.use_property_split = True
layout.use_property_decorate = False
col = layout.column(align=True)
col.prop(props, "volumetric_start")
col.prop(props, "volumetric_end")
class RENDER_PT_eevee_raytracing_presets(PresetPanel, Panel):
bl_label = "Raytracing Presets"
preset_subdir = "eevee/raytracing"
preset_operator = "script.execute_preset"
preset_add_operator = "render.eevee_raytracing_preset_add"
class RENDER_PT_eevee_raytracing(RenderButtonsPanel, Panel):
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
bl_label = "Raytracing"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
props = context.scene.eevee
self.layout.prop(props, "use_raytracing", text="")
def draw_header_preset(self, _context):
RENDER_PT_eevee_raytracing_presets.draw_panel_header(self.layout)
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
def draw(self, context):
scene = context.scene
props = scene.eevee
layout = self.layout
layout.active = props.use_raytracing
layout.use_property_split = True
layout.use_property_decorate = False
col = layout.column()
col.prop(props, "ray_tracing_method", text="Method")
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
options = context.scene.eevee.ray_tracing_options
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
col.prop(options, "resolution_scale")
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
class RENDER_PT_eevee_screen_trace(RenderButtonsPanel, Panel):
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
bl_label = "Screen Tracing"
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_eevee_raytracing"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
@classmethod
def poll(cls, context):
use_screen_trace = (context.scene.eevee.ray_tracing_method == 'SCREEN')
return (context.engine in cls.COMPAT_ENGINES) and use_screen_trace
def draw(self, context):
scene = context.scene
props = scene.eevee
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
layout = self.layout
layout.active = props.use_raytracing
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
layout.use_property_split = True
layout.use_property_decorate = False
props = context.scene.eevee.ray_tracing_options
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
col = layout.column()
col.prop(props, "screen_trace_quality", text="Precision")
col.prop(props, "screen_trace_thickness", text="Thickness")
class RENDER_PT_eevee_gi_approximation(RenderButtonsPanel, Panel):
bl_label = "Fast GI Approximation"
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_eevee_raytracing"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
self.layout.active = context.scene.eevee.use_raytracing
props = context.scene.eevee
self.layout.prop(props, "use_fast_gi", text="")
def draw(self, context):
scene = context.scene
props = scene.eevee
options = scene.eevee.ray_tracing_options
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
col = layout.column()
col.active = props.use_raytracing and props.use_fast_gi
col.prop(options, "trace_max_roughness", text="Threshold")
is_valid = props.use_raytracing and props.use_fast_gi and props.ray_tracing_options.trace_max_roughness < 1
col = layout.column()
col.active = is_valid
col.prop(props, "fast_gi_method")
col.prop(props, "fast_gi_resolution", text="Resolution")
sub = col.column(align=True)
sub.prop(props, "fast_gi_ray_count", text="Rays")
sub.prop(props, "fast_gi_step_count", text="Steps")
sub.prop(props, "fast_gi_quality", text="Precision")
sub = col.column(align=True)
sub.prop(props, "fast_gi_distance")
sub.prop(props, "fast_gi_thickness_near", text="Thickness Near")
sub.prop(props, "fast_gi_thickness_far", text="Far")
col.prop(props, "fast_gi_bias", text="Bias")
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
class RENDER_PT_eevee_denoise(RenderButtonsPanel, Panel):
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
bl_label = "Denoising"
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_eevee_raytracing"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
self.layout.active = context.scene.eevee.use_raytracing
props = context.scene.eevee.ray_tracing_options
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
self.layout.prop(props, "use_denoise", text="")
def draw(self, context):
scene = context.scene
props = scene.eevee
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
layout = self.layout
layout.active = props.use_raytracing
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
layout.use_property_split = True
layout.use_property_decorate = False
props = context.scene.eevee.ray_tracing_options
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
col = layout.column()
col.active = props.use_denoise
col.prop(props, "denoise_spatial")
col = layout.column()
col.active = props.use_denoise and props.denoise_spatial
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
col.prop(props, "denoise_temporal")
col = layout.column()
col.active = props.use_denoise and props.denoise_spatial and props.denoise_temporal
EEVEE-Next: Ray-tracing Denoise Pipeline This is a full rewrite of the raytracing denoise pipeline. It uses the same principle as before but now uses compute shaders for every stages and a tile base approach. More aggressive filtering is needed since we are moving towards having no prefiltered screen radiance buffer. Thus we introduce a temporal denoise and a bilateral denoise stage to the denoising. These are optionnal and can be disabled. Note that this patch does not include any tracing part and only samples the reflection probes. It is focused on denoising only. Tracing will come in another PR. The motivation for this is that having hardware raytracing support means we can't prefilter the radiance in screen space so we have to have better denoising. Also this means we can have better surface appearance with support for other BxDF model than GGX. Also GGX support is improved. Technically, the new denoising fixes some implementation mistake the old pipeline did. It separates all 3 stages (spatial, temporal, bilateral) and use random sampling for all stages hoping to create a noisy enough (but still stable) output so that the TAA soaks the remaining noise. However that's not always the case. Depending on the nature of the scene, the input can be very high frequency and might create lots of flickering. That why another solution needs to be found for the higher roughness material as denoising them becomes expensive and low quality. Pull Request: https://projects.blender.org/blender/blender/pulls/110117
2023-08-03 15:32:06 +02:00
col.prop(props, "denoise_bilateral")
class RENDER_PT_eevee_clamping(RenderButtonsPanel, Panel):
bl_label = "Clamping"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
EEVEE-Next: Sunlight Extraction Sun extraction convert part of light comming from the world to a sun light which increases the quality of the rendering. The goal of this feature is to workaround the limitation of the storage techniques used for environment lighting inside EEVEE. This first implementation works by clamping the world lighting and summing the excess lighting and (and its incomming directions) to deduce the sun position. All the lighting is then transfered into this light power. The sun angle is computed based on the directionnality of the excess lighting, the more divergent the excess lighting is, the bigger the angle. This has a few benefits: - It's stable and behave well under animation. This is because we average a lot of data. - It's fast as it can be done inside the remap shader in one pass. - It requires only one parameter, the clamp threshold. However, it has some issue: - It modifies the lighting as we change the incomming direction for excess lighting away from the chosen sun direction. This could be fixed by masking only lighting around the chosen sun direction (requires 2 passes, slower). - Given that this only average the direction, it behaves poorly if there two opposite bright light sources (it puts the sun in the middle). This could be fixed by extracting more suns, but that becomes more complex and requires even more passes. - It looks bad if the summed lighting is not supposed to be a perfect disk in specular reflections or if the sources are too divergent as the disk is too big and the approximation fails short. This could be mitigated by adding an upper bound to the sun radius. For now we workaround this issue by exposing the sun angle parameter in the UI. A more precise algorithm can be implemented in the future to avoid having to deal with these limitations. A possibility is to use importance sampling to randomize sun position. But that would be only for final render. Pull Request: https://projects.blender.org/blender/blender/pulls/121455
2024-05-14 16:36:12 +02:00
pass
class RENDER_PT_eevee_clamping_surface(RenderButtonsPanel, Panel):
bl_label = "Surface"
bl_parent_id = "RENDER_PT_eevee_clamping"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column(align=True)
col.prop(props, "clamp_surface_direct", text="Direct Light")
col.prop(props, "clamp_surface_indirect", text="Indirect Light")
class RENDER_PT_eevee_clamping_volume(RenderButtonsPanel, Panel):
bl_label = "Volume"
bl_parent_id = "RENDER_PT_eevee_clamping"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column(align=True)
col.prop(props, "clamp_volume_direct", text="Direct Light")
col.prop(props, "clamp_volume_indirect", text="Indirect Light")
class RENDER_PT_eevee_sampling_shadows(RenderButtonsPanel, Panel):
bl_label = "Shadows"
bl_parent_id = "RENDER_PT_eevee_sampling"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
scene = context.scene
props = scene.eevee
self.layout.prop(props, "use_shadows", text="")
def draw(self, context):
scene = context.scene
props = scene.eevee
layout = self.layout
layout.active = props.use_shadows
layout.use_property_split = True
layout.use_property_decorate = False
col = layout.column(heading="Tracing", align=True)
col.prop(props, "shadow_ray_count", text="Rays")
col.prop(props, "shadow_step_count", text="Steps")
col = layout.column(align=False, heading="Volume Shadows")
row = col.row(align=True)
sub = row.row(align=True)
sub.prop(props, "use_volumetric_shadows", text="")
sub = sub.row(align=True)
sub.active = props.use_volumetric_shadows
sub.prop(props, "volumetric_shadow_samples", text="Steps")
col = layout.column()
col.prop(props, "shadow_resolution_scale", text="Resolution")
class RENDER_PT_eevee_sampling(RenderButtonsPanel, Panel):
bl_label = "Sampling"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
pass
class RENDER_PT_eevee_sampling_viewport(RenderButtonsPanel, Panel):
bl_label = "Viewport"
bl_parent_id = "RENDER_PT_eevee_sampling"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column()
col.prop(props, "taa_samples", text="Samples")
col.prop(props, "use_taa_reprojection", text="Temporal Reprojection")
col.prop(props, "use_shadow_jitter_viewport", text="Jittered Shadows")
2023-10-14 13:49:50 +11:00
# Add SSS sample count here.
class RENDER_PT_eevee_sampling_render(RenderButtonsPanel, Panel):
bl_label = "Render"
bl_parent_id = "RENDER_PT_eevee_sampling"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column(align=True)
col.prop(props, "taa_render_samples", text="Samples")
2023-10-14 13:49:50 +11:00
# Add SSS sample count here.
class RENDER_PT_eevee_sampling_advanced(RenderButtonsPanel, Panel):
bl_label = "Advanced"
bl_parent_id = "RENDER_PT_eevee_sampling"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column()
col.prop(props, "light_threshold")
class RENDER_PT_eevee_film(RenderButtonsPanel, Panel):
bl_label = "Film"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
scene = context.scene
rd = scene.render
props = scene.eevee
col = layout.column()
col.prop(rd, "filter_size")
col.prop(rd, "film_transparent", text="Transparent")
col = layout.column(align=False, heading="Overscan")
row = col.row(align=True)
sub = row.row(align=True)
sub.prop(props, "use_overscan", text="")
sub = sub.row(align=True)
sub.active = props.use_overscan
sub.prop(props, "overscan_size", text="")
def draw_curves_settings(self, context):
layout = self.layout
scene = context.scene
rd = scene.render
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
layout.prop(rd, "hair_type", text="Shape", expand=True)
layout.prop(rd, "hair_subdiv")
class RENDER_PT_eevee_hair(RenderButtonsPanel, Panel):
bl_label = "Curves"
bl_options = {'DEFAULT_CLOSED'}
DRW: New Curve Drawing Implementation of the design task #142969. This adds the following: - Exact GPU interpolation of curves of all types. - Radius attribute support. - Cyclic curve support. - Resolution attribute support. - New Cylinder hair shape type. ![image.png](/attachments/a8e7aea0-b0e5-4694-b660-89fb3df1ddcd) What changed: - EEVEE doesn't compute random normals for strand hairs anymore. These are considered legacy now. - EEVEE now have an internal shadow bias to avoid self shadowing on hair. - Workbench Curves Strip display option is no longer flat and has better shading. - Legacy Hair particle system evaluates radius at control points before applying additional subdivision. This now matches Cycles. - Color Attribute Node without a name do not fetch the active color attribute anymore. This now matches Cycles. Notes: - This is not 100% matching the CPU implementation for interpolation (see the epsilons in the tests). - Legacy Hair Particle points is now stored in local space after interpolation. The new cylinder shape allows for more correct hair shading in workbench and better intersection in EEVEE. | | Strand | Strip | Cylinder | | ---- | --- | --- | --- | | Main | ![main_strand.png](/attachments/67d3b792-962c-4272-a92c-1c0c7c6cf8de) | ![main_strip.png](/attachments/f2aa3575-368e-4fbb-b888-74df845918f1) | N/A | | PR | ![pr_strand.png](/attachments/cc012483-25f0-491f-a06e-ad3029981d47) | ![pr_strip.png](/attachments/73fa2f5c-5252-4b30-a334-e935ed0fb938) | ![pr_cylinder.png](/attachments/3133b2d4-a6f2-41ee-8e2d-f6fd00db0c8d) | | | Strand | Strip | Cylinder | | ---- | --- | --- | --- | | Main | ![main_strand_closeup.png](/attachments/730bd79c-6762-446d-819b-3ea47961ff9f) |![main_strip_closeup.png](/attachments/d9ace578-cfeb-4895-9896-3625b6ad7a02) | N/A | | PR | ![pr_strand_closeup.png](/attachments/ac8f3b0c-6ef6-4d54-b714-6322f9865036)|![pr_strip_closeup.png](/attachments/8504711a-955b-4ab2-aa3d-c2d114baf9d4)| ![pr_cylinder_closeup.png](/attachments/1e2899a8-0a5c-431f-ac6c-5184d87e9598) | Cyclic Curve, Mixed curve type, and proper radius support: ![image.png](/attachments/7f0bf05e-62ee-4ae9-aef9-a5599249b8d7) Test file for attribute lookup: [test_attribute_lookup.blend](/attachments/1d54dd06-379b-4480-a1c5-96adc1953f77) Follow Up Tasks: - Correct full tube segments orientation based on tangent and normal attributes - Correct V resolution property per object - More attribute type support (currently only color) TODO: - [x] Attribute Loading Changes - [x] Generic Attributes - [x] Length Attribute - [x] Intercept Attribute - [x] Original Coordinate Attribute - [x] Cyclic Curves - [x] Legacy Hair Particle conversion - [x] Attribute Loading - [x] Additional Subdivision - [x] Move some function to generic headers (VertBuf, OffsetIndices) - [x] Fix default UV/Color attribute assignment Pull Request: https://projects.blender.org/blender/blender/pulls/143180
2025-08-27 09:49:43 +02:00
COMPAT_ENGINES = {'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
draw_curves_settings(self, context)
class RENDER_PT_eevee_performance(RenderButtonsPanel, Panel):
bl_label = "Performance"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
scene = context.scene
rd = scene.render
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
layout.prop(rd, "use_high_quality_normals")
class CompositorPerformanceButtonsPanel:
bl_label = "Compositor"
def draw(self, context):
layout = self.layout
scene = context.scene
rd = scene.render
layout.use_property_split = True
layout.use_property_decorate = False
col = layout.column()
row = col.row()
row.prop(rd, "compositor_device", text="Device", expand=True)
2025-01-21 23:50:17 +11:00
if rd.compositor_device == 'GPU':
col.prop(rd, "compositor_precision", text="Precision")
class CompositorDenoisePerformanceButtonsPanel:
bl_label = "Denoise Nodes"
def draw(self, context):
layout = self.layout
scene = context.scene
rd = scene.render
layout.use_property_split = True
layout.use_property_decorate = False
col = layout.column()
row = col.row()
row.prop(rd, "compositor_denoise_device", text="Denoising Device", expand=True)
col.prop(rd, "compositor_denoise_preview_quality", text="Preview Quality")
col.prop(rd, "compositor_denoise_final_quality", text="Final Quality")
class RENDER_PT_eevee_performance_compositor(RenderButtonsPanel, CompositorPerformanceButtonsPanel, Panel):
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_eevee_performance"
COMPAT_ENGINES = {
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
class RENDER_PT_eevee_performance_compositor_denoise_settings(
RenderButtonsPanel, CompositorDenoisePerformanceButtonsPanel, Panel,
):
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_eevee_performance_compositor"
COMPAT_ENGINES = {
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
class RENDER_PT_eevee_performance_memory(RenderButtonsPanel, Panel):
bl_label = "Memory"
bl_parent_id = "RENDER_PT_eevee_performance"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
layout.prop(props, "shadow_pool_size", text="Shadow Pool")
layout.prop(props, "gi_irradiance_pool_size", text="Light Probes Volume Pool")
class RENDER_PT_eevee_performance_viewport(RenderButtonsPanel, Panel):
bl_label = "Viewport"
bl_parent_id = "RENDER_PT_eevee_performance"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
rd = scene.render
col = layout.column()
col.prop(rd, "preview_pixel_size", text="Pixel Size")
# TODO(falk): To rename for 5.0
class RENDER_PT_gpencil(RenderButtonsPanel, Panel):
bl_label = "Grease Pencil"
bl_options = {'DEFAULT_CLOSED'}
bl_order = 10
2023-01-24 17:58:58 +01:00
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
pass
class RENDER_PT_grease_pencil_viewport(RenderButtonsPanel, Panel):
bl_label = "Viewport"
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_gpencil"
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
scene = context.scene
props = scene.grease_pencil_settings
col = layout.column()
col.prop(props, "antialias_threshold", text="SMAA Threshold")
class RENDER_PT_grease_pencil_render(RenderButtonsPanel, Panel):
bl_label = "Render"
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_gpencil"
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
scene = context.scene
props = scene.grease_pencil_settings
col = layout.column()
col.prop(props, "antialias_threshold_render", text="SMAA Threshold")
col.prop(props, "aa_samples", text="SSAA Samples")
col = layout.column()
col.active = scene.render.use_motion_blur
col.prop(props, "motion_blur_steps")
class RENDER_PT_opengl_sampling(RenderButtonsPanel, Panel):
bl_label = "Sampling"
2023-09-04 17:42:04 +02:00
COMPAT_ENGINES = {'BLENDER_WORKBENCH'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
scene = context.scene
props = scene.display
col = layout.column()
col.prop(props, "render_aa", text="Render")
col.prop(props, "viewport_aa", text="Viewport")
class RENDER_PT_opengl_film(RenderButtonsPanel, Panel):
bl_label = "Film"
bl_options = {'DEFAULT_CLOSED'}
2023-09-04 17:42:04 +02:00
COMPAT_ENGINES = {'BLENDER_WORKBENCH'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
rd = context.scene.render
layout.prop(rd, "film_transparent", text="Transparent")
class RENDER_PT_opengl_lighting(RenderButtonsPanel, Panel):
bl_label = "Lighting"
2023-09-04 17:42:04 +02:00
COMPAT_ENGINES = {'BLENDER_WORKBENCH'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
VIEW3D_PT_shading_lighting.draw(self, context)
class RENDER_PT_opengl_color(RenderButtonsPanel, Panel):
bl_label = "Object Color"
2023-09-04 17:42:04 +02:00
COMPAT_ENGINES = {'BLENDER_WORKBENCH'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
VIEW3D_PT_shading_color._draw_color_type(self, context)
class RENDER_PT_opengl_options(RenderButtonsPanel, Panel):
bl_label = "Options"
2023-09-04 17:42:04 +02:00
COMPAT_ENGINES = {'BLENDER_WORKBENCH'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
VIEW3D_PT_shading_options.draw(self, context)
# Cavity properties.
VIEW3D_PT_shading_cavity.draw_header(self, context)
VIEW3D_PT_shading_cavity.draw(self, context)
class RENDER_PT_simplify(RenderButtonsPanel, Panel):
bl_label = "Simplify"
bl_options = {'DEFAULT_CLOSED'}
2023-01-24 17:58:58 +01:00
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
def draw_header(self, context):
rd = context.scene.render
self.layout.prop(rd, "use_simplify", text="")
def draw(self, context):
pass
class RENDER_PT_simplify_viewport(RenderButtonsPanel, Panel):
bl_label = "Viewport"
bl_parent_id = "RENDER_PT_simplify"
2023-01-24 17:58:58 +01:00
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
rd = context.scene.render
layout.active = rd.use_simplify
flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
col = flow.column()
col.prop(rd, "simplify_subdivision", text="Max Subdivision")
col = flow.column()
col.prop(rd, "simplify_child_particles", text="Max Child Particles")
col = flow.column()
col.prop(rd, "simplify_volumes", text="Volume Resolution")
col = flow.column()
col.prop(rd, "use_simplify_normals", text="Normals")
class RENDER_PT_simplify_render(RenderButtonsPanel, Panel):
bl_label = "Render"
bl_parent_id = "RENDER_PT_simplify"
2023-01-24 17:58:58 +01:00
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
rd = context.scene.render
layout.active = rd.use_simplify
flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
col = flow.column()
col.prop(rd, "simplify_subdivision_render", text="Max Subdivision")
col = flow.column()
col.prop(rd, "simplify_child_particles_render", text="Max Child Particles")
class RENDER_PT_simplify_greasepencil(RenderButtonsPanel, Panel, GreasePencilSimplifyPanel):
bl_label = "Grease Pencil"
bl_parent_id = "RENDER_PT_simplify"
2022-07-26 13:23:45 +10:00
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE',
2023-09-04 17:42:04 +02:00
'BLENDER_WORKBENCH',
2022-07-26 13:23:45 +10:00
}
bl_options = {'DEFAULT_CLOSED'}
class RENDER_PT_hydra_debug(RenderButtonsPanel, Panel):
bl_label = "Hydra Debug"
bl_options = {'DEFAULT_CLOSED'}
bl_order = 200
COMPAT_ENGINES = {'HYDRA_STORM'}
@classmethod
def poll(cls, context):
prefs = context.preferences
return (context.engine in cls.COMPAT_ENGINES) and prefs.view.show_developer_ui
def draw(self, context):
layout = self.layout
layout.use_property_split = True
hydra = context.scene.hydra
layout.prop(hydra, "export_method")
classes = (
RENDER_PT_context,
RENDER_PT_eevee_sampling,
RENDER_PT_eevee_sampling_viewport,
RENDER_PT_eevee_sampling_render,
RENDER_PT_eevee_sampling_shadows,
RENDER_PT_eevee_sampling_advanced,
RENDER_PT_eevee_clamping,
RENDER_PT_eevee_clamping_surface,
RENDER_PT_eevee_clamping_volume,
RENDER_PT_eevee_raytracing_presets,
RENDER_PT_eevee_raytracing,
RENDER_PT_eevee_screen_trace,
RENDER_PT_eevee_denoise,
RENDER_PT_eevee_gi_approximation,
RENDER_PT_eevee_volumes,
RENDER_PT_eevee_volumes_range,
2018-11-02 02:21:35 +01:00
RENDER_PT_eevee_hair,
RENDER_PT_simplify,
RENDER_PT_simplify_viewport,
RENDER_PT_simplify_render,
RENDER_PT_simplify_greasepencil,
RENDER_PT_eevee_depth_of_field,
RENDER_PT_eevee_motion_blur,
RENDER_PT_eevee_motion_blur_curve,
RENDER_PT_eevee_film,
RENDER_PT_eevee_performance,
RENDER_PT_eevee_performance_memory,
RENDER_PT_eevee_performance_viewport,
RENDER_PT_eevee_performance_compositor,
RENDER_PT_eevee_performance_compositor_denoise_settings,
RENDER_PT_gpencil,
RENDER_PT_grease_pencil_viewport,
RENDER_PT_grease_pencil_render,
RENDER_PT_opengl_sampling,
RENDER_PT_opengl_lighting,
RENDER_PT_opengl_color,
RENDER_PT_opengl_options,
2018-11-02 02:21:35 +01:00
RENDER_PT_opengl_film,
RENDER_PT_hydra_debug,
2018-11-02 02:21:35 +01:00
RENDER_PT_color_management,
RENDER_PT_color_management_curves,
Color management: Support white balance as part of the display transform This implements a von-Kries-style chromatic adaption using the Bradford matrix. The adaption is performed in scene linear space in the OCIO GLSL shader, with the matrix being computed on the host. The parameters specify the white point of the input, which is to be mapped to the white point of the scene linear space. The main parameter is temperature, specified in Kelvin, which defines the blackbody spectrum that is used as the input white point. Additionally, a tint parameter can be used to shift the white point away from pure blackbody spectra (e.g. to match a D illuminant). The defaults are set to match D65 so there is no immediate color shift when enabling the option. Tint = 10 is needed since the D-series illuminants aren't perfect blackbody emitters. As an alternative to manually specifying the values, there's also a color picker. When a color is selected, temperature and tint are set such that this color ends up being balanced to white. This only works if the color is close enough to a blackbody emitter - specifically, for tint values within +-150. Beyond this, there can be ambiguity in the representation. Currently, in this case, the input is just ignored and temperature/tint aren't changed. Ideally, we'd eventually give UI feedback for this. Presets are supported, and all the CIE standard illuminants are included. One part that I'm not quite happy with is that the tint parameter starts to give weird results at moderate values when the temperature is low. The reason for this can be seen here: https://commons.wikimedia.org/wiki/File:Planckian-locus.png Tint is moving along the isotherm lines (with the plot corresponding to +-150), but below 4000K some of that range is outside of the gamut. Not much can be done there, other than possibly clipping those values... Adding support for this to the compositor should be quite easy and is planned as a next step. Pull Request: https://projects.blender.org/blender/blender/pulls/123278
2024-06-27 23:27:58 +02:00
RENDER_PT_color_management_white_balance_presets,
RENDER_PT_color_management_white_balance,
RENDER_PT_color_management_working_space,
RENDER_PT_color_management_advanced,
)
if __name__ == "__main__": # only for live edit.
from bpy.utils import register_class
for cls in classes:
register_class(cls)