From 0f7fb460b085d4665179aba0fc66e152af074b9e Mon Sep 17 00:00:00 2001 From: hunterk Date: Tue, 28 Feb 2017 08:07:00 -0600 Subject: [PATCH] add fast-bilateral manual conversion --- denoisers/fast-bilateral.glslp | 5 + denoisers/shaders/fast-bilateral.glsl | 194 ++++++++++++++++++++++++++ 2 files changed, 199 insertions(+) create mode 100644 denoisers/fast-bilateral.glslp create mode 100644 denoisers/shaders/fast-bilateral.glsl diff --git a/denoisers/fast-bilateral.glslp b/denoisers/fast-bilateral.glslp new file mode 100644 index 0000000..9c4dc4a --- /dev/null +++ b/denoisers/fast-bilateral.glslp @@ -0,0 +1,5 @@ +shaders = 1 + +shader0 = shaders/fast-bilateral.glsl +filter_linear0 = false +scale_type_0 = source \ No newline at end of file diff --git a/denoisers/shaders/fast-bilateral.glsl b/denoisers/shaders/fast-bilateral.glsl new file mode 100644 index 0000000..4d1caee --- /dev/null +++ b/denoisers/shaders/fast-bilateral.glsl @@ -0,0 +1,194 @@ +/* + Hyllian's Fast Bilateral Shader + + Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +// Compatibility #ifdefs needed for parameters +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +// Parameter lines go here: +#pragma parameter SIGMA_R "Bilateral Blur" 0.4 0.0 1.0 0.1 +#ifdef PARAMETER_UNIFORM +// All parameter floats need to have COMPAT_PRECISION in front of them +uniform COMPAT_PRECISION float SIGMA_R; +#else +#define SIGMA_R 0.4 +#endif + +#define saturate(c) clamp(c, 0.0, 1.0) +#define lerp(c) mix(c) +#define mul(a,b) (b*a) +#define fmod(c) mod(c) +#define frac(c) fract(c) +#define tex2D(c,d) texture(c,d) +#define float2 vec2 +#define float3 vec3 +#define float4 vec4 +#define int2 ivec2 +#define int3 ivec3 +#define int4 ivec4 +#define bool2 bvec2 +#define bool3 bvec3 +#define bool4 bvec4 +#define float2x2 mat2x2 +#define float3x3 mat3x3 +#define float4x4 mat4x4 + +#define decal Source + +#define BIL(M,K) {col=GET(M,K);ds=M*M+K*K;weight=exp(-ds/sd2)*exp(-(col-center)*(col-center)/si2);color+=(weight*col);wsum+=weight;} + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +uniform mat4 MVPMatrix; +uniform int FrameDirection; +uniform int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + COL0 = COLOR; + TEX0.xy = TexCoord.xy; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform int FrameDirection; +uniform int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy +#define texture(c, d) COMPAT_TEXTURE(c, d) +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutputSize vec4(OutputSize, 1.0 / OutputSize) + +#define GET(M,K) (tex2D(decal,tc+M*dx+K*dy).xyz) + +void main() +{ + float ds, sd2, si2; + float sigma_d = 3.0; + float sigma_r = SIGMA_R*0.04; + + float3 color = float3(0.0, 0.0, 0.0); + float3 wsum = float3(0.0, 0.0, 0.0); + float3 weight; + + float2 dx = float2(1.0, 0.0) * SourceSize.zw; + float2 dy = float2(0.0, 1.0) * SourceSize.zw; + + sd2 = 2.0 * sigma_d * sigma_d; + si2 = 2.0 * sigma_r * sigma_r; + + float2 tc = vTexCoord; + + float3 col; + float3 center = GET(0,0); + + BIL(-2,-2) + BIL(-1,-2) + BIL( 0,-2) + BIL( 1,-2) + BIL( 2,-2) + BIL(-2,-1) + BIL(-1,-1) + BIL( 0,-1) + BIL( 1,-1) + BIL( 2,-1) + BIL(-2, 0) + BIL(-1, 0) + BIL( 0, 0) + BIL( 1, 0) + BIL( 2, 0) + BIL(-2, 1) + BIL(-1, 1) + BIL( 0, 1) + BIL( 1, 1) + BIL( 2, 1) + BIL(-2, 2) + BIL(-1, 2) + BIL( 0, 2) + BIL( 1, 2) + BIL( 2, 2) + + // Weight normalization + color /= wsum; + FragColor = vec4(color, 1.0); +} +#endif