Begin histogram
This commit is contained in:
parent
a0d14aed21
commit
a60a2ff3ed
|
@ -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;
|
||||
|
|
19
Shaders/histogram_pass/histogram_pass.frag.glsl
Normal file
19
Shaders/histogram_pass/histogram_pass.frag.glsl
Normal 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;
|
||||
}
|
15
Shaders/histogram_pass/histogram_pass.json
Normal file
15
Shaders/histogram_pass/histogram_pass.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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']
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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.
Loading…
Reference in a new issue