More tonemapping

This commit is contained in:
Lubos Lenco 2017-02-25 00:57:13 +01:00
parent 39da6198ec
commit 6f8fa8ece0
6 changed files with 48 additions and 21 deletions

View file

@ -235,13 +235,24 @@ void main() {
col.rgb *= compoExposureStrength;
#endif
#ifdef _CTonemap
col.rgb = tonemapUncharted2(col.rgb);
// col.rgb = tonemapFilmic(col.rgb); // With gamma
#ifdef _CToneFilmic
col.rgb = tonemapFilmic(col.rgb); // With gamma
#endif
// To gamma
#ifdef _CToneFilmic2
col.rgb = acesFilm(col.rgb);
col.rgb = pow(col.rgb, vec3(1.0 / 2.2));
#endif
#ifdef _CToneReinhard
col.rgb = tonemapReinhard(col.rgb);
col.rgb = pow(col.rgb, vec3(1.0 / 2.2));
#endif
#ifdef _CToneUncharted
col.rgb = tonemapUncharted2(col.rgb);
col.rgb = pow(col.rgb, vec3(1.0 / 2.2)); // To gamma
#endif
#ifdef _CToneNone
col.rgb = pow(col.rgb, vec3(1.0 / 2.2)); // To gamma
#endif
#ifdef _CBW
// col.rgb = vec3(clamp(dot(col.rgb, col.rgb), 0.0, 1.0));

View file

@ -23,6 +23,16 @@ vec3 tonemapFilmic(const vec3 color) {
return (x * (6.2 * x + 0.5)) / (x * (6.2 * x + 1.7) + 0.06);
}
// https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/
vec3 acesFilm(const vec3 x) {
const float a = 2.51;
const float b = 0.03;
const float c = 2.43;
const float d = 0.59;
const float e = 0.14;
return clamp((x * (a * x + b)) / (x * (c * x + d ) + e), 0.0, 1.0);
}
vec3 tonemapReinhard(const vec3 color) {
return color / (color + vec3(1.0));
}

View file

@ -11,9 +11,6 @@ def parse_defs(node_group):
parse_defs.defs = []
build_node(node_group, nodes.get_input_node(node_group, rn, 0))
# Always include tonemap for now
add_def('_CompoTonemap')
# To string
s = ''
for d in parse_defs.defs:

View file

@ -232,6 +232,7 @@ def make_draw_compositor(stage, node_group, node, with_fxaa=False):
wrd = bpy.data.worlds['Arm']
world_defs = wrd.world_defs + wrd.rp_defs
compositor_defs = make_compositor.parse_defs(bpy.data.scenes[0].node_tree) # Thrown in scene 0 for now
compositor_defs += '_CTone' + wrd.generate_tonemap
# Additional compositor flags
compo_depth = False # Read depth
# compo_pos = False # Construct position from depth

View file

@ -418,6 +418,13 @@ def init_properties():
bpy.types.World.generate_fog_color = bpy.props.FloatVectorProperty(name="Color", size=3, subtype='COLOR', default=[0.5, 0.6, 0.7], update=assets.invalidate_shader_cache)
bpy.types.World.generate_fog_amounta = bpy.props.FloatProperty(name="Amount A", default=0.25, update=assets.invalidate_shader_cache)
bpy.types.World.generate_fog_amountb = bpy.props.FloatProperty(name="Amount B", default=0.5, update=assets.invalidate_shader_cache)
bpy.types.World.generate_tonemap = EnumProperty(
items=[('None', 'None', 'None'),
('Filmic', 'Filmic', 'Filmic'),
('Filmic2', 'Filmic2', 'Filmic2'),
('Reinhard', 'Reinhard', 'Reinhard'),
('Uncharted', 'Uncharted', 'Uncharted')],
name='Tonemap', description='Tonemapping operator', default='Filmic', update=assets.invalidate_shader_cache)
# Skin
bpy.types.World.generate_gpu_skin = bpy.props.BoolProperty(name="GPU Skinning", description="Calculate skinning on GPU", default=True, update=assets.invalidate_shader_cache)
bpy.types.World.generate_gpu_skin_max_bones = bpy.props.IntProperty(name="Max Bones", default=50, min=1, max=84, update=assets.invalidate_shader_cache)

View file

@ -341,20 +341,21 @@ class WorldPropsPanel(bpy.types.Panel):
if wrd.generate_radiance_sky:
layout.prop(wrd, 'generate_radiance_sky_type')
# layout.separator()
layout.separator()
# TODO: migrate to compositor
# layout.label('Compositor')
# layout.prop(wrd, 'generate_letterbox')
# if wrd.generate_letterbox:
# layout.prop(wrd, 'generate_letterbox_size')
# layout.prop(wrd, 'generate_grain')
# if wrd.generate_grain:
# layout.prop(wrd, 'generate_grain_strength')
# layout.prop(wrd, 'generate_fog')
# if wrd.generate_fog:
# layout.prop(wrd, 'generate_fog_color')
# layout.prop(wrd, 'generate_fog_amounta')
# layout.prop(wrd, 'generate_fog_amountb')
layout.label('Compositor (deprecated)')
layout.prop(wrd, 'generate_tonemap')
layout.prop(wrd, 'generate_letterbox')
if wrd.generate_letterbox:
layout.prop(wrd, 'generate_letterbox_size')
layout.prop(wrd, 'generate_grain')
if wrd.generate_grain:
layout.prop(wrd, 'generate_grain_strength')
layout.prop(wrd, 'generate_fog')
if wrd.generate_fog:
layout.prop(wrd, 'generate_fog_color')
layout.prop(wrd, 'generate_fog_amounta')
layout.prop(wrd, 'generate_fog_amountb')
class ArmoryPlayerPanel(bpy.types.Panel):
bl_label = "Armory Player"