diff options
Diffstat (limited to 'res/effectlib/refraction.glsllib')
-rw-r--r-- | res/effectlib/refraction.glsllib | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/res/effectlib/refraction.glsllib b/res/effectlib/refraction.glsllib new file mode 100644 index 0000000..f961c50 --- /dev/null +++ b/res/effectlib/refraction.glsllib @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2014 NVIDIA Corporation. +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt 3D Studio. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// this is entirly phiysical incorrect +// We just use this to fake distortion when we have no environment available +// The displacement is calculated on ior +vec3 refraction( in sampler2D sampler, in float materialIOR ) +{ + vec3 displace = fresnel( viewDir, vec3( materialIOR )); + + float xdir = abs( viewDir.x ); + float ydir = abs( viewDir.y ); + + vec2 texSize = vec2( textureSize( sampler, 0 ) ); + vec2 newUV = vec2(gl_FragCoord.xy/texSize); + if ( xdir > ydir) + { + newUV = ( viewDir.x > 0.0) ? newUV + displace.xy : newUV - displace.xy; + } + else + { + newUV = ( viewDir.y > 0.0) ? newUV - displace.xy : newUV + displace.xy; + } + + vec3 refractColor = texture( sampler, newUV ).rgb; + + return refractColor; +} + +// This should really not be used, but it's there for the sake of testing. +vec3 refractBlur( in sampler2D sampler, in vec3 viewDir, in float materialIOR, in float blurWidth ) +{ + // This is really terrible, but at least is a little better than + vec3 displace = viewDir * materialIOR; + + vec2 texSize = vec2( textureSize( sampler, 0 ) ); + texSize = vec2(1.0) / texSize; + vec2 newUV = vec2(gl_FragCoord.xy * texSize); + newUV += displace.xy * 0.005; + + //vec3 refractColor = texture( sampler, newUV ).rgb; + vec3 refractColor = vec3(0); + int sz = int(ceil(blurWidth)); + float wtsum = 0.0; + + for (int y = -sz; y <= sz; ++y) + { + for (int x = -sz; x <= sz; ++x) + { + float wt = float(x*x + y*y) / (blurWidth * 0.5); + wt = exp2(-wt); + //refractColor += wt * textureOffset( sampler, newUV, ivec2(x, y) ).rgb; + vec2 uvOfs = vec2(x, y) * texSize; + refractColor += wt * texture( sampler, newUV+uvOfs).rgb; + wtsum += wt; + } + } + + return refractColor / wtsum; +} |