UNPKG

@babylonjs/viewer

Version:

The Babylon Viewer aims to simplify a specific but common Babylon.js use case: loading, viewing, and interacting with a 3D model.

1,007 lines (991 loc) 93.9 kB
import { S as ShaderStore } from './index-MZPybX0H.esm.js'; import { p as prePassDeclaration, o as oitDeclaration, d as decalFragmentDeclaration, t as textureRepetitionFunctions, a as depthPrePass, b as oitFragment } from './oitFragment-DoYw4kgZ.esm.js'; import { s as sceneFragmentDeclaration, o as openpbrDielectricReflectance, a as openpbrGeometryInfo, b as openpbrIblFunctions, d as openpbrTransmissionLayerData, c as openpbrSubsurfaceLayerData } from './openpbrTransmissionLayerData-BO64I2B5.esm.js'; import { s as sceneUboDeclaration } from './sceneUboDeclaration-D-TsHbOr.esm.js'; import { m as meshUboDeclaration } from './meshUboDeclaration-Bv_BtoSy.esm.js'; import { o as openpbrUboDeclaration } from './openpbrUboDeclaration-BH97laNT.esm.js'; import { m as mainUVVaryingDeclaration } from './mainUVVaryingDeclaration-Bm0UsfVq.esm.js'; import { p as pbrFragmentExtraDeclaration, s as subSurfaceScatteringFunctions, a as pbrHelperFunctions, b as pbrDirectLightingSetupFunctions, c as pbrDirectLightingFalloffFunctions, d as pbrDirectLightingFunctions, e as pbrBlockNormalGeometric, f as pbrBlockImageProcessing, g as pbrDebug } from './pbrDebug-D-r1eiut.esm.js'; import { l as lightFragmentDeclaration, a as lightUboDeclaration, s as shadowsFragmentFunctions, b as ltcHelperFunctions } from './shadowsFragmentFunctions-A24LahRk.esm.js'; import { s as samplerFragmentDeclaration } from './samplerFragmentDeclaration-79xnpfH1.esm.js'; import { p as pbrFragmentReflectionDeclaration, a as pbrIBLFunctions } from './pbrIBLFunctions-Bxq2HzKy.esm.js'; import { i as imageProcessingDeclaration, a as imageProcessingFunctions } from './imageProcessingFunctions-ZNIKNDtH.esm.js'; import { c as clipPlaneFragmentDeclaration, a as clipPlaneFragment } from './clipPlaneFragment-CKB1su_H.esm.js'; import { l as logDepthDeclaration } from './logDepthDeclaration-BdXvBJD5.esm.js'; import { f as fogFragmentDeclaration, a as fogFragment } from './fogFragment-C3YQIhnt.esm.js'; import { h as helperFunctions } from './helperFunctions-BVaVsPjM.esm.js'; import { i as importanceSampling, h as hdrFilteringFunctions } from './hdrFilteringFunctions-FqTqoCZG.esm.js'; import { h as harmonicsFunctions } from './harmonicsFunctions-CyUiGbEt.esm.js'; import { p as pbrBRDFFunctions } from './pbrBRDFFunctions-QbgJVHGQ.esm.js'; import { r as reflectionFunction } from './reflectionFunction-B6TP4JGf.esm.js'; import { l as logDepthFragment } from './logDepthFragment-4hdISSc_.esm.js'; // Do not edit. const name$j = "openpbrFragmentDeclaration"; const shader$j = `uniform float vBaseWeight;uniform vec4 vBaseColor;uniform float vBaseDiffuseRoughness;uniform vec4 vReflectanceInfo;uniform vec4 vSpecularColor;uniform vec3 vSpecularAnisotropy;uniform float vTransmissionWeight;uniform vec3 vTransmissionColor;uniform float vTransmissionDepth;uniform vec3 vTransmissionScatter;uniform float vTransmissionScatterAnisotropy;uniform float vTransmissionDispersionScale;uniform float vTransmissionDispersionAbbeNumber;uniform float vSubsurfaceWeight;uniform vec3 vSubsurfaceColor;uniform float vSubsurfaceRadius;uniform vec3 vSubsurfaceRadiusScale;uniform float vSubsurfaceScatterAnisotropy;uniform float vCoatWeight;uniform vec3 vCoatColor;uniform float vCoatRoughness;uniform float vCoatRoughnessAnisotropy;uniform float vCoatIor;uniform float vCoatDarkening;uniform float vFuzzWeight;uniform vec3 vFuzzColor;uniform float vFuzzRoughness;uniform vec2 vGeometryCoatTangent;uniform float vGeometryThickness;uniform vec3 vEmissionColor;uniform float vThinFilmWeight;uniform vec2 vThinFilmThickness;uniform float vThinFilmIor;uniform float vGeometryThinWalled;uniform vec4 vLightingIntensity;uniform float visibility;uniform vec2 renderTargetSize; #ifdef BASE_COLOR uniform vec2 vBaseColorInfos; #endif #ifdef BASE_WEIGHT uniform vec2 vBaseWeightInfos; #endif #ifdef BASE_METALNESS uniform vec2 vBaseMetalnessInfos; #endif #ifdef BASE_DIFFUSE_ROUGHNESS uniform vec2 vBaseDiffuseRoughnessInfos; #endif #ifdef SPECULAR_WEIGHT uniform vec2 vSpecularWeightInfos; #endif #ifdef SPECULAR_COLOR uniform vec2 vSpecularColorInfos; #endif #ifdef SPECULAR_ROUGHNESS uniform vec2 vSpecularRoughnessInfos; #endif #ifdef SPECULAR_ROUGHNESS_ANISOTROPY uniform vec2 vSpecularRoughnessAnisotropyInfos; #endif #ifdef SPECULAR_IOR uniform vec2 vSpecularIorInfos; #endif #ifdef AMBIENT_OCCLUSION uniform vec2 vAmbientOcclusionInfos; #endif #ifdef GEOMETRY_NORMAL uniform vec2 vGeometryNormalInfos; #endif #ifdef GEOMETRY_TANGENT uniform vec2 vGeometryTangentInfos; #endif #if defined(GEOMETRY_NORMAL) || defined(GEOMETRY_COAT_NORMAL) uniform vec2 vTangentSpaceParams; #endif #ifdef GEOMETRY_COAT_NORMAL uniform vec2 vGeometryCoatNormalInfos; #endif #ifdef GEOMETRY_OPACITY uniform vec2 vGeometryOpacityInfos; #endif #ifdef GEOMETRY_THICKNESS uniform vec2 vGeometryThicknessInfos; #endif #ifdef EMISSION_COLOR uniform vec2 vEmissionColorInfos; #endif #ifdef TRANSMISSION_WEIGHT uniform vec2 vTransmissionWeightInfos; #endif #ifdef TRANSMISSION_COLOR uniform vec2 vTransmissionColorInfos; #endif #ifdef TRANSMISSION_DEPTH uniform vec2 vTransmissionDepthInfos; #endif #ifdef TRANSMISSION_SCATTER uniform vec2 vTransmissionScatterInfos; #endif #ifdef TRANSMISSION_DISPERSION_SCALE uniform vec2 vTransmissionDispersionScaleInfos; #endif #ifdef SUBSURFACE_WEIGHT uniform vec2 vSubsurfaceWeightInfos; #endif #ifdef SUBSURFACE_COLOR uniform vec2 vSubsurfaceColorInfos; #endif #ifdef SUBSURFACE_RADIUS_SCALE uniform vec2 vSubsurfaceRadiusScaleInfos; #endif #ifdef COAT_WEIGHT uniform vec2 vCoatWeightInfos; #endif #ifdef COAT_COLOR uniform vec2 vCoatColorInfos; #endif #ifdef COAT_ROUGHNESS uniform vec2 vCoatRoughnessInfos; #endif #ifdef COAT_ROUGHNESS_ANISOTROPY uniform vec2 vCoatRoughnessAnisotropyInfos; #endif #ifdef COAT_IOR uniform vec2 vCoatIorInfos; #endif #ifdef COAT_DARKENING uniform vec2 vCoatDarkeningInfos; #endif #ifdef FUZZ_WEIGHT uniform vec2 vFuzzWeightInfos; #endif #ifdef FUZZ_COLOR uniform vec2 vFuzzColorInfos; #endif #ifdef FUZZ_ROUGHNESS uniform vec2 vFuzzRoughnessInfos; #endif #ifdef GEOMETRY_COAT_TANGENT uniform vec2 vGeometryCoatTangentInfos; #endif #ifdef THIN_FILM_WEIGHT uniform vec2 vThinFilmWeightInfos; #endif #ifdef THIN_FILM_THICKNESS uniform vec2 vThinFilmThicknessInfos; #endif #include<sceneFragmentDeclaration> #ifdef REFLECTION uniform vec2 vReflectionInfos; #ifdef REALTIME_FILTERING uniform vec2 vReflectionFilteringInfo; #endif uniform mat4 reflectionMatrix;uniform vec3 vReflectionMicrosurfaceInfos; #if defined(USEIRRADIANCEMAP) && defined(USE_IRRADIANCE_DOMINANT_DIRECTION) uniform vec3 vReflectionDominantDirection; #endif #if defined(USE_LOCAL_REFLECTIONMAP_CUBIC) && defined(REFLECTIONMAP_CUBIC) uniform vec3 vReflectionPosition;uniform vec3 vReflectionSize; #endif #endif #ifdef PREPASS #ifdef SS_SCATTERING uniform float scatteringDiffusionProfile; #endif #endif #if DEBUGMODE>0 uniform vec2 vDebugMode; #endif #ifdef DETAIL uniform vec4 vDetailInfos; #endif #include<decalFragmentDeclaration> #ifdef USESPHERICALFROMREFLECTIONMAP #ifdef SPHERICAL_HARMONICS uniform vec3 vSphericalL00;uniform vec3 vSphericalL1_1;uniform vec3 vSphericalL10;uniform vec3 vSphericalL11;uniform vec3 vSphericalL2_2;uniform vec3 vSphericalL2_1;uniform vec3 vSphericalL20;uniform vec3 vSphericalL21;uniform vec3 vSphericalL22; #else uniform vec3 vSphericalX;uniform vec3 vSphericalY;uniform vec3 vSphericalZ;uniform vec3 vSphericalXX_ZZ;uniform vec3 vSphericalYY_ZZ;uniform vec3 vSphericalZZ;uniform vec3 vSphericalXY;uniform vec3 vSphericalYZ;uniform vec3 vSphericalZX; #endif #endif #ifdef REFRACTED_BACKGROUND uniform mat4 backgroundRefractionMatrix;uniform vec3 vBackgroundRefractionInfos; #endif #if TEXTURE_REPETITION_MODE>0 uniform vec4 vTextureRepetitionHexTilingParams; #endif #define ADDITIONAL_FRAGMENT_DECLARATION `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$j]) { ShaderStore.IncludesShadersStore[name$j] = shader$j; } /** @internal */ const openpbrFragmentDeclaration = { name: name$j, shader: shader$j }; // Do not edit. const name$i = "openpbrFragmentSamplersDeclaration"; const shader$i = `#include<samplerFragmentDeclaration>(_DEFINENAME_,BASE_COLOR,_VARYINGNAME_,BaseColor,_SAMPLERNAME_,baseColor) #include<samplerFragmentDeclaration>(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight,_SAMPLERNAME_,baseWeight) #include<samplerFragmentDeclaration>(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness,_SAMPLERNAME_,baseDiffuseRoughness) #include<samplerFragmentDeclaration>(_DEFINENAME_,BASE_METALNESS,_VARYINGNAME_,BaseMetalness,_SAMPLERNAME_,baseMetalness) #include<samplerFragmentDeclaration>(_DEFINENAME_,SPECULAR_WEIGHT,_VARYINGNAME_,SpecularWeight,_SAMPLERNAME_,specularWeight) #include<samplerFragmentDeclaration>(_DEFINENAME_,SPECULAR_COLOR,_VARYINGNAME_,SpecularColor,_SAMPLERNAME_,specularColor) #include<samplerFragmentDeclaration>(_DEFINENAME_,SPECULAR_ROUGHNESS,_VARYINGNAME_,SpecularRoughness,_SAMPLERNAME_,specularRoughness) #include<samplerFragmentDeclaration>(_DEFINENAME_,SPECULAR_ROUGHNESS_ANISOTROPY,_VARYINGNAME_,SpecularRoughnessAnisotropy,_SAMPLERNAME_,specularRoughnessAnisotropy) #include<samplerFragmentDeclaration>(_DEFINENAME_,TRANSMISSION_WEIGHT,_VARYINGNAME_,TransmissionWeight,_SAMPLERNAME_,transmissionWeight) #include<samplerFragmentDeclaration>(_DEFINENAME_,TRANSMISSION_COLOR,_VARYINGNAME_,TransmissionColor,_SAMPLERNAME_,transmissionColor) #include<samplerFragmentDeclaration>(_DEFINENAME_,TRANSMISSION_DEPTH,_VARYINGNAME_,TransmissionDepth,_SAMPLERNAME_,transmissionDepth) #include<samplerFragmentDeclaration>(_DEFINENAME_,TRANSMISSION_SCATTER,_VARYINGNAME_,TransmissionScatter,_SAMPLERNAME_,transmissionScatter) #include<samplerFragmentDeclaration>(_DEFINENAME_,TRANSMISSION_DISPERSION_SCALE,_VARYINGNAME_,TransmissionDispersionScale,_SAMPLERNAME_,transmissionDispersionScale) #include<samplerFragmentDeclaration>(_DEFINENAME_,SUBSURFACE_WEIGHT,_VARYINGNAME_,SubsurfaceWeight,_SAMPLERNAME_,subsurfaceWeight) #include<samplerFragmentDeclaration>(_DEFINENAME_,SUBSURFACE_COLOR,_VARYINGNAME_,SubsurfaceColor,_SAMPLERNAME_,subsurfaceColor) #include<samplerFragmentDeclaration>(_DEFINENAME_,SUBSURFACE_RADIUS_SCALE,_VARYINGNAME_,SubsurfaceRadiusScale,_SAMPLERNAME_,subsurfaceRadiusScale) #include<samplerFragmentDeclaration>(_DEFINENAME_,COAT_WEIGHT,_VARYINGNAME_,CoatWeight,_SAMPLERNAME_,coatWeight) #include<samplerFragmentDeclaration>(_DEFINENAME_,COAT_COLOR,_VARYINGNAME_,CoatColor,_SAMPLERNAME_,coatColor) #include<samplerFragmentDeclaration>(_DEFINENAME_,COAT_ROUGHNESS,_VARYINGNAME_,CoatRoughness,_SAMPLERNAME_,coatRoughness) #include<samplerFragmentDeclaration>(_DEFINENAME_,COAT_ROUGHNESS_ANISOTROPY,_VARYINGNAME_,CoatRoughnessAnisotropy,_SAMPLERNAME_,coatRoughnessAnisotropy) #include<samplerFragmentDeclaration>(_DEFINENAME_,COAT_DARKENING,_VARYINGNAME_,CoatDarkening,_SAMPLERNAME_,coatDarkening) #include<samplerFragmentDeclaration>(_DEFINENAME_,FUZZ_WEIGHT,_VARYINGNAME_,FuzzWeight,_SAMPLERNAME_,fuzzWeight) #include<samplerFragmentDeclaration>(_DEFINENAME_,FUZZ_COLOR,_VARYINGNAME_,FuzzColor,_SAMPLERNAME_,fuzzColor) #include<samplerFragmentDeclaration>(_DEFINENAME_,FUZZ_ROUGHNESS,_VARYINGNAME_,FuzzRoughness,_SAMPLERNAME_,fuzzRoughness) #include<samplerFragmentDeclaration>(_DEFINENAME_,GEOMETRY_OPACITY,_VARYINGNAME_,GeometryOpacity,_SAMPLERNAME_,geometryOpacity) #include<samplerFragmentDeclaration>(_DEFINENAME_,GEOMETRY_TANGENT,_VARYINGNAME_,GeometryTangent,_SAMPLERNAME_,geometryTangent) #include<samplerFragmentDeclaration>(_DEFINENAME_,GEOMETRY_COAT_TANGENT,_VARYINGNAME_,GeometryCoatTangent,_SAMPLERNAME_,geometryCoatTangent) #include<samplerFragmentDeclaration>(_DEFINENAME_,GEOMETRY_THICKNESS,_VARYINGNAME_,GeometryThickness,_SAMPLERNAME_,geometryThickness) #include<samplerFragmentDeclaration>(_DEFINENAME_,EMISSION_COLOR,_VARYINGNAME_,EmissionColor,_SAMPLERNAME_,emissionColor) #include<samplerFragmentDeclaration>(_DEFINENAME_,THIN_FILM_WEIGHT,_VARYINGNAME_,ThinFilmWeight,_SAMPLERNAME_,thinFilmWeight) #include<samplerFragmentDeclaration>(_DEFINENAME_,THIN_FILM_THICKNESS,_VARYINGNAME_,ThinFilmThickness,_SAMPLERNAME_,thinFilmThickness) #include<samplerFragmentDeclaration>(_DEFINENAME_,AMBIENT_OCCLUSION,_VARYINGNAME_,AmbientOcclusion,_SAMPLERNAME_,ambientOcclusion) #include<samplerFragmentDeclaration>(_DEFINENAME_,DECAL,_VARYINGNAME_,Decal,_SAMPLERNAME_,decal) #include<pbrFragmentReflectionDeclaration> #ifdef ENVIRONMENTBRDF uniform sampler2D environmentBrdfSampler; #endif #ifdef FUZZENVIRONMENTBRDF uniform sampler2D environmentFuzzBrdfSampler; #endif #ifdef REFRACTED_BACKGROUND uniform sampler2D backgroundRefractionSampler; #endif #ifdef USE_IRRADIANCE_TEXTURE_FOR_SCATTERING uniform sampler2D sceneIrradianceSampler;uniform sampler2D sceneDepthSampler; #endif #if defined(ANISOTROPIC) || defined(FUZZ) || defined(REFRACTED_BACKGROUND) || defined(USE_IRRADIANCE_TEXTURE_FOR_SCATTERING) uniform sampler2D blueNoiseSampler; #endif #ifdef IBL_CDF_FILTERING uniform sampler2D icdfSampler; #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$i]) { ShaderStore.IncludesShadersStore[name$i] = shader$i; } /** @internal */ const openpbrFragmentSamplersDeclaration = { name: name$i, shader: shader$i }; // Do not edit. const name$h = "openpbrNormalMapFragmentMainFunctions"; const shader$h = `#if defined(GEOMETRY_NORMAL) || defined(GEOMETRY_COAT_NORMAL) || defined(ANISOTROPIC) || defined(FUZZ) || defined(DETAIL) #if defined(TANGENT) && defined(NORMAL) varying mat3 vTBN; #endif #ifdef OBJECTSPACE_NORMALMAP uniform mat4 normalMatrix; #if defined(WEBGL2) || defined(WEBGPU) mat4 toNormalMatrix(mat4 wMatrix) {mat4 ret=inverse(wMatrix);ret=transpose(ret);ret[0][3]=0.;ret[1][3]=0.;ret[2][3]=0.;ret[3]=vec4(0.,0.,0.,1.);return ret;} #else mat4 toNormalMatrix(mat4 m) {float a00=m[0][0],a01=m[0][1],a02=m[0][2],a03=m[0][3], a10=m[1][0],a11=m[1][1],a12=m[1][2],a13=m[1][3], a20=m[2][0],a21=m[2][1],a22=m[2][2],a23=m[2][3], a30=m[3][0],a31=m[3][1],a32=m[3][2],a33=m[3][3], b00=a00*a11-a01*a10, b01=a00*a12-a02*a10, b02=a00*a13-a03*a10, b03=a01*a12-a02*a11, b04=a01*a13-a03*a11, b05=a02*a13-a03*a12, b06=a20*a31-a21*a30, b07=a20*a32-a22*a30, b08=a20*a33-a23*a30, b09=a21*a32-a22*a31, b10=a21*a33-a23*a31, b11=a22*a33-a23*a32, det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;mat4 mi=mat4( a11*b11-a12*b10+a13*b09, a02*b10-a01*b11-a03*b09, a31*b05-a32*b04+a33*b03, a22*b04-a21*b05-a23*b03, a12*b08-a10*b11-a13*b07, a00*b11-a02*b08+a03*b07, a32*b02-a30*b05-a33*b01, a20*b05-a22*b02+a23*b01, a10*b10-a11*b08+a13*b06, a01*b08-a00*b10-a03*b06, a30*b04-a31*b02+a33*b00, a21*b02-a20*b04-a23*b00, a11*b07-a10*b09-a12*b06, a00*b09-a01*b07+a02*b06, a31*b01-a30*b03-a32*b00, a20*b03-a21*b01+a22*b00)/det;return mat4(mi[0][0],mi[1][0],mi[2][0],mi[3][0], mi[0][1],mi[1][1],mi[2][1],mi[3][1], mi[0][2],mi[1][2],mi[2][2],mi[3][2], mi[0][3],mi[1][3],mi[2][3],mi[3][3]);} #endif #endif vec3 perturbNormalBase(mat3 cotangentFrame,vec3 normal,float scale) { #ifdef NORMALXYSCALE normal=normalize(normal*vec3(scale,scale,1.0)); #endif return normalize(cotangentFrame*normal);} vec3 perturbNormal(mat3 cotangentFrame,vec3 textureSample,float scale) {return perturbNormalBase(cotangentFrame,textureSample*2.0-1.0,scale);} mat3 cotangent_frame(vec3 normal,vec3 p,vec2 uv,vec2 tangentSpaceParams) {vec3 dp1=dFdx(p);vec3 dp2=dFdy(p);vec2 duv1=dFdx(uv);vec2 duv2=dFdy(uv);vec3 dp2perp=cross(dp2,normal);vec3 dp1perp=cross(normal,dp1);vec3 tangent=dp2perp*duv1.x+dp1perp*duv2.x;vec3 bitangent=dp2perp*duv1.y+dp1perp*duv2.y;tangent*=tangentSpaceParams.x;bitangent*=tangentSpaceParams.y;float det=max(dot(tangent,tangent),dot(bitangent,bitangent));float invmax=det==0.0 ? 0.0 : inversesqrt(det);return mat3(tangent*invmax,bitangent*invmax,normal);} #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$h]) { ShaderStore.IncludesShadersStore[name$h] = shader$h; } /** @internal */ const openpbrNormalMapFragmentMainFunctions = { name: name$h, shader: shader$h }; // Do not edit. const name$g = "openpbrNormalMapFragmentFunctions"; const shader$g = `#if defined(GEOMETRY_NORMAL) #include<samplerFragmentDeclaration>(_DEFINENAME_,GEOMETRY_NORMAL,_VARYINGNAME_,GeometryNormal,_SAMPLERNAME_,geometryNormal) #endif #if defined(GEOMETRY_COAT_NORMAL) #include<samplerFragmentDeclaration>(_DEFINENAME_,GEOMETRY_COAT_NORMAL,_VARYINGNAME_,GeometryCoatNormal,_SAMPLERNAME_,geometryCoatNormal) #endif #if defined(DETAIL) #include<samplerFragmentDeclaration>(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_SAMPLERNAME_,detail) #endif #if defined(GEOMETRY_NORMAL) && defined(PARALLAX) const float minSamples=4.;const float maxSamples=15.;const int iMaxSamples=15;vec2 parallaxOcclusion(vec3 vViewDirCoT,vec3 vNormalCoT,vec2 texCoord,float parallaxScale) {float parallaxLimit=length(vViewDirCoT.xy)/vViewDirCoT.z;parallaxLimit*=parallaxScale;vec2 vOffsetDir=normalize(vViewDirCoT.xy);vec2 vMaxOffset=vOffsetDir*parallaxLimit;float numSamples=maxSamples+(dot(vViewDirCoT,vNormalCoT)*(minSamples-maxSamples));float stepSize=1.0/numSamples;float currRayHeight=1.0;vec2 vCurrOffset=vec2(0,0);vec2 vLastOffset=vec2(0,0);float lastSampledHeight=1.0;float currSampledHeight=1.0;bool keepWorking=true;for (int i=0; i<iMaxSamples; i++) {currSampledHeight=texture2D(geometryNormalSampler,texCoord+vCurrOffset).w;if (!keepWorking) {} else if (currSampledHeight>currRayHeight) {float delta1=currSampledHeight-currRayHeight;float delta2=(currRayHeight+stepSize)-lastSampledHeight;float ratio=delta1/(delta1+delta2);vCurrOffset=(ratio)* vLastOffset+(1.0-ratio)*vCurrOffset;keepWorking=false;} else {currRayHeight-=stepSize;vLastOffset=vCurrOffset; #ifdef PARALLAX_RHS vCurrOffset-=stepSize*vMaxOffset; #else vCurrOffset+=stepSize*vMaxOffset; #endif lastSampledHeight=currSampledHeight;}} return vCurrOffset;} vec2 parallaxOffset(vec3 viewDir,float heightScale) {float height=texture2D(geometryNormalSampler,vGeometryNormalUV).w;vec2 texCoordOffset=heightScale*viewDir.xy*height; #ifdef PARALLAX_RHS return texCoordOffset; #else return -texCoordOffset; #endif } #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$g]) { ShaderStore.IncludesShadersStore[name$g] = shader$g; } /** @internal */ const openpbrNormalMapFragmentFunctions = { name: name$g, shader: shader$g }; // Do not edit. const name$f = "openpbrConductorReflectance"; const shader$f = `#define pbr_inline ReflectanceParams conductorReflectance(in vec3 baseColor,in vec3 specularColor,in float specularWeight) {ReflectanceParams outParams; #if (CONDUCTOR_SPECULAR_MODEL==CONDUCTOR_SPECULAR_MODEL_OPENPBR) outParams.coloredF0=baseColor*specularWeight;outParams.coloredF90=specularColor*specularWeight; #else outParams.coloredF0=baseColor;outParams.coloredF90=vec3(1.0); #endif outParams.F0=1.0;outParams.F90=1.0;return outParams;}`; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$f]) { ShaderStore.IncludesShadersStore[name$f] = shader$f; } /** @internal */ const openpbrConductorReflectance = { name: name$f, shader: shader$f }; // Do not edit. const name$e = "openpbrAmbientOcclusionFunctions"; const shader$e = `float compute_specular_occlusion(const float n_dot_v,const float metallic,const float ambient_occlusion,const float roughness) {float specular_occlusion=saturate(pow(n_dot_v+ambient_occlusion,exp2(-16.0*roughness-1.0))-1.0+ambient_occlusion);return mix(specular_occlusion,1.0,metallic*square(1.0-roughness));} `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$e]) { ShaderStore.IncludesShadersStore[name$e] = shader$e; } /** @internal */ const openpbrAmbientOcclusionFunctions = { name: name$e, shader: shader$e }; // Do not edit. const name$d = "openpbrVolumeFunctions"; const shader$d = `struct OpenPBRHomogeneousVolume {vec3 extinction_coeff; vec3 ss_albedo; vec3 multi_scatter_color; vec3 absorption_coeff; vec3 scatter_coeff; float anisotropy; };OpenPBRHomogeneousVolume computeOpenPBRTransmissionVolume( in vec3 transmission_color, in float transmission_depth, in vec3 transmission_scatter, in float anisotropy ) {OpenPBRHomogeneousVolume volumeParams;volumeParams.absorption_coeff=vec3(0.0);volumeParams.scatter_coeff=vec3(0.0);volumeParams.anisotropy=anisotropy; #ifdef GEOMETRY_THIN_WALLED volumeParams.scatter_coeff=vec3(1.0);volumeParams.anisotropy=1.0; volumeParams.extinction_coeff=volumeParams.absorption_coeff+volumeParams.scatter_coeff;volumeParams.ss_albedo=vec3(1.0); #else if (transmission_depth>0.0) {vec3 invDepth=vec3(1./maxEps(transmission_depth));volumeParams.extinction_coeff=-log(maxEps(transmission_color.rgb))*invDepth;volumeParams.scatter_coeff=transmission_scatter.rgb*invDepth;volumeParams.absorption_coeff=volumeParams.extinction_coeff-volumeParams.scatter_coeff.rgb;float minCoeff=min3(volumeParams.absorption_coeff);if (minCoeff<0.0) {volumeParams.absorption_coeff-=vec3(minCoeff);} volumeParams.extinction_coeff=volumeParams.absorption_coeff+volumeParams.scatter_coeff;volumeParams.ss_albedo=volumeParams.scatter_coeff/(volumeParams.extinction_coeff);} else {volumeParams.extinction_coeff=volumeParams.absorption_coeff+volumeParams.scatter_coeff;volumeParams.ss_albedo=vec3(0.0);} #endif return volumeParams;} OpenPBRHomogeneousVolume computeOpenPBRSubsurfaceVolume( in vec3 subsurface_color, in float subsurface_radius, in vec3 subsurface_radius_scale, in float anisotropy ) {OpenPBRHomogeneousVolume volumeParams;volumeParams.absorption_coeff=vec3(0.0);volumeParams.scatter_coeff=vec3(0.0);volumeParams.anisotropy=anisotropy;volumeParams.multi_scatter_color=subsurface_color;vec3 mfp=subsurface_radius_scale*vec3(subsurface_radius);volumeParams.extinction_coeff=vec3(1.0)/maxEps(mfp);volumeParams.ss_albedo=multiScatterToSingleScatterAlbedo(subsurface_color,anisotropy);volumeParams.scatter_coeff=volumeParams.ss_albedo*volumeParams.extinction_coeff;volumeParams.absorption_coeff=volumeParams.extinction_coeff-volumeParams.scatter_coeff.rgb;float minCoeff=min3(volumeParams.absorption_coeff);if (minCoeff<0.0) {volumeParams.absorption_coeff-=vec3(minCoeff);} volumeParams.extinction_coeff=volumeParams.absorption_coeff+volumeParams.scatter_coeff;return volumeParams;} vec3 sss_pdf(float r,vec3 d) {d=max(vec3(1e-4f),d);return (exp(-r/d)+exp(-r/(3.0f*d)))/max(vec3(1e-5f),8.0f*PI*d*r);} float sss_samples_pdf(float r,float d) {d=max(1e-4f,d);return exp(-r/(3.0f*d))/(6.0f*PI*d*r);} float sss_samples_icdf(float x,float d) {d=max(1e-4f,d);x=max(1e-4f,x);return -3.0f*log(x)*d;} float samples_scale(float x,float d) {return 1.0f-exp(-x/(3.0f*d));} vec3 sss_get_position(sampler2D depth_texture,vec2 tex_coord,vec2 render_resolution,mat4 inv_proj) {vec4 P=vec4(tex_coord,texelFetch(depth_texture,ivec2(tex_coord*render_resolution),0).x,1.0f);P.xy=2.0f*P.xy-1.0f;P=inv_proj*P;return P.xyz/P.w;} float sss_filter_scale(float currZ,mat4 proj) {return 1.0f/dot(vec2(proj[2].w,proj[3].w),vec2(currZ,1.0f));} float projective_to_pixels(float proj_dist,mat4 proj,vec2 resolution) {return proj_dist*proj[1][1]*resolution.y;} float pixels_to_projective(float pixel_dist,mat4 proj,vec2 resolution) {return pixel_dist/(proj[1][1]*resolution.y);} vec3 sss_convolve(sampler2D sss_irradiance_texture,sampler2D depth_texture,vec2 render_resolution,vec3 d,mat4 proj,mat4 inv_proj,int sample_count,vec2 noise) {vec2 tex_coord=gl_FragCoord.xy/render_resolution;vec3 unconvolved_irradiance=texelFetch(sss_irradiance_texture,ivec2(gl_FragCoord.xy),0).rgb;vec3 curr_pos=sss_get_position(depth_texture,tex_coord,render_resolution,inv_proj);float dmax=max3(d);float max_dmax=0.1*float(sample_count);if (dmax>max_dmax) {d.rgb*=max_dmax/dmax;dmax=max_dmax;} float dz=dmax*sss_filter_scale(curr_pos.z,proj);mat2 projMat2d=mat2(proj);if (determinant(projMat2d)*dz<1e-4f) return unconvolved_irradiance;float overscan_size_in_pixels=max(render_resolution.x,render_resolution.y)*0.1;const float filter_crop_ratio=0.8f; float crop_radius=projective_to_pixels(sss_samples_icdf(1.0f-filter_crop_ratio,dz),proj,render_resolution);if (crop_radius>overscan_size_in_pixels) {d.rgb*=overscan_size_in_pixels/crop_radius;dz*=overscan_size_in_pixels/crop_radius;} float filter_samples_scale=samples_scale(pixels_to_projective(overscan_size_in_pixels,proj,render_resolution),dz);vec3 irradiance_sum=vec3(0.0f);vec3 weight_sum=vec3(0.0f);for (int i=0; i<sample_count; i++) {vec2 r=fract(plasticSequence(uint(i))+noise);r.x*=TWO_PI;r.y*=filter_samples_scale;float icdf=sss_samples_icdf(1.0-r.y,dz);vec2 sample_uv=tex_coord+icdf*projMat2d*vec2(cos(r.x),sin(r.x));vec4 sss_irradiance=texelFetch(sss_irradiance_texture,ivec2(sample_uv*render_resolution),0);float dist=distance(curr_pos,sss_get_position(depth_texture,sample_uv,render_resolution,inv_proj));if (dist>0.0f) {vec3 weights=sss_irradiance.a/sss_samples_pdf(icdf,dz)*sss_pdf(dist,d.rgb);irradiance_sum+=weights*sss_irradiance.rgb;weight_sum+=weights;}} return vec3(weight_sum.r<1e-5f ? unconvolved_irradiance.r : irradiance_sum.r/weight_sum.r, weight_sum.g<1e-5f ? unconvolved_irradiance.g : irradiance_sum.g/weight_sum.g, weight_sum.b<1e-5f ? unconvolved_irradiance.b : irradiance_sum.b/weight_sum.b);}`; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$d]) { ShaderStore.IncludesShadersStore[name$d] = shader$d; } /** @internal */ const openpbrVolumeFunctions = { name: name$d, shader: shader$d }; // Do not edit. const name$c = "openpbrNormalMapFragment"; const shader$c = `vec2 uvOffset=vec2(0.0,0.0); #if defined(GEOMETRY_NORMAL) || defined(GEOMETRY_COAT_NORMAL) || defined(PARALLAX) || defined(DETAIL) #ifdef NORMALXYSCALE float normalScale=1.0; #elif defined(GEOMETRY_NORMAL) float normalScale=vGeometryNormalInfos.y; #else float normalScale=1.0; #endif #if defined(TANGENT) && defined(NORMAL) mat3 TBN=vTBN; #elif defined(GEOMETRY_NORMAL) vec2 TBNUV=gl_FrontFacing ? vGeometryNormalUV : -vGeometryNormalUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vTangentSpaceParams); #elif defined(GEOMETRY_COAT_NORMAL) vec2 TBNUV=gl_FrontFacing ? vGeometryCoatNormalUV : -vGeometryCoatNormalUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vTangentSpaceParams); #else vec2 TBNUV=gl_FrontFacing ? vDetailUV : -vDetailUV;mat3 TBN=cotangent_frame(normalW*normalScale,vPositionW,TBNUV,vec2(1.,1.)); #endif #elif defined(ANISOTROPIC) || defined(FUZZ) #if defined(TANGENT) && defined(NORMAL) mat3 TBN=vTBN; #else vec2 TBNUV=gl_FrontFacing ? vMainUV1 : -vMainUV1;mat3 TBN=cotangent_frame(normalW,vPositionW,TBNUV,vec2(1.,1.)); #endif #endif #ifdef PARALLAX mat3 invTBN=transposeMat3(TBN); #ifdef PARALLAXOCCLUSION #else #endif #endif #ifdef DETAIL vec4 detailColor=texture2D(detailSampler,vDetailUV+uvOffset);vec2 detailNormalRG=detailColor.wy*2.0-1.0;float detailNormalB=sqrt(1.-saturate(dot(detailNormalRG,detailNormalRG)));vec3 detailNormal=vec3(detailNormalRG,detailNormalB); #endif #ifdef GEOMETRY_COAT_NORMAL coatNormalW=perturbNormal(TBN,TEXRD(geometryCoatNormalSampler,vGeometryCoatNormalUV+uvOffset).xyz,vGeometryCoatNormalInfos.y); #endif #ifdef GEOMETRY_NORMAL #ifdef OBJECTSPACE_NORMALMAP #define CUSTOM_FRAGMENT_BUMP_FRAGMENT normalW=normalize(TEXRD(geometryNormalSampler,vGeometryNormalUV).xyz *2.0-1.0);normalW=normalize(mat3(normalMatrix)*normalW); #elif !defined(DETAIL) normalW=perturbNormal(TBN,TEXRD(geometryNormalSampler,vGeometryNormalUV+uvOffset).xyz,vGeometryNormalInfos.y); #else vec3 sampledNormal=TEXRD(geometryNormalSampler,vGeometryNormalUV+uvOffset).xyz*2.0-1.0; #if DETAIL_NORMALBLENDMETHOD==0 detailNormal.xy*=vDetailInfos.z;vec3 blendedNormal=normalize(vec3(sampledNormal.xy+detailNormal.xy,sampledNormal.z*detailNormal.z)); #elif DETAIL_NORMALBLENDMETHOD==1 detailNormal.xy*=vDetailInfos.z;sampledNormal+=vec3(0.0,0.0,1.0);detailNormal*=vec3(-1.0,-1.0,1.0);vec3 blendedNormal=sampledNormal*dot(sampledNormal,detailNormal)/sampledNormal.z-detailNormal; #endif normalW=perturbNormalBase(TBN,blendedNormal,vGeometryNormalInfos.y); #endif #elif defined(DETAIL) detailNormal.xy*=vDetailInfos.z;normalW=perturbNormalBase(TBN,detailNormal,vDetailInfos.z); #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$c]) { ShaderStore.IncludesShadersStore[name$c] = shader$c; } /** @internal */ const openpbrNormalMapFragment = { name: name$c, shader: shader$c }; // Do not edit. const name$b = "openpbrBlockNormalFinal"; const shader$b = `#if defined(FORCENORMALFORWARD) && defined(NORMAL) vec3 faceNormal=normalize(cross(dFdx(vPositionW),dFdy(vPositionW)))*vEyePosition.w; #if defined(TWOSIDEDLIGHTING) faceNormal=gl_FrontFacing ? faceNormal : -faceNormal; #endif normalW*=sign(dot(normalW,faceNormal));coatNormalW*=sign(dot(coatNormalW,faceNormal)); #endif #if defined(TWOSIDEDLIGHTING) && defined(NORMAL) #if defined(MIRRORED) normalW=gl_FrontFacing ? -normalW : normalW;coatNormalW=gl_FrontFacing ? -coatNormalW : coatNormalW; #else normalW=gl_FrontFacing ? normalW : -normalW;coatNormalW=gl_FrontFacing ? coatNormalW : -coatNormalW; #endif #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$b]) { ShaderStore.IncludesShadersStore[name$b] = shader$b; } /** @internal */ const openpbrBlockNormalFinal = { name: name$b, shader: shader$b }; // Do not edit. const name$a = "openpbrBaseLayerData"; const shader$a = `vec3 base_color=vec3(0.8);float base_metalness=0.0;float base_diffuse_roughness=0.0;float specular_weight=1.0;float specular_roughness=0.3;vec3 specular_color=vec3(1.0);float specular_roughness_anisotropy=0.0;float specular_ior=1.5;float alpha=1.0;vec2 geometry_tangent=vec2(1.0,0.0);float geometry_thickness=0.0; #ifdef BASE_WEIGHT vec4 baseWeightFromTexture=TEXRD(baseWeightSampler,vBaseWeightUV+uvOffset); #endif #ifdef BASE_COLOR vec4 baseColorFromTexture=TEXRD(baseColorSampler,vBaseColorUV+uvOffset); #endif #ifdef BASE_METALNESS vec4 metallicFromTexture=TEXRD(baseMetalnessSampler,vBaseMetalnessUV+uvOffset); #endif #if defined(SPECULAR_ROUGHNESS_FROM_METALNESS_TEXTURE_GREEN) && defined(BASE_METALNESS) float roughnessFromTexture=metallicFromTexture.g; #elif defined(SPECULAR_ROUGHNESS) float roughnessFromTexture=TEXRD(specularRoughnessSampler,vSpecularRoughnessUV+uvOffset).r; #endif #ifdef GEOMETRY_TANGENT vec3 geometryTangentFromTexture=TEXRD(geometryTangentSampler,vGeometryTangentUV+uvOffset).rgb; #endif #ifdef SPECULAR_ROUGHNESS_ANISOTROPY float anisotropyFromTexture=TEXRD(specularRoughnessAnisotropySampler,vSpecularRoughnessAnisotropyUV+uvOffset).r*vSpecularRoughnessAnisotropyInfos.y; #endif #ifdef BASE_DIFFUSE_ROUGHNESS float baseDiffuseRoughnessFromTexture=TEXRD(baseDiffuseRoughnessSampler,vBaseDiffuseRoughnessUV+uvOffset).r; #endif #ifdef GEOMETRY_OPACITY vec4 opacityFromTexture=TEXRD(geometryOpacitySampler,vGeometryOpacityUV+uvOffset); #endif #ifdef GEOMETRY_THICKNESS vec4 thicknessFromTexture=TEXRD(geometryThicknessSampler,vGeometryThicknessUV+uvOffset); #endif #ifdef DECAL vec4 decalFromTexture=texture2D(decalSampler,vDecalUV+uvOffset); #endif #ifdef SPECULAR_COLOR vec4 specularColorFromTexture=TEXRD(specularColorSampler,vSpecularColorUV+uvOffset); #endif #ifdef SPECULAR_WEIGHT #ifdef SPECULAR_WEIGHT_IN_ALPHA float specularWeightFromTexture=TEXRD(specularWeightSampler,vSpecularWeightUV+uvOffset).a; #else float specularWeightFromTexture=TEXRD(specularWeightSampler,vSpecularWeightUV+uvOffset).r; #endif #endif #if defined(ANISOTROPIC) || defined(FUZZ) || defined(REFRACTED_BACKGROUND) || defined(USE_IRRADIANCE_TEXTURE_FOR_SCATTERING) vec3 noise=vec3(2.0)*TEXRD(blueNoiseSampler,gl_FragCoord.xy/256.0).xyz-vec3(1.0); #endif base_color=vBaseColor.rgb; #if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) base_color*=vColor.rgb; #endif #if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES) alpha*=vColor.a; #endif base_color*=vec3(vBaseWeight);alpha=vBaseColor.a;base_metalness=vReflectanceInfo.x;base_diffuse_roughness=vBaseDiffuseRoughness;specular_roughness=vReflectanceInfo.y;specular_color=vSpecularColor.rgb;specular_weight=vReflectanceInfo.a;specular_ior=vReflectanceInfo.z;specular_roughness_anisotropy=vSpecularAnisotropy.b;geometry_tangent=vSpecularAnisotropy.rg;geometry_thickness=vGeometryThickness; #ifdef BASE_COLOR #ifdef BASE_COLOR_GAMMA base_color*=toLinearSpace(baseColorFromTexture.rgb); #else base_color*=baseColorFromTexture.rgb; #endif base_color*=vBaseColorInfos.y; #endif #ifdef BASE_WEIGHT base_color*=baseWeightFromTexture.r; #endif #if defined(BASE_COLOR) && defined(ALPHA_FROM_BASE_COLOR_TEXTURE) alpha*=baseColorFromTexture.a; #elif defined(GEOMETRY_OPACITY) alpha*=opacityFromTexture.r;alpha*=vGeometryOpacityInfos.y; #endif #ifdef GEOMETRY_THICKNESS #ifdef GEOMETRY_THICKNESS_FROM_GREEN_CHANNEL geometry_thickness*=thicknessFromTexture.g; #else geometry_thickness*=thicknessFromTexture.r; #endif geometry_thickness*=vGeometryThicknessInfos.y; #endif #ifdef ALPHATEST #if DEBUGMODE != 88 if (alpha<ALPHATESTVALUE) discard; #endif #ifndef ALPHABLEND alpha=1.0; #endif #endif #ifdef BASE_METALNESS #ifdef BASE_METALNESS_FROM_METALNESS_TEXTURE_BLUE base_metalness*=metallicFromTexture.b; #else base_metalness*=metallicFromTexture.r; #endif #endif #ifdef BASE_DIFFUSE_ROUGHNESS base_diffuse_roughness*=baseDiffuseRoughnessFromTexture*vBaseDiffuseRoughnessInfos.y; #endif #ifdef SPECULAR_COLOR #ifdef SPECULAR_COLOR_GAMMA specular_color*=toLinearSpace(specularColorFromTexture.rgb); #else specular_color*=specularColorFromTexture.rgb; #endif #ifdef SPECULAR_WEIGHT_FROM_SPECULAR_COLOR_TEXTURE specular_weight*=specularColorFromTexture.a; #elif defined(SPECULAR_WEIGHT) specular_weight*=specularWeightFromTexture; #endif #endif #if defined(SPECULAR_ROUGHNESS) || (defined(SPECULAR_ROUGHNESS_FROM_METALNESS_TEXTURE_GREEN) && defined(BASE_METALNESS)) specular_roughness*=roughnessFromTexture; #endif #ifdef GEOMETRY_TANGENT {vec2 tangentFromTexture=normalize(geometryTangentFromTexture.xy*2.0-1.0);float tangent_angle_texture=atan(tangentFromTexture.y,tangentFromTexture.x);float tangent_angle_uniform=atan(geometry_tangent.y,geometry_tangent.x);float tangent_angle=tangent_angle_texture+tangent_angle_uniform;geometry_tangent=vec2(cos(tangent_angle),sin(tangent_angle));} #endif #if defined(GEOMETRY_TANGENT) && \ defined(SPECULAR_ROUGHNESS_ANISOTROPY_FROM_TANGENT_TEXTURE) specular_roughness_anisotropy*=geometryTangentFromTexture.b; #elif defined(SPECULAR_ROUGHNESS_ANISOTROPY) specular_roughness_anisotropy*=anisotropyFromTexture; #endif #ifdef DETAIL float detailRoughness=mix(0.5,detailColor.b,vDetailInfos.w);float loLerp=mix(0.,specular_roughness,detailRoughness*2.);float hiLerp=mix(specular_roughness,1.,(detailRoughness-0.5)*2.);specular_roughness=mix(loLerp,hiLerp,step(detailRoughness,0.5)); #endif #ifdef USE_GLTF_STYLE_ANISOTROPY float baseAlpha=specular_roughness*specular_roughness;float roughnessT=mix(baseAlpha,1.0,specular_roughness_anisotropy*specular_roughness_anisotropy);float roughnessB=baseAlpha;specular_roughness_anisotropy=1.0-roughnessB/max(roughnessT,0.00001);specular_roughness=sqrt(roughnessT/sqrt(2.0/(1.0+(1.0-specular_roughness_anisotropy)*(1.0-specular_roughness_anisotropy)))); #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$a]) { ShaderStore.IncludesShadersStore[name$a] = shader$a; } /** @internal */ const openpbrBaseLayerData = { name: name$a, shader: shader$a }; // Do not edit. const name$9 = "openpbrCoatLayerData"; const shader$9 = `float coat_weight=0.0;vec3 coat_color=vec3(1.0);float coat_roughness=0.0;float coat_roughness_anisotropy=0.0;float coat_ior=1.6;float coat_darkening=1.0;vec2 geometry_coat_tangent=vec2(1.0,0.0); #ifdef COAT_WEIGHT vec4 coatWeightFromTexture=TEXRD(coatWeightSampler,vCoatWeightUV+uvOffset); #endif #ifdef COAT_COLOR vec4 coatColorFromTexture=TEXRD(coatColorSampler,vCoatColorUV+uvOffset); #endif #ifdef COAT_ROUGHNESS vec4 coatRoughnessFromTexture=TEXRD(coatRoughnessSampler,vCoatRoughnessUV+uvOffset); #endif #ifdef COAT_ROUGHNESS_ANISOTROPY float coatRoughnessAnisotropyFromTexture=TEXRD(coatRoughnessAnisotropySampler,vCoatRoughnessAnisotropyUV+uvOffset).r; #endif #ifdef COAT_DARKENING vec4 coatDarkeningFromTexture=TEXRD(coatDarkeningSampler,vCoatDarkeningUV+uvOffset); #endif #ifdef GEOMETRY_COAT_TANGENT vec3 geometryCoatTangentFromTexture=TEXRD(geometryCoatTangentSampler,vGeometryCoatTangentUV+uvOffset).rgb; #endif coat_color=vCoatColor.rgb;coat_weight=vCoatWeight;coat_roughness=vCoatRoughness;coat_roughness_anisotropy=vCoatRoughnessAnisotropy;coat_ior=vCoatIor;coat_darkening=vCoatDarkening;geometry_coat_tangent=vGeometryCoatTangent.rg; #ifdef COAT_WEIGHT coat_weight*=coatWeightFromTexture.r; #endif #ifdef COAT_COLOR #ifdef COAT_COLOR_GAMMA coat_color*=toLinearSpace(coatColorFromTexture.rgb); #else coat_color*=coatColorFromTexture.rgb; #endif coat_color*=vCoatColorInfos.y; #endif #ifdef COAT_ROUGHNESS #ifdef COAT_ROUGHNESS_FROM_GREEN_CHANNEL coat_roughness*=coatRoughnessFromTexture.g; #else coat_roughness*=coatRoughnessFromTexture.r; #endif #endif #if defined(GEOMETRY_COAT_TANGENT) && defined(COAT_ROUGHNESS_ANISOTROPY_FROM_TANGENT_TEXTURE) coat_roughness_anisotropy*=geometryCoatTangentFromTexture.b; #elif defined(COAT_ROUGHNESS_ANISOTROPY) coat_roughness_anisotropy*=coatRoughnessAnisotropyFromTexture; #endif #ifdef COAT_DARKENING coat_darkening*=coatDarkeningFromTexture.r; #endif #ifdef GEOMETRY_COAT_TANGENT {vec2 tangentFromTexture=normalize(geometryCoatTangentFromTexture.xy*2.0-1.0);float tangent_angle_texture=atan(tangentFromTexture.y,tangentFromTexture.x);float tangent_angle_uniform=atan(geometry_coat_tangent.y,geometry_coat_tangent.x);float tangent_angle=tangent_angle_texture+tangent_angle_uniform;geometry_coat_tangent=vec2(cos(tangent_angle),sin(tangent_angle));} #endif #ifdef USE_GLTF_STYLE_ANISOTROPY float coatAlpha=coat_roughness*coat_roughness;float coatRoughnessT=mix(coatAlpha,1.0,coat_roughness_anisotropy*coat_roughness_anisotropy);float coatRoughnessB=coatAlpha;coat_roughness_anisotropy=1.0-coatRoughnessB/max(coatRoughnessT,0.00001);coat_roughness=sqrt(coatRoughnessT/sqrt(2.0/(1.0+(1.0-coat_roughness_anisotropy)*(1.0-coat_roughness_anisotropy)))); #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$9]) { ShaderStore.IncludesShadersStore[name$9] = shader$9; } /** @internal */ const openpbrCoatLayerData = { name: name$9, shader: shader$9 }; // Do not edit. const name$8 = "openpbrThinFilmLayerData"; const shader$8 = `#ifdef THIN_FILM float thin_film_weight=vThinFilmWeight;float thin_film_thickness=vThinFilmThickness.r*1000.0; float thin_film_ior=vThinFilmIor; #ifdef THIN_FILM_WEIGHT float thinFilmWeightFromTexture=TEXRD(thinFilmWeightSampler,vThinFilmWeightUV+uvOffset).r*vThinFilmWeightInfos.y; #endif #ifdef THIN_FILM_THICKNESS float thinFilmThicknessFromTexture=TEXRD(thinFilmThicknessSampler,vThinFilmThicknessUV+uvOffset).g*vThinFilmThicknessInfos.y; #endif #ifdef THIN_FILM_WEIGHT thin_film_weight*=thinFilmWeightFromTexture; #endif #ifdef THIN_FILM_THICKNESS thin_film_thickness*=thinFilmThicknessFromTexture; #endif float thin_film_ior_scale=clamp(2.0f*abs(thin_film_ior-1.0f),0.0f,1.0f); #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$8]) { ShaderStore.IncludesShadersStore[name$8] = shader$8; } /** @internal */ const openpbrThinFilmLayerData = { name: name$8, shader: shader$8 }; // Do not edit. const name$7 = "openpbrFuzzLayerData"; const shader$7 = `float fuzz_weight=0.0;vec3 fuzz_color=vec3(1.0);float fuzz_roughness=0.0; #ifdef FUZZ #ifdef FUZZ_WEIGHT vec4 fuzzWeightFromTexture=TEXRD(fuzzWeightSampler,vFuzzWeightUV+uvOffset); #endif #ifdef FUZZ_COLOR vec4 fuzzColorFromTexture=TEXRD(fuzzColorSampler,vFuzzColorUV+uvOffset); #endif #ifdef FUZZ_ROUGHNESS vec4 fuzzRoughnessFromTexture=TEXRD(fuzzRoughnessSampler,vFuzzRoughnessUV+uvOffset); #endif fuzz_color=vFuzzColor.rgb;fuzz_weight=vFuzzWeight;fuzz_roughness=vFuzzRoughness; #ifdef FUZZ_WEIGHT fuzz_weight*=fuzzWeightFromTexture.r; #endif #ifdef FUZZ_COLOR #ifdef FUZZ_COLOR_GAMMA fuzz_color*=toLinearSpace(fuzzColorFromTexture.rgb); #else fuzz_color*=fuzzColorFromTexture.rgb; #endif fuzz_color*=vFuzzColorInfos.y; #endif #if defined(FUZZ_ROUGHNESS) && defined(FUZZ_ROUGHNESS_FROM_TEXTURE_ALPHA) fuzz_roughness*=fuzzRoughnessFromTexture.a; #elif defined(FUZZ_ROUGHNESS) fuzz_roughness*=fuzzRoughnessFromTexture.r; #endif #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$7]) { ShaderStore.IncludesShadersStore[name$7] = shader$7; } /** @internal */ const openpbrFuzzLayerData = { name: name$7, shader: shader$7 }; // Do not edit. const name$6 = "openpbrAmbientOcclusionData"; const shader$6 = `vec3 ambient_occlusion=vec3(1.0);float specular_ambient_occlusion=1.0;float coat_specular_ambient_occlusion=1.0; #ifdef AMBIENT_OCCLUSION vec3 ambientOcclusionFromTexture=TEXRD(ambientOcclusionSampler,vAmbientOcclusionUV+uvOffset).rgb;ambient_occlusion=vec3(ambientOcclusionFromTexture.r*vAmbientOcclusionInfos.y+(1.0-vAmbientOcclusionInfos.y)); #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$6]) { ShaderStore.IncludesShadersStore[name$6] = shader$6; } /** @internal */ const openpbrAmbientOcclusionData = { name: name$6, shader: shader$6 }; // Do not edit. const name$5 = "openpbrBackgroundTransmission"; const shader$5 = `vec4 slab_translucent_background=vec4(0.,0.,0.,1.); #ifdef REFRACTED_BACKGROUND {float refractionLOD=min(transmission_roughness,0.8)*vBackgroundRefractionInfos.x;float lodTexelSize=pow(2.0,refractionLOD-vBackgroundRefractionInfos.x); #ifdef DISPERSION { #ifdef REFRACTION_HIGH_QUALITY_BLUR {vec3 dispResult=vec3(0.0);vec3 dispWeight=vec3(0.0);vec2 noiseOffset=noise.xy*(refractionLOD>0.0 ? lodTexelSize : 0.0);for (int k=0; k<6; k++) {float t=(float(k)+noise.y)/6.0;float t_rg=clamp(t*2.0,0.0,1.0);float t_gb=clamp((t-0.5)*2.0,0.0,1.0);vec3 refVec=mix(mix(refractedViewVectors[0],refractedViewVectors[1],t_rg),refractedViewVectors[2],t_gb);vec3 uvw=vec3(backgroundRefractionMatrix*(view*vec4(vPositionW+refVec*geometry_thickness,1.0)));vec2 coords=uvw.xy/uvw.z;coords.y=1.0-coords.y;vec4 s=texture2DLodEXT(backgroundRefractionSampler,coords+noiseOffset,refractionLOD);float rw=max(0.0,1.0-2.0*t);float gw=max(0.0,1.0-abs(2.0*t-1.0));float bw=max(0.0,2.0*t-1.0);vec3 w=vec3(rw,gw,bw);dispResult+=s.rgb*w;dispWeight+=w;} slab_translucent_background=vec4(dispResult/max(dispWeight,vec3(1e-6)),1.0);} #else for (int i=0; i<3; i++) {vec3 refractedViewVector=refractedViewVectors[i];vec3 uvw=vec3(backgroundRefractionMatrix*(view*vec4(vPositionW+refractedViewVector*geometry_thickness,1.0)));vec2 coords=uvw.xy/uvw.z;coords.y=1.0-coords.y;if (refractionLOD>0.0) {vec2 noiseOffset=noise.xy*lodTexelSize;slab_translucent_background[i]=texture2DLodEXT(backgroundRefractionSampler,coords+noiseOffset,refractionLOD)[i];} else {slab_translucent_background[i]=texture2DLodEXT(backgroundRefractionSampler,coords,0.0)[i];}} #endif } #else {vec3 refractionUVW=vec3(backgroundRefractionMatrix*(view*vec4(vPositionW+refractedViewVector*geometry_thickness,1.0)));vec2 refractionCoords=refractionUVW.xy/refractionUVW.z;refractionCoords.y=1.0-refractionCoords.y;if (refractionLOD>0.0) { #ifdef REFRACTION_HIGH_QUALITY_BLUR float cosA=cos(noise.x*PI);float sinA=sin(noise.x*PI);vec2 u=vec2( cosA,sinA)*(0.5*lodTexelSize);vec2 v=vec2(-sinA,cosA)*(0.5*lodTexelSize);slab_translucent_background=0.25*( texture2DLodEXT(backgroundRefractionSampler,refractionCoords+u+v,refractionLOD) + texture2DLodEXT(backgroundRefractionSampler,refractionCoords-u+v,refractionLOD) + texture2DLodEXT(backgroundRefractionSampler,refractionCoords+u-v,refractionLOD) + texture2DLodEXT(backgroundRefractionSampler,refractionCoords-u-v,refractionLOD) ); #else vec2 noiseOffset=noise.xy*lodTexelSize;slab_translucent_background=texture2DLodEXT(backgroundRefractionSampler,refractionCoords+noiseOffset,refractionLOD); #endif } else {slab_translucent_background=texture2DLodEXT(backgroundRefractionSampler,refractionCoords,0.0);}} #endif } #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name$5]) { ShaderStore.IncludesShadersStore[name$5] = shader$5; } /** @internal */ const openpbrBackgroundTransmission = { name: name$5, shader: shader$5 }; // Do not edit. const name$4 = "openpbrEnvironmentLighting"; const shader$4 = `#if defined(REFLECTION) || defined(REFRACTED_BACKGROUND) vec3 coatAbsorption=vec3(1.0);float coatIblFresnel=0.0;if (coat_weight>0.0) {coatIblFresnel=computeDielectricIblFresnel(coatReflectance,coatGeoInfo.environmentBrdf);float hemisphere_avg_fresnel=coatReflectance.F0+0.5*(1.0-coatReflectance.F0);float averageReflectance=(coatIblFresnel+hemisphere_avg_fresnel)*0.5;float roughnessFactor=1.0-coat_roughness*0.5;averageReflectance*=roughnessFactor;float darkened_transmission=(1.0-averageReflectance)*(1.0-averageReflectance);darkened_transmission=mix(1.0,darkened_transmission,coat_darkening);float sin2=1.0-coatGeoInfo.NdotV*coatGeoInfo.NdotV;sin2=sin2/(coat_ior*coat_ior)*coat_weight;float cos_t=sqrt(1.0-sin2);float coatPathLength=1.0/cos_t;float effectivePathLength=coatPathLength*coat_weight;vec3 colored_transmission=pow(coat_color,vec3(effectivePathLength));coatAbsorption=colored_transmission*mix(1.0,darkened_transmission,coat_weight);} #endif #ifdef REFLECTION #if defined(FUZZ) && defined(FUZZENVIRONMENTBRDF) vec3 environmentFuzzBrdf=getFuzzBRDFLookup(fuzzGeoInfo.NdotV,sqrt(fuzz_roughness)); #endif vec3 baseDiffuseEnvironmentLight=sampleIrradiance( normalW #if defined(NORMAL) && defined(USESPHERICALINVERTEX) ,vEnvironmentIrradiance #endif #if (defined(USESPHERICALFROMREFLECTIONMAP) && (!defined(NORMAL) || !defined(USESPHERICALINVERTEX))) || (defined(USEIRRADIANCEMAP) && defined(REFLECTIONMAP_3D)) ,reflectionMatrix #endif #ifdef USEIRRADIANCEMAP ,irradianceSampler #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION ,vReflectionDominantDirection #endif #endif #ifdef REALTIME_FILTERING ,vReflectionFilteringInfo #ifdef IBL_CDF_FILTERING ,icdfSampler #endif #endif ,vReflectionInfos ,viewDirectionW ,base_diffuse_roughness ,base_color ); #ifdef REFLECTIONMAP_3D vec3 reflectionCoords=vec3(0.,0.,0.); #else vec2 reflectionCoords=vec2(0.,0.); #endif float specularAlphaG=specular_roughness*specular_roughness; #ifdef ANISOTROPIC_BASE vec3 baseSpecularEnvironmentLight=sampleRadianceAnisotropic(specularAlphaG,vReflectionMicrosurfaceInfos.rgb,vReflectionInfos ,baseGeoInfo ,normalW ,viewDirectionW ,vPositionW ,noise ,false ,1.0 ,reflectionSampler #ifdef REALTIME_FILTERING ,vReflectionFilteringInfo #endif ); #else reflectionCoords=createReflectionCoords(vPositionW,normalW);vec3 baseSpecularEnvironmentLight=sampleRadiance(specularAlphaG,vReflectionMicrosurfaceInfos.rgb,vReflectionInfos ,baseGeoInfo ,reflectionSampler ,reflectionCoords #ifdef REALTIME_FILTERING ,vReflectionFilteringInfo #endif ); #endif #ifdef ANISOTROPIC_BASE baseSpecularEnvironmentLight=mix(baseSpecularEnvironmentLight.rgb,baseDiffuseEnvironmentLight,specularAlphaG*specularAlphaG*max(1.0-baseGeoInfo.anisotropy,0.3)); #else baseSpecularEnvironmentLight=mix(baseSpecularEnvironmentLight.rgb,baseDiffuseEnvironmentLight,specularAlphaG); #endif vec3 coatEnvironmentLight=vec3(0.,0.,0.);if (coat_weight>0.0) { #ifdef REFLECTIONMAP_3D vec3 reflectionCoords=vec3(0.,0.,0.); #else vec2 reflectionCoords=vec2(0.,0.); #endif reflectionCoords=createReflectionCoords(vPositionW,coatNormalW);float coatAlphaG=coat_roughness*coat_roughness; #ifdef ANISOTROPIC_COAT coatEnvironmentLight=sampleRadianceAnisotropic(coatAlphaG,vReflectionMicrosurfaceInfos.rgb,vReflectionInfos ,coatGeoInfo ,coatNormalW ,viewDirectionW ,vPositionW ,noise ,false ,1.0 ,reflectionSampler #ifdef REALTIME_FILTERING ,vReflectionFilteringInfo #endif ); #else coatEnvironmentLight=sampleRadiance(coatAlphaG,vReflectionMicrosurfaceInfos.rgb,vReflectionInfos ,coatGeoInfo ,reflectionSampler ,reflectionCoords #ifdef REALTIME_FILTERING ,vReflectionFilteringInfo #endif ); #endif } #if defined(FUZZ) && defined(FUZZENVIRONMENTBRDF) float modifiedFuzzRoughness=clamp(fuzz_roughness*fuzz_roughness*(1.0+0.5*environmentFuzzBrdf.y),0.0,1.0);vec3 fuzzEnvironmentLight=vec3(0.0);float fuzzIblFresnel=min(environmentFuzzBrdf.z*2.0,1.0);vec2 viewTangent=vec2(dot(viewDirectionW,fuzzTangent),dot(viewDirectionW,fuzzBitangent));float centerAngle=atan(viewTangent.y,viewTangent.x);for (int i=0; i<FUZZ_IBL_SAMPLES; ++i) {float angle=centerAngle+(float(i)/float(FUZZ_IBL_SAMPLES)-0.5+noise.x/float(FUZZ_IBL_SAMPLES))*3.141592;vec3 fiberCylinderNormal=normalize(cos(angle)*fuzzTangent+sin(angle)*fuzzBitangent);vec3 fuzzReflectionCoords=vec3(reflectionMatrix*vec4(fiberCylinderNormal,0));vec3 radianceSample=sampleRadiance(modifiedFuzzRoughness,vReflectionMicrosurfaceInfos.rgb,vReflectionInfos ,fuzzGeoInfo ,reflectionSampler ,fuzzReflectionCoords #ifdef REALTIME_FILTERING ,vReflectionFilteringInfo #endif );fuzzEnvironmentLight+=radianceSample;} fuzzEnvironmentLight/=float(FUZZ_IBL_SAMPLES); #if defined(GEOMETRY_NORMAL) || defined(GEOMETRY_COAT_NORMAL) vec3 fuzzDiffuseEnvironmentLight=sampleIrradiance( fuzzNormalW #if defined(NORMAL) && defined(USESPHERICALINVERTEX) ,vEnvironmentIrradiance #endif #if (defined(USESPHERICALFROMREFLECTIONMAP) && (!defined(NORMAL) || !defined(USESPHERICALINVERTEX))) || (defined(USEIRRADIANCEMAP) && defined(REFLECTIONMAP_3D)) ,reflectionMatrix #endif #ifdef USEIRRADIANCEMAP ,irradianceSampler #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION ,vReflectionDominantDirection #endif #endif #ifdef REALTIME_FILTERING ,vReflectionFilteringInfo #ifdef IBL_CDF_FILTERING ,icdfSampler #endif #endif ,vReflectionInfos ,viewDirectionW ,0.0 ,vec3(1.0) ); #else vec3 fuzzDiffuseEnvironmentLight=baseDiffuseEnvironmentLight; #endif fuzzEnvironmentLight=mix(min(fuzzEnvironmentLight,fuzzDiffuseEnvironmentLight),fuzzDiffuseEnvironmentLight,modifiedFuzzRoughness); #endif float dielectricIblFresnel=computeDielectricIblFresnel(baseDielectricReflectance,baseGeoInfo.environmentBrdf);vec3 dielectricIblColoredFresnel=dielectricIblFresnel*specular_color; #ifdef THIN_FILM float thin_film_cos_theta=max(baseGeoInfo.NdotV,specularAlphaG);float thin_film_desaturation_scale=(thin_film_ior-1.0)*sqrt(thin_film_thickness*0.001*thin_film_cos_theta);