diff --git a/Assets/deferred_material.json b/Assets/deferred_material.json new file mode 100644 index 00000000..c084fc6f --- /dev/null +++ b/Assets/deferred_material.json @@ -0,0 +1,42 @@ +{ + "material_resources": [ + { + "contexts": [ + { + "bind_constants": [], + "bind_textures": [ + { + "id": "senvmapIrradiance", + "name": "envmap_irradiance" + }, + { + "id": "senvmapRadiance", + "mipmap_filter": "linear", + "mipmaps": [ + "envmap_radiance_0", + "envmap_radiance_1", + "envmap_radiance_2", + "envmap_radiance_3", + "envmap_radiance_4", + "envmap_radiance_5", + "envmap_radiance_6", + "envmap_radiance_7", + "envmap_radiance_8", + "envmap_radiance_9", + "envmap_radiance_10" + ], + "name": "envmap_radiance" + }, + { + "id": "senvmapBrdf", + "name": "envmap_brdf" + } + ], + "id": "deferred_light" + } + ], + "id": "deferred_material", + "shader": "deferred_light/deferred_light" + } + ] +} diff --git a/Assets/fxaa_material.json b/Assets/fxaa_material.json new file mode 100644 index 00000000..f22fa672 --- /dev/null +++ b/Assets/fxaa_material.json @@ -0,0 +1,16 @@ +{ + "material_resources": [ + { + "contexts": [ + { + "bind_constants": [], + "bind_textures": [ + ], + "id": "fxaa_pass" + } + ], + "id": "fxaa_material", + "shader": "fxaa_pass/fxaa_pass" + } + ] +} diff --git a/raw/compile.py b/raw/compile.py index 2b861e53..3f7f31f9 100644 --- a/raw/compile.py +++ b/raw/compile.py @@ -23,6 +23,10 @@ os.chdir('../env_map') make_resources.make('env_map.shader.json') make_variants.make('env_map.shader.json') +os.chdir('../fxaa_pass') +make_resources.make('fxaa_pass.shader.json') +make_variants.make('fxaa_pass.shader.json') + # os.chdir('../ssao_pass') # make_resources.make('ssao_pass.shader.json') # make_variants.make('ssao_pass.shader.json') diff --git a/raw/fxaa_pass/fxaa_pass.frag.glsl b/raw/fxaa_pass/fxaa_pass.frag.glsl new file mode 100644 index 00000000..8c21e93c --- /dev/null +++ b/raw/fxaa_pass/fxaa_pass.frag.glsl @@ -0,0 +1,66 @@ +#version 450 + +#ifdef GL_ES +precision mediump float; +#endif + +#define FXAA_REDUCE_MIN (1.0 / 128.0) +#define FXAA_REDUCE_MUL (1.0 / 8.0) +#define FXAA_SPAN_MAX 8.0 + +uniform sampler2D tex; + +in vec2 texCoord; + +void main() { + vec2 resolution = vec2(640.0, 480.0); + vec2 texStep = 1.0 / resolution.xy; + + vec2 tcrgbNW = (texCoord + vec2(-1.0, -1.0) * texStep); + vec2 tcrgbNE = (texCoord + vec2(1.0, -1.0) * texStep); + vec2 tcrgbSW = (texCoord + vec2(-1.0, 1.0) * texStep); + vec2 tcrgbSE = (texCoord + vec2(1.0, 1.0) * texStep); + vec2 tcrgbM = vec2(texCoord); + + vec3 rgbNW = texture(tex, tcrgbNW).rgb; + vec3 rgbNE = texture(tex, tcrgbNE).rgb; + vec3 rgbSW = texture(tex, tcrgbSW).rgb; + vec3 rgbSE = texture(tex, tcrgbSE).rgb; + vec4 texColor = texture(tex, tcrgbM); + vec3 rgbM = texColor.rgb; + vec3 luma = vec3(0.299, 0.587, 0.114); + float lumaNW = dot(rgbNW, luma); + float lumaNE = dot(rgbNE, luma); + float lumaSW = dot(rgbSW, luma); + float lumaSE = dot(rgbSE, luma); + float lumaM = dot(rgbM, luma); + float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); + float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE))); + + vec2 dir; + dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE)); + dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE)); + + float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * + (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN); + + float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce); + dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), + max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), + dir * rcpDirMin)) * texStep; + + vec3 rgbA = 0.5 * ( + texture(tex, texCoord + dir * (1.0 / 3.0 - 0.5)).rgb + + texture(tex, texCoord + dir * (2.0 / 3.0 - 0.5)).rgb); + vec3 rgbB = rgbA * 0.5 + 0.25 * ( + texture(tex, texCoord + dir * -0.5).rgb + + texture(tex, texCoord + dir * 0.5).rgb); + + float lumaB = dot(rgbB, luma); + if ((lumaB < lumaMin) || (lumaB > lumaMax)) + gl_FragColor = vec4(rgbA, texColor.a); + else + gl_FragColor = vec4(rgbB, texColor.a); + + // gl_FragColor = texColor; +} diff --git a/raw/fxaa_pass/fxaa_pass.shader.json b/raw/fxaa_pass/fxaa_pass.shader.json new file mode 100755 index 00000000..8edfe9c9 --- /dev/null +++ b/raw/fxaa_pass/fxaa_pass.shader.json @@ -0,0 +1,33 @@ +{ + "contexts": [ + { + "id": "fxaa_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": "fxaa_pass.vert.glsl", + "fragment_shader": "fxaa_pass.frag.glsl" + } + ] +} diff --git a/raw/fxaa_pass/fxaa_pass.vert.glsl b/raw/fxaa_pass/fxaa_pass.vert.glsl new file mode 100644 index 00000000..e1cc9c08 --- /dev/null +++ b/raw/fxaa_pass/fxaa_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); +}