From d05641b4a39d81fcd60adabbe982617ef1f408a8 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Wed, 1 May 2019 10:52:42 +0200 Subject: [PATCH] Auto-exposure speed --- Shaders/compositor_pass/compositor_pass.frag.glsl | 4 ++-- Shaders/histogram_pass/histogram_pass.frag.glsl | 5 +++-- blender/arm/make_renderpath.py | 2 +- blender/arm/props_renderpath.py | 10 +++++----- blender/arm/props_ui.py | 1 + blender/arm/write_data.py | 5 +++-- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/Shaders/compositor_pass/compositor_pass.frag.glsl b/Shaders/compositor_pass/compositor_pass.frag.glsl index e7eeea69..169defc6 100755 --- a/Shaders/compositor_pass/compositor_pass.frag.glsl +++ b/Shaders/compositor_pass/compositor_pass.frag.glsl @@ -284,12 +284,12 @@ void main() { #endif #ifdef _CExposure - fragColor.rgb *= compoExposureStrength; + fragColor.rgb += fragColor.rgb * compoExposureStrength; #endif #ifdef _AutoExposure float expo = 2.0 - clamp(length(textureLod(histogram, vec2(0.5, 0.5), 0).rgb), 0.0, 1.0); - fragColor.rgb *= pow(expo, autoExposureStrength); + fragColor.rgb *= pow(expo, autoExposureStrength * 2.0); #endif #ifdef _CToneFilmic diff --git a/Shaders/histogram_pass/histogram_pass.frag.glsl b/Shaders/histogram_pass/histogram_pass.frag.glsl index c5fa5900..f36a9294 100644 --- a/Shaders/histogram_pass/histogram_pass.frag.glsl +++ b/Shaders/histogram_pass/histogram_pass.frag.glsl @@ -1,13 +1,14 @@ #version 450 +#include "compiled.inc" + uniform sampler2D tex; in vec2 texCoord; out vec4 fragColor; void main() { - const float speed = 0.01; - fragColor.a = speed; + fragColor.a = 0.01 * autoExposureSpeed; fragColor.rgb = textureLod(tex, vec2(0.5, 0.5), 0.0).rgb + textureLod(tex, vec2(0.2, 0.2), 0.0).rgb + textureLod(tex, vec2(0.8, 0.2), 0.0).rgb + diff --git a/blender/arm/make_renderpath.py b/blender/arm/make_renderpath.py index d97067ee..59aba020 100755 --- a/blender/arm/make_renderpath.py +++ b/blender/arm/make_renderpath.py @@ -157,7 +157,7 @@ def build(): wrd.compo_defs += '_CGrain' if rpdat.arm_sharpen: wrd.compo_defs += '_CSharpen' - if bpy.data.scenes[0].cycles.film_exposure != 1.0: + if bpy.data.scenes[0].view_settings.exposure != 0.0: wrd.compo_defs += '_CExposure' if rpdat.arm_fog: wrd.compo_defs += '_CFog' diff --git a/blender/arm/props_renderpath.py b/blender/arm/props_renderpath.py index a318d139..59956eaf 100644 --- a/blender/arm/props_renderpath.py +++ b/blender/arm/props_renderpath.py @@ -33,7 +33,7 @@ def update_preset(self, context): rpdat.rp_ssgi = 'SSAO' rpdat.rp_ssr = False rpdat.rp_bloom = False - rpdat.rp_eyeadapt = False + rpdat.rp_autoexposure = False rpdat.rp_motionblur = 'Off' rpdat.arm_rp_resolution = 'Display' rpdat.arm_texture_filter = 'Anisotropic' @@ -65,7 +65,7 @@ def update_preset(self, context): rpdat.rp_ssgi = 'Off' rpdat.rp_ssr = False rpdat.rp_bloom = False - rpdat.rp_eyeadapt = False + rpdat.rp_autoexposure = False rpdat.rp_motionblur = 'Off' rpdat.arm_rp_resolution = 'Display' rpdat.arm_texture_filter = 'Linear' @@ -100,7 +100,7 @@ def update_preset(self, context): rpdat.rp_ssr = True rpdat.arm_ssr_half_res = False rpdat.rp_bloom = True - rpdat.rp_eyeadapt = False + rpdat.rp_autoexposure = False rpdat.rp_motionblur = 'Off' rpdat.arm_rp_resolution = 'Display' rpdat.arm_material_model = 'Full' @@ -133,7 +133,7 @@ def update_preset(self, context): rpdat.rp_ssgi = 'Off' rpdat.rp_ssr = False rpdat.rp_bloom = False - rpdat.rp_eyeadapt = False + rpdat.rp_autoexposure = False rpdat.rp_motionblur = 'Off' rpdat.arm_rp_resolution = 'Display' rpdat.arm_texture_filter = 'Linear' @@ -277,7 +277,6 @@ class ArmRPListItem(bpy.types.PropertyGroup): ], name="SSGI", description="Screen space global illumination", default='SSAO', update=update_renderpath) rp_bloom: BoolProperty(name="Bloom", description="Bloom processing", default=False, update=update_renderpath) - rp_eyeadapt: BoolProperty(name="Eye Adaptation", description="Auto-exposure based on histogram", default=False, update=update_renderpath) rp_motionblur: EnumProperty( items=[('Off', 'Off', 'Off'), ('Camera', 'Camera', 'Camera'), @@ -438,6 +437,7 @@ class ArmRPListItem(bpy.types.PropertyGroup): arm_shadowmap_split: FloatProperty(name="Cascade Split", description="Split factor for cascaded shadow maps, higher factor favors detail on close surfaces", default=0.8, update=assets.invalidate_shader_cache) arm_shadowmap_bounds: FloatProperty(name="Cascade Bounds", description="Multiply cascade bounds to capture bigger area", default=1.0, update=assets.invalidate_compiled_data) arm_autoexposure_strength: FloatProperty(name="Auto Exposure Strength", default=1.0, update=assets.invalidate_shader_cache) + arm_autoexposure_speed: FloatProperty(name="Auto Exposure Speed", default=1.0, update=assets.invalidate_shader_cache) arm_ssrs_ray_step: FloatProperty(name="Step", default=0.01, update=assets.invalidate_shader_cache) # Compositor arm_letterbox: BoolProperty(name="Letterbox", default=False, update=assets.invalidate_shader_cache) diff --git a/blender/arm/props_ui.py b/blender/arm/props_ui.py index 0d7a5666..553aebb7 100644 --- a/blender/arm/props_ui.py +++ b/blender/arm/props_ui.py @@ -1031,6 +1031,7 @@ class ARM_PT_RenderPathCompositorPanel(bpy.types.Panel): col = layout.column() col.enabled = rpdat.rp_autoexposure col.prop(rpdat, 'arm_autoexposure_strength', text='Strength') + col.prop(rpdat, 'arm_autoexposure_speed', text='Speed') layout.prop(rpdat, 'arm_lens_texture') layout.prop(rpdat, 'arm_lut_texture') diff --git a/blender/arm/write_data.py b/blender/arm/write_data.py index fffe14f6..87aa5c7d 100755 --- a/blender/arm/write_data.py +++ b/blender/arm/write_data.py @@ -521,6 +521,7 @@ const int volumSteps = """ + str(rpdat.arm_volumetric_light_steps) + """; if rpdat.rp_autoexposure: f.write( """const float autoExposureStrength = """ + str(rpdat.arm_autoexposure_strength) + """; +const float autoExposureSpeed = """ + str(rpdat.arm_autoexposure_speed) + """; """) # Compositor @@ -544,9 +545,9 @@ const int volumSteps = """ + str(rpdat.arm_volumetric_light_steps) + """; """const float compoSharpenStrength = """ + str(round(rpdat.arm_sharpen_strength * 100) / 100) + """; """) - if bpy.data.scenes[0].cycles.film_exposure != 1.0: + if bpy.data.scenes[0].view_settings.exposure != 0.0: f.write( -"""const float compoExposureStrength = """ + str(round(bpy.data.scenes[0].cycles.film_exposure * 100) / 100) + """; +"""const float compoExposureStrength = """ + str(round(bpy.data.scenes[0].view_settings.exposure * 100) / 100) + """; """) if rpdat.arm_fog: