From 804d3c94008831febf9c019e68859ef942393196 Mon Sep 17 00:00:00 2001 From: Lubos Lenco Date: Fri, 1 Apr 2016 01:48:18 +0200 Subject: [PATCH] Bloom pass. --- Assets/bloom_material.json | 16 ++++++++++++ raw/bloom_pass/bloom_pass.frag.glsl | 22 +++++++++++++++++ raw/bloom_pass/bloom_pass.shader.json | 33 +++++++++++++++++++++++++ raw/bloom_pass/bloom_pass.vert.glsl | 18 ++++++++++++++ raw/blur_pass/blur_pass.frag.glsl | 19 +++++++++++++- raw/combine_pass/combine_pass.frag.glsl | 26 +++++++++++++------ raw/compile.py | 16 +++++++----- 7 files changed, 136 insertions(+), 14 deletions(-) create mode 100644 Assets/bloom_material.json create mode 100644 raw/bloom_pass/bloom_pass.frag.glsl create mode 100755 raw/bloom_pass/bloom_pass.shader.json create mode 100644 raw/bloom_pass/bloom_pass.vert.glsl diff --git a/Assets/bloom_material.json b/Assets/bloom_material.json new file mode 100644 index 00000000..d3a1de51 --- /dev/null +++ b/Assets/bloom_material.json @@ -0,0 +1,16 @@ +{ + "material_resources": [ + { + "contexts": [ + { + "bind_constants": [], + "bind_textures": [ + ], + "id": "bloom_pass" + } + ], + "id": "bloom_material", + "shader": "bloom_pass/bloom_pass" + } + ] +} diff --git a/raw/bloom_pass/bloom_pass.frag.glsl b/raw/bloom_pass/bloom_pass.frag.glsl new file mode 100644 index 00000000..7e1c916a --- /dev/null +++ b/raw/bloom_pass/bloom_pass.frag.glsl @@ -0,0 +1,22 @@ +#version 450 + +#ifdef GL_ES +precision mediump float; +#endif + +uniform sampler2D tex; + +in vec2 texCoord; + +void main() { + vec4 col = texture(tex, texCoord); + + float brightness = dot(col.rgb, vec3(0.2126, 0.7152, 0.0722)); + if (brightness > 0.99) { + gl_FragColor = vec4(col.rgb, 1.0); + return; + } + + gl_FragColor = vec4(0.0); + // gl_FragColor = col; +} diff --git a/raw/bloom_pass/bloom_pass.shader.json b/raw/bloom_pass/bloom_pass.shader.json new file mode 100755 index 00000000..acd45b9d --- /dev/null +++ b/raw/bloom_pass/bloom_pass.shader.json @@ -0,0 +1,33 @@ +{ + "contexts": [ + { + "id": "bloom_pass", + "params": [ + { + "id": "depth_write", + "value": "true" + }, + { + "id": "compare_mode", + "value": "always" + }, + { + "id": "cull_mode", + "value": "none" + }, + { + "id": "blend_source", + "value": "blend_one" + }, + { + "id": "blend_destination", + "value": "blend_zero" + } + ], + "links": [], + "texture_params": [], + "vertex_shader": "bloom_pass.vert.glsl", + "fragment_shader": "bloom_pass.frag.glsl" + } + ] +} diff --git a/raw/bloom_pass/bloom_pass.vert.glsl b/raw/bloom_pass/bloom_pass.vert.glsl new file mode 100644 index 00000000..e1cc9c08 --- /dev/null +++ b/raw/bloom_pass/bloom_pass.vert.glsl @@ -0,0 +1,18 @@ +#version 450 + +#ifdef GL_ES +precision highp float; +#endif + +in vec2 pos; + +out vec2 texCoord; + +const vec2 madd = vec2(0.5, 0.5); + +void main() { + // Scale vertex attribute to [0-1] range + texCoord = pos.xy * madd + madd; + + gl_Position = vec4(pos.xy, 0.0, 1.0); +} diff --git a/raw/blur_pass/blur_pass.frag.glsl b/raw/blur_pass/blur_pass.frag.glsl index 2b20eaaf..6f5a3217 100644 --- a/raw/blur_pass/blur_pass.frag.glsl +++ b/raw/blur_pass/blur_pass.frag.glsl @@ -9,9 +9,26 @@ uniform vec2 dir; in vec2 texCoord; +const float weight[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216); + void main() { vec2 step = dir / vec2(400, 300); + // vec2 step = dir / vec2(800, 600); + vec3 result = texture(tex, texCoord).rgb * weight[0]; + + result += texture(tex, texCoord + step * 1).rgb * weight[1]; + result += texture(tex, texCoord - step * 1).rgb * weight[1]; + result += texture(tex, texCoord + step * 2).rgb * weight[2]; + result += texture(tex, texCoord - step * 2).rgb * weight[2]; + result += texture(tex, texCoord + step * 3).rgb * weight[3]; + result += texture(tex, texCoord - step * 3).rgb * weight[3]; + result += texture(tex, texCoord + step * 4).rgb * weight[4]; + result += texture(tex, texCoord - step * 4).rgb * weight[4]; + + gl_FragColor = vec4(vec3(result), 1.0); + + /* float res = texture( tex, texCoord + (step * 4.0) ).r; res += texture( tex, texCoord + (step * 3.0) ).r; res += texture( tex, texCoord + (step * 2.0) ).r; @@ -23,6 +40,6 @@ void main() { res += texture( tex, texCoord -(step * 4.0) ).r; res /= 9.0; - gl_FragColor = vec4(vec3(res), 1.0); + gl_FragColor = vec4(vec3(res), 1.0);*/ // gl_FragColor = texture(tex, texCoord); } diff --git a/raw/combine_pass/combine_pass.frag.glsl b/raw/combine_pass/combine_pass.frag.glsl index 239d7030..97952894 100644 --- a/raw/combine_pass/combine_pass.frag.glsl +++ b/raw/combine_pass/combine_pass.frag.glsl @@ -4,16 +4,28 @@ precision mediump float; #endif -uniform sampler2D lightmap; -uniform sampler2D aomap; +uniform sampler2D tex; +uniform sampler2D tex2; in vec2 texCoord; +const float exposure = 1.0; +const float gamma = 2.2; + void main() { - vec3 lcol = texture(lightmap, texCoord).rgb; - vec3 aocol = texture(aomap, texCoord).rgb; + vec3 col = texture(tex, texCoord).rgb; + vec3 col2 = texture(tex2, texCoord).rgb; - gl_FragColor = vec4(lcol * aocol, 1.0); - // gl_FragColor = vec4(aocol, 1.0); - // gl_FragColor = vec4(lcol, 1.0); + // // Additive blending + col += col2; + + // // Tone mapping + // vec3 result = vec3(1.0) - exp(-col * exposure); + + // // Gamma correction + // result = pow(result, vec3(1.0 / gamma)); + // gl_FragColor = vec4(result, 1.0f); + + + gl_FragColor = vec4(col, 1.0); } diff --git a/raw/compile.py b/raw/compile.py index 5f9afa11..e49fc993 100644 --- a/raw/compile.py +++ b/raw/compile.py @@ -43,13 +43,17 @@ os.chdir('../dof_pass') make_resources.make('dof_pass.shader.json') make_variants.make('dof_pass.shader.json') -os.chdir('../ssr_pass') -make_resources.make('ssr_pass.shader.json') -make_variants.make('ssr_pass.shader.json') +os.chdir('../bloom_pass') +make_resources.make('bloom_pass.shader.json') +make_variants.make('bloom_pass.shader.json') -# os.chdir('../combine_pass') -# make_resources.make('combine_pass.shader.json') -# make_variants.make('combine_pass.shader.json') +# os.chdir('../ssr_pass') +# make_resources.make('ssr_pass.shader.json') +# make_variants.make('ssr_pass.shader.json') + +os.chdir('../combine_pass') +make_resources.make('combine_pass.shader.json') +make_variants.make('combine_pass.shader.json') # os.chdir('../pt_trace_pass') # make_resources.make('pt_trace_pass.shader.json')