diff options
Diffstat (limited to 'src/Runtime/ogl-runtime/res/effectlib/microfacetBSDF.glsllib')
m--------- | src/Runtime/ogl-runtime | 0 | ||||
-rw-r--r-- | src/Runtime/ogl-runtime/res/effectlib/microfacetBSDF.glsllib | 259 |
2 files changed, 0 insertions, 259 deletions
diff --git a/src/Runtime/ogl-runtime b/src/Runtime/ogl-runtime new file mode 160000 +Subproject 427fddb50d43aa21a90fc7356ee3cdd8a908df5 diff --git a/src/Runtime/ogl-runtime/res/effectlib/microfacetBSDF.glsllib b/src/Runtime/ogl-runtime/res/effectlib/microfacetBSDF.glsllib deleted file mode 100644 index 8e489107..00000000 --- a/src/Runtime/ogl-runtime/res/effectlib/microfacetBSDF.glsllib +++ /dev/null @@ -1,259 +0,0 @@ -/**************************************************************************** -** -** 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$ -** -****************************************************************************/ - -#ifndef MICROFACET_BSDF_GLSLLIB -#define MICROFACET_BSDF_GLSLLIB 1 - - -float GtermSchlick( in mat3 tanFrame, in vec3 l, in vec3 v, in float roughness ) -{ - float NdotV = clamp(dot(tanFrame[2], v), 0.0, 1.0); - float NdotL = clamp(dot(tanFrame[2], l), 0.0, 1.0); - float k = roughness*roughness*0.79788; - - float G_V = NdotV / (NdotV * (1.0 + k) + k); - float G_L = NdotL / (NdotL * (1.0 + k) + k); - - return clamp(( G_V * G_L ), 0.0, 1.0); -} - -float GtermGGX( in mat3 tanFrame, in vec3 l, in vec3 v, in float roughness ) -{ - float NdotV = clamp(dot(tanFrame[2], v), 0.0, 1.0); - float NdotL = clamp(dot(tanFrame[2], l), 0.0, 1.0); - float k = clamp(roughness*roughness, 0.00, 1.0); - - float G_V = NdotV + sqrt( (NdotV - NdotV * k) * NdotV + k ); - float G_L = NdotL + sqrt( (NdotL - NdotL * k) * NdotL + k ); - - return clamp( 2.0 / ( G_V * G_L ), 0.0, 1.0); -} - -float DtermGGX( in mat3 tanFrame, in vec3 L, in vec3 V, in float roughness ) -{ - float m = clamp(roughness, 0.04, 1.0); - float m2 = m*m; - - vec3 H = normalize(L + V); - float NdotH = clamp(dot( tanFrame[2], H ), 0.0001, 1.0); - float NdotH2 = NdotH * NdotH; - - float denom = NdotH2 * (m2 - 1.0) + 1.0; - float D = m2 / (PI * denom * denom); - - return max( 0.0, D); -} - -float DtermGGXAniso( in mat3 tanFrame, in vec3 L, in vec3 V, in float roughnessU, float roughnessV ) -{ - float roughU = clamp(roughnessU, 0.04, 1.0); - float roughV = clamp(roughnessV, 0.04, 1.0); - vec3 H = normalize(L + V); - float NdotH = clamp( dot(tanFrame[2], H), 0.0001, 1.0 ); - float m = PI * roughU * roughV; - float HdotX = clamp( abs(dot(H, tanFrame[0])), 0.0001, 1.0 ); - float HdotY = clamp( abs(dot(H, tanFrame[1])), 0.0001, 1.0 ); - - float x2 = roughU*roughU; - float y2 = roughV*roughV; - - float D = (HdotX*HdotX/x2) + (HdotY*HdotY/y2) + (NdotH*NdotH); - D = 1.0 / ( m * D * D ); - - return max( 0.0, D); -} - -vec4 microfacetBSDF( in mat3 tanFrame, in vec3 L, in vec3 V, in vec3 lightSpecular, float ior, - in float roughnessU, in float roughnessV, int mode ) -{ - vec4 rgba = vec4( 0.0, 0.0, 0.0, 1.0 ); - vec3 H = normalize(L + V); - float HdotL = clamp(dot(H, L), 0.0, 1.0); - float NdotL = dot(tanFrame[2], L); - - if ( NdotL > 0.0 ) - { - if ( ( mode == scatter_reflect ) || ( mode == scatter_reflect_transmit ) ) - { - float roughness = calculateRoughness( tanFrame[2], roughnessU, roughnessV, tanFrame[0] ); - // G term - //float G = GtermSchlick( tanFrame, L, V, roughness ); - float G = GtermGGX( tanFrame, L, V, roughness ); - - //float D = DtermGGX( tanFrame, L, V, roughness ); - float D = DtermGGXAniso( tanFrame, L, V, roughnessU, roughnessV ); - rgba.rgb = G * D * NdotL * lightSpecular; - } - - if ( ( mode == scatter_transmit ) || ( mode == scatter_reflect_transmit ) ) - { - rgba.a = pow(1.0 - clamp(HdotL, 0.0, 1.0), 5.0); - } - } - - return rgba; -} - -vec4 microfacetBSDFEnvironment( in mat3 tanFrame, in vec3 viewDir, in float roughnessU, in float roughnessV, int mode ) -{ - vec3 rgb = vec3( 0.0, 0.0, 0.0 ); -#if !QT3DS_ENABLE_LIGHT_PROBE - if ( uEnvironmentMappingEnabled ) - { - float roughness = calculateRoughness( tanFrame[2], roughnessU, roughnessV, tanFrame[0] ); - vec3 R = reflect( -viewDir, tanFrame[2] ); - rgb = 0.01 * evalEnvironmentMap( R, roughness ); - rgb = microfacetBSDF( tanFrame, R, viewDir, rgb, 1.0, roughnessU, roughnessV, scatter_reflect ).rgb; - } -#endif - return( vec4( rgb, 1.0 ) ); -} - - -// see http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html - -float radicalInverse_VdC( uint bits) -{ - bits = (bits << 16u) | (bits >> 16u); - bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); - bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); - bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); - bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); - return float(bits) * 2.3283064365386963e-10; // / 0x100000000 - } - -vec2 hammersley2d(uint i, uint N) -{ - return vec2(float(i)/float(N), radicalInverse_VdC(i)); -} - -vec2 hammersly[4] = vec2[4] ( - vec2(0.0, 0.0), - vec2(0.25, 0.5), - vec2(0.5, 0.25), - vec2(0.75, 0.75) - ); - -vec3 ImportanceGGX( in mat3 tanFrame, vec2 Xi, float roughness , vec3 N ) -{ - float a = roughness * roughness; - float Phi = 2.0 * PI * Xi.y; - float CosTheta = (1.0 - Xi.x); - float SinTheta = sqrt( 1.0 - CosTheta * CosTheta ); - - vec3 H; - H.x = SinTheta * cos( Phi ); - H.y = SinTheta * sin( Phi ); - H.z = CosTheta; - - // Tangent to world space - return tanFrame[0] * H.x + tanFrame[1] * H.y + tanFrame[2] * H.z; -} - -float DtermGGXAnisoSampled( in mat3 tanFrame, in vec3 H, in float roughnessU, float roughnessV ) -{ -#if (MATERIAL_IS_NON_DIELECTRIC == 1) - float roughU = clamp(roughnessU*roughnessU, 0.01, 1.0); - float roughV = clamp(roughnessV*roughnessV, 0.01, 1.0); -#else - float roughU = clamp(roughnessU, 0.02, 1.0); - float roughV = clamp(roughnessV, 0.02, 1.0); -#endif - - float NdotH = clamp( dot(tanFrame[2], H), 0.0001, 1.0 ); - float m = PI * roughU * roughV; - float HdotX = clamp( abs(dot(H, tanFrame[0])), 0.0001, 1.0 ); - float HdotY = clamp( abs(dot(H, tanFrame[1])), 0.0001, 1.0 ); - - float x2 = roughU*roughU; - float y2 = roughV*roughV; - - float pdf = (HdotX*HdotX/x2) + (HdotY*HdotY/y2) + (NdotH*NdotH); - float D = 1.0 / ( m * pdf * pdf ); - - return max( 0.0, D); -} - -vec3 sampleEnv(in vec3 L, float pdf, uint sampleCount, float roughness ) -{ - vec2 envMapSize = vec2( textureSize( uEnvironmentTexture, 0 ) ); - float envMapLevels = log2( max( envMapSize.x, envMapSize.y ) ); - - float a = 0.5*log2( float(envMapSize.x*envMapSize.y) / float(sampleCount) ); - float d = 4.0 * (abs(L.z) + 1.0) * (abs(L.z) + 1.0); - float b = 0.5*log2( pdf * d ); - - // convert coord to 2D - vec2 tc = vec2( ( atan( L.x, -L.z ) + PI ) / ( 2.0 * PI ), acos( -L.y ) / PI ); - float weight = step( 0.0001, roughness ); - - float lod = max( 0.0, min( (a - b)*weight, envMapLevels )); - - return( textureLod( uEnvironmentTexture, tc, lod ).rgb ); -} - -vec4 microfacetSampledBSDF( in mat3 tanFrame, in vec3 viewDir, in float roughnessU, in float roughnessV, int mode ) -{ - vec3 rgb = vec3( 0.0, 0.0, 0.0 ); - - float roughness = clamp( calculateRoughness( tanFrame[2], roughnessU, roughnessV, tanFrame[0] ), 0.0, 1.0 ); - - vec3 R = reflect( -viewDir, tanFrame[2] ); - - const uint NumSamples = 4u; - for( uint i = 0u; i < NumSamples; i++ ) - { - vec2 Xi = hammersly[i]; // pre computed values - //vec2 Xi = hammersley2d(i, NumSamples); - vec3 Half = ImportanceGGX( tanFrame, Xi, roughness , tanFrame[2] ); - vec3 H = normalize( Half ); - - vec3 L = 2.0 * dot( viewDir, Half ) * Half - viewDir; - float NdotV = clamp( dot( tanFrame[2], viewDir ), 0.0001, 1.0 ); - float NdotR = clamp( dot( tanFrame[2], R ), 0.0, 1.0 ); - float NdotH = clamp( dot( tanFrame[2], H ), 0.0001, 1.0 ); - - if( NdotV > 0.0001 ) - { - float G = GtermGGX( tanFrame, L, viewDir, roughness ); - float D = DtermGGXAnisoSampled( tanFrame, H, roughnessU, roughnessV); - - vec3 envColor = 0.01 * sampleEnv( L, D, NumSamples, roughness ); - - rgb += (envColor * G * D * NdotR) / ( 4.0 * NdotV * NdotH); - } - } - - rgb /= float(NumSamples); - - return( vec4( rgb, 1.0 ) ); -} - -#endif |