From 1001cf9000178e2117bf5372db47054c002f0f7b Mon Sep 17 00:00:00 2001 From: Raffi Bedikian Date: Sun, 30 Aug 2015 20:48:06 -0700 Subject: [PATCH] Add shader files for FXAA --- libraries/render-utils/src/fxaa.slf | 77 +++++++++++++++++++++++ libraries/render-utils/src/fxaa.slv | 26 ++++++++ libraries/render-utils/src/fxaa_blend.slf | 24 +++++++ 3 files changed, 127 insertions(+) create mode 100644 libraries/render-utils/src/fxaa.slf create mode 100644 libraries/render-utils/src/fxaa.slv create mode 100644 libraries/render-utils/src/fxaa_blend.slf diff --git a/libraries/render-utils/src/fxaa.slf b/libraries/render-utils/src/fxaa.slf new file mode 100644 index 0000000000..1f10756ce6 --- /dev/null +++ b/libraries/render-utils/src/fxaa.slf @@ -0,0 +1,77 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// fxaa.frag +// fragment shader +// +// Created by Raffi Bedikian on 8/30/15 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +// FXAA shader, GLSL code adapted from: +// http://horde3d.org/wiki/index.php5?title=Shading_Technique_-_FXAA +// Whitepaper describing the technique: +// http://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf + +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +uniform sampler2D colorTexture; +uniform vec2 texcoordOffset; + +in vec2 varTexcoord; +out vec4 outFragColor; + +void main() { + float FXAA_SPAN_MAX = 8.0; + float FXAA_REDUCE_MUL = 1.0/8.0; + float FXAA_REDUCE_MIN = (1.0/128.0); + + vec3 rgbNW = texture2D(colorTexture, varTexcoord + (vec2(-1.0, -1.0) * texcoordOffset)).xyz; + vec3 rgbNE = texture2D(colorTexture, varTexcoord + (vec2(+1.0, -1.0) * texcoordOffset)).xyz; + vec3 rgbSW = texture2D(colorTexture, varTexcoord + (vec2(-1.0, +1.0) * texcoordOffset)).xyz; + vec3 rgbSE = texture2D(colorTexture, varTexcoord + (vec2(+1.0, +1.0) * texcoordOffset)).xyz; + vec3 rgbM = texture2D(colorTexture, varTexcoord).xyz; + + 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)) * texcoordOffset; + + vec3 rgbA = (1.0/2.0) * ( + texture2D(colorTexture, varTexcoord + dir * (1.0/3.0 - 0.5)).xyz + + texture2D(colorTexture, varTexcoord + dir * (2.0/3.0 - 0.5)).xyz); + vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * ( + texture2D(colorTexture, varTexcoord + dir * (0.0/3.0 - 0.5)).xyz + + texture2D(colorTexture, varTexcoord + dir * (3.0/3.0 - 0.5)).xyz); + float lumaB = dot(rgbB, luma); + + if (lumaB < lumaMin || lumaB > lumaMax) { + outFragColor.xyz=rgbA; + } else { + outFragColor.xyz=rgbB; + } + outFragColor.a = 1.0; +} diff --git a/libraries/render-utils/src/fxaa.slv b/libraries/render-utils/src/fxaa.slv new file mode 100644 index 0000000000..35a96ceb24 --- /dev/null +++ b/libraries/render-utils/src/fxaa.slv @@ -0,0 +1,26 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// fxaa.vert +// vertex shader +// +// Created by Raffi Bedikian on 8/30/15 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +<@include gpu/Inputs.slh@> + +<@include gpu/Transform.slh@> + +<$declareStandardTransform()$> + +out vec2 varTexcoord; + +void main(void) { + varTexcoord = inTexCoord0.xy; + gl_Position = inPosition; +} diff --git a/libraries/render-utils/src/fxaa_blend.slf b/libraries/render-utils/src/fxaa_blend.slf new file mode 100644 index 0000000000..d5819cc9a6 --- /dev/null +++ b/libraries/render-utils/src/fxaa_blend.slf @@ -0,0 +1,24 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// fxaa_blend.frag +// fragment shader +// +// Created by Raffi Bedikian on 8/30/15 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +<@include DeferredBufferWrite.slh@> + +in vec2 varTexcoord; +out vec4 outFragColor; + +uniform sampler2D colorTexture; + +void main(void) { + outFragColor = texture(colorTexture, varTexcoord); +}