Begin histogram

This commit is contained in:
Lubos Lenco 2017-08-13 22:50:08 +02:00
parent a0d14aed21
commit a60a2ff3ed
9 changed files with 83 additions and 2 deletions

View file

@ -23,6 +23,10 @@ uniform sampler2D gbuffer1;
uniform sampler2D lensTexture;
#endif
#ifdef _Hist
uniform sampler2D texhist;
#endif
// #ifdef _CPos
// uniform vec3 eye;
// uniform vec3 eyeLook;

View file

@ -0,0 +1,19 @@
#version 450
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D tex;
in vec2 texCoord;
out vec3 fragColor;
void main() {
vec3 color = texture(tex, texCoord).rgb;
float luminance = dot(color, vec3(0.30, 0.59, 0.11));
fragColor.r = luminance;
}

View file

@ -0,0 +1,15 @@
{
"contexts": [
{
"name": "histogram_pass",
"depth_write": false,
"compare_mode": "always",
"cull_mode": "none",
"links": [],
"texture_params": [],
"vertex_shader": "histogram_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"fragment_shader": "histogram_pass.frag.glsl"
}
]
}

View file

@ -221,6 +221,11 @@ def make_deferred(cam):
links.new(nodes['Reroute.008'].outputs[0], nodes['Draw Compositor'].inputs[1])
links.new(nodes['Reroute.008'].outputs[0], nodes['SS Resolve'].inputs[2])
if cam.rp_eyeadapt:
links.new(nodes[last_node].outputs[0], nodes['Histogram'].inputs[0])
links.new(nodes['histogram'].outputs[0], nodes['Draw Compositor'].inputs[5])
if cam.rp_rendercapture:
# links.new(nodes[last_node].outputs[0], nodes['CopyCapture'].inputs[0])
fb = nodes['Framebuffer']

View file

@ -402,6 +402,9 @@ def make_blend_pass(stages, node_group, node):
def make_combine_pass(stages, node_group, node):
make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2, 3], bind_target_constants=['tex', 'tex2'], shader_context='combine_pass/combine_pass/combine_pass')
def make_histogram_pass(stages, node_group, node):
make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['texhist'], shader_context='histogram_pass/histogram_pass/histogram_pass')
def make_blur_basic_pass(stages, node_group, node):
make_quad_pass(stages, node_group, node, target_index=2, bind_target_indices=[1], bind_target_constants=['tex'], shader_context='blur_pass/blur_pass/blur_pass_x')
make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='blur_pass/blur_pass/blur_pass_y')
@ -686,6 +689,9 @@ def buildNode(stages, node, node_group):
elif node.bl_idname == 'CombinePassNodeType':
make_combine_pass(stages, node_group, node)
append_stage = False
elif node.bl_idname == 'HistogramPassNodeType':
make_histogram_pass(stages, node_group, node)
append_stage = False
elif node.bl_idname == 'BlurBasicPassNodeType':
make_blur_basic_pass(stages, node_group, node)
append_stage = False
@ -790,7 +796,10 @@ def traverse_renderpath(node, node_group, render_targets, depth_buffers):
bpy.data.worlds['Arm'].rp_defs += '_SMAA'
elif node.bl_idname == 'SSSPassNodeType':
bpy.data.worlds['Arm'].rp_defs += '_SSS'
bpy.data.worlds['Arm'].rp_defs += '_SSS'
elif node.bl_idname == 'HistogramPassNodeType':
bpy.data.worlds['Arm'].rp_defs += '_Hist'
elif node.bl_idname == 'SSAOPassNodeType' or node.bl_idname == 'ApplySSAOPassNodeType' or node.bl_idname == 'SSAOReprojectPassNodeType':
if bpy.data.worlds['Arm'].generate_ssao: # SSAO enabled
@ -822,7 +831,7 @@ def traverse_renderpath(node, node_group, render_targets, depth_buffers):
traverse_renderpath(loop_node, node_group, render_targets, depth_buffers)
# Prebuilt
elif node.bl_idname == 'MotionBlurPassNodeType' or node.bl_idname == 'MotionBlurVelocityPassNodeType' or node.bl_idname == 'CopyPassNodeType' or node.bl_idname == 'MatIDToDepthNodeType' or node.bl_idname == 'BlendPassNodeType' or node.bl_idname == 'CombinePassNodeType' or node.bl_idname == 'DebugNormalsPassNodeType' or node.bl_idname == 'FXAAPassNodeType' or node.bl_idname == 'SSResolveNodeType' or node.bl_idname == 'TAAPassNodeType' or node.bl_idname == 'WaterPassNodeType' or node.bl_idname == 'DeferredLightPassNodeType' or node.bl_idname == 'DeferredIndirectPassNodeType' or node.bl_idname == 'VolumetricLightPassNodeType' or node.bl_idname == 'TranslucentResolvePassNodeType':
elif node.bl_idname == 'MotionBlurPassNodeType' or node.bl_idname == 'MotionBlurVelocityPassNodeType' or node.bl_idname == 'CopyPassNodeType' or node.bl_idname == 'MatIDToDepthNodeType' or node.bl_idname == 'BlendPassNodeType' or node.bl_idname == 'CombinePassNodeType' or node.bl_idname == 'HistogramPassNodeType' or node.bl_idname == 'DebugNormalsPassNodeType' or node.bl_idname == 'FXAAPassNodeType' or node.bl_idname == 'SSResolveNodeType' or node.bl_idname == 'TAAPassNodeType' or node.bl_idname == 'WaterPassNodeType' or node.bl_idname == 'DeferredLightPassNodeType' or node.bl_idname == 'DeferredIndirectPassNodeType' or node.bl_idname == 'VolumetricLightPassNodeType' or node.bl_idname == 'TranslucentResolvePassNodeType':
if node.inputs[1].is_linked:
tnode = nodes.find_node_by_link(node_group, node, node.inputs[1])
parse_render_target(tnode, node_group, render_targets, depth_buffers)

View file

@ -195,6 +195,19 @@ class CombinePassNode(Node, CGPipelineTreeNode):
self.outputs.new('NodeSocketShader', "Stage")
class HistogramPassNode(Node, CGPipelineTreeNode):
'''Render histogram node'''
bl_idname = 'HistogramPassNodeType'
bl_label = 'Histogram'
bl_icon = 'SOUND'
def init(self, context):
self.inputs.new('NodeSocketShader', "Stage")
self.inputs.new('NodeSocketShader', "Target")
self.inputs.new('NodeSocketShader', "Color")
self.outputs.new('NodeSocketShader', "Stage")
class BlurBasicPassNode(Node, CGPipelineTreeNode):
'''Blur node'''
bl_idname = 'BlurBasicPassNodeType'
@ -730,6 +743,7 @@ class DrawCompositorNode(Node, CGPipelineTreeNode):
self.inputs.new('NodeSocketShader', "Color")
self.inputs.new('NodeSocketShader', "Depth")
self.inputs.new('NodeSocketShader', "Normals")
self.inputs.new('NodeSocketShader', "Histogram")
self.outputs.new('NodeSocketShader', "Stage")
@ -745,6 +759,7 @@ class DrawCompositorWithFXAANode(Node, CGPipelineTreeNode):
self.inputs.new('NodeSocketShader', "Color")
self.inputs.new('NodeSocketShader', "Depth")
self.inputs.new('NodeSocketShader', "Normals")
self.inputs.new('NodeSocketShader', "Histogram")
self.outputs.new('NodeSocketShader', "Stage")
@ -862,6 +877,7 @@ node_categories = [
NodeItem("MatIDToDepthNodeType"),
NodeItem("BlendPassNodeType"),
NodeItem("CombinePassNodeType"),
NodeItem("HistogramPassNodeType"),
NodeItem("BlurBasicPassNodeType"),
NodeItem("DebugNormalsPassNodeType"),
NodeItem("FXAAPassNodeType"),
@ -928,6 +944,7 @@ def register():
bpy.utils.register_class(MatIDToDepthNode)
bpy.utils.register_class(BlendPassNode)
bpy.utils.register_class(CombinePassNode)
bpy.utils.register_class(HistogramPassNode)
bpy.utils.register_class(BlurBasicPassNode)
bpy.utils.register_class(DebugNormalsPassNode)
bpy.utils.register_class(FXAAPassNode)
@ -992,6 +1009,7 @@ def unregister():
bpy.utils.unregister_class(MatIDToDepthNode)
bpy.utils.unregister_class(BlendPassNode)
bpy.utils.unregister_class(CombinePassNode)
bpy.utils.unregister_class(HistogramPassNode)
bpy.utils.unregister_class(BlurBasicPassNode)
bpy.utils.unregister_class(DebugNormalsPassNode)
bpy.utils.unregister_class(FXAAPassNode)

View file

@ -380,6 +380,7 @@ def init_properties():
bpy.types.Camera.rp_dfrs = bpy.props.BoolProperty(name="DFRS", description="Distance field ray-traced shadows", default=False)
bpy.types.Camera.rp_dfgi = bpy.props.BoolProperty(name="DFGI", description="Distance field global illumination", default=False)
bpy.types.Camera.rp_bloom = bpy.props.BoolProperty(name="Bloom", description="Bloom processing", default=False, update=update_renderpath)
bpy.types.Camera.rp_eyeadapt = bpy.props.BoolProperty(name="Eye Adaptation", description="Auto-exposure based on histogram", default=False, update=update_renderpath)
bpy.types.Camera.rp_rendercapture = bpy.props.BoolProperty(name="Render Capture", description="Save output as render result", default=False, update=update_renderpath)
bpy.types.Camera.rp_rendercapture_format = EnumProperty(
items=[('8bit', '8bit', '8bit'),

View file

@ -44,6 +44,7 @@ def set_preset(self, context, preset):
cam.rp_dfao = False
cam.rp_dfgi = False
cam.rp_bloom = False
cam.rp_eyeadapt = False
cam.rp_rendercapture = False
cam.rp_motionblur = 'None'
elif preset == 'Forward':
@ -72,6 +73,7 @@ def set_preset(self, context, preset):
cam.rp_dfao = False
cam.rp_dfgi = False
cam.rp_bloom = False
cam.rp_eyeadapt = False
cam.rp_rendercapture = False
cam.rp_motionblur = 'None'
elif preset == 'Deferred':
@ -100,6 +102,7 @@ def set_preset(self, context, preset):
cam.rp_dfao = False
cam.rp_dfgi = False
cam.rp_bloom = False
cam.rp_eyeadapt = False
cam.rp_rendercapture = False
cam.rp_motionblur = 'None'
elif preset == 'Max':
@ -128,6 +131,7 @@ def set_preset(self, context, preset):
cam.rp_dfao = False
cam.rp_dfgi = False
cam.rp_bloom = False
cam.rp_eyeadapt = False
cam.rp_rendercapture = False
cam.rp_motionblur = 'None'
elif preset == 'Render Capture':
@ -156,6 +160,7 @@ def set_preset(self, context, preset):
cam.rp_dfao = False
cam.rp_dfgi = False
cam.rp_bloom = False
cam.rp_eyeadapt = False
cam.rp_rendercapture = True
cam.rp_rendercapture_format = '8bit'
cam.rp_motionblur = 'None'
@ -187,6 +192,7 @@ def set_preset(self, context, preset):
cam.rp_dfao = False
cam.rp_dfgi = False
cam.rp_bloom = False
cam.rp_eyeadapt = False
cam.rp_rendercapture = False
cam.rp_motionblur = 'None'
elif preset == 'VR Low':
@ -215,6 +221,7 @@ def set_preset(self, context, preset):
cam.rp_dfao = False
cam.rp_dfgi = False
cam.rp_bloom = False
cam.rp_eyeadapt = False
cam.rp_rendercapture = False
cam.rp_motionblur = 'None'
elif preset == 'Mobile Low':
@ -243,6 +250,7 @@ def set_preset(self, context, preset):
cam.rp_dfao = False
cam.rp_dfgi = False
cam.rp_bloom = False
cam.rp_eyeadapt = False
cam.rp_rendercapture = False
cam.rp_motionblur = 'None'
elif preset == 'Grease Pencil':
@ -270,6 +278,7 @@ def set_preset(self, context, preset):
cam.rp_dfao = False
cam.rp_dfgi = False
cam.rp_bloom = False
cam.rp_eyeadapt = False
cam.rp_rendercapture = False
cam.rp_motionblur = 'None'
@ -360,6 +369,7 @@ class GenRPDataPropsPanel(bpy.types.Panel):
# layout.prop(dat, "rp_dfrs")
# layout.prop(dat, "rp_dfgi")
layout.prop(dat, "rp_bloom")
layout.prop(dat, "rp_eyeadapt")
layout.prop(dat, "rp_motionblur")
layout.prop(dat, "rp_rendercapture")
if dat.rp_rendercapture:

Binary file not shown.