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.

832 lines (817 loc) 96.6 kB
import { S as ShaderStore } from './index-MZPybX0H.esm.js'; import { p as prePassDeclarationWGSL, o as oitDeclarationWGSL, t as textureRepetitionFunctionsWGSL, d as depthPrePassWGSL, a as oitFragmentWGSL } from './oitFragment-cYhnThGO.esm.js'; import { s as sceneUboDeclarationWGSL } from './sceneUboDeclaration-F06dki1D.esm.js'; import { m as meshUboDeclarationWGSL } from './meshUboDeclaration-CCr-qXSL.esm.js'; import { o as openpbrUboDeclarationWGSL } from './openpbrUboDeclaration-DRohbXrw.esm.js'; import { m as mainUVVaryingDeclarationWGSL } from './mainUVVaryingDeclaration-CJ-yOzpF.esm.js'; import { p as pbrFragmentExtraDeclarationWGSL, s as subSurfaceScatteringFunctionsWGSL, a as pbrHelperFunctionsWGSL, b as pbrDirectLightingSetupFunctionsWGSL, c as pbrDirectLightingFalloffFunctionsWGSL, d as pbrBlockReflectance0WGSL, e as pbrClusteredLightingFunctionsWGSL, f as pbrDirectLightingFunctionsWGSL, g as pbrBlockNormalGeometricWGSL, h as pbrBlockImageProcessingWGSL, i as pbrDebugWGSL } from './pbrDebug-CwSyy4oc.esm.js'; import { l as lightUboDeclarationWGSL, s as shadowsFragmentFunctionsWGSL, a as ltcHelperFunctionsWGSL, c as clusteredLightingFunctionsWGSL } from './shadowsFragmentFunctions-B3hA3Hts.esm.js'; import { s as samplerFragmentDeclarationWGSL } from './samplerFragmentDeclaration-3tdaMBSe.esm.js'; import { p as pbrFragmentReflectionDeclarationWGSL, a as pbrIBLFunctionsWGSL } from './pbrIBLFunctions-D4-ZLWWt.esm.js'; import { i as imageProcessingDeclarationWGSL, a as imageProcessingFunctionsWGSL } from './imageProcessingFunctions-DmDAqk27.esm.js'; import { c as clipPlaneFragmentDeclarationWGSL, a as clipPlaneFragmentWGSL } from './clipPlaneFragment-C6Z5D7El.esm.js'; import { l as logDepthDeclarationWGSL } from './logDepthDeclaration-BPJH8Xtb.esm.js'; import { f as fogFragmentDeclarationWGSL, a as fogFragmentWGSL } from './fogFragment-Lnu5KyrF.esm.js'; import { h as helperFunctionsWGSL } from './helperFunctions-CiGzvr6_.esm.js'; import { i as importanceSamplingWGSL, h as hdrFilteringFunctionsWGSL } from './hdrFilteringFunctions-CwvCr5Ba.esm.js'; import { h as harmonicsFunctionsWGSL } from './harmonicsFunctions-1JywfDMC.esm.js'; import { p as pbrBRDFFunctionsWGSL } from './pbrBRDFFunctions-DpNLaDYY.esm.js'; import { r as reflectionFunctionWGSL } from './reflectionFunction-M92qPCCu.esm.js'; import { o as openpbrDielectricReflectanceWGSL, a as openpbrGeometryInfoWGSL, b as openpbrIblFunctionsWGSL, d as openpbrTransmissionLayerDataWGSL, c as openpbrSubsurfaceLayerDataWGSL } from './openpbrTransmissionLayerData-DX83qx5e.esm.js'; import { l as logDepthFragmentWGSL } from './logDepthFragment-DD4DS4oL.esm.js'; // 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 var environmentBrdfSamplerSampler: sampler;var environmentBrdfSampler: texture_2d<f32>; #endif #ifdef FUZZENVIRONMENTBRDF var environmentFuzzBrdfSamplerSampler: sampler;var environmentFuzzBrdfSampler: texture_2d<f32>; #endif #ifdef REFRACTED_BACKGROUND var backgroundRefractionSamplerSampler: sampler;var backgroundRefractionSampler: texture_2d<f32>; #endif #ifdef USE_IRRADIANCE_TEXTURE_FOR_SCATTERING var sceneIrradianceSampler: texture_2d<f32>;var sceneDepthSampler: texture_2d<f32>; #endif #if defined(ANISOTROPIC) || defined(FUZZ) || defined(REFRACTED_BACKGROUND) || defined(USE_IRRADIANCE_TEXTURE_FOR_SCATTERING) var blueNoiseSamplerSampler: sampler;var blueNoiseSampler: texture_2d<f32>; #endif #ifdef IBL_CDF_FILTERING var icdfSamplerSampler: sampler;var icdfSampler: texture_2d<f32>; #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStoreWGSL[name$i]) { ShaderStore.IncludesShadersStoreWGSL[name$i] = shader$i; } /** @internal */ const openpbrFragmentSamplersDeclarationWGSL = { 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 vTBN0: vec3f;varying vTBN1: vec3f;varying vTBN2: vec3f; #endif #ifdef OBJECTSPACE_NORMALMAP uniform normalMatrix: mat4x4f;fn toNormalMatrix(m: mat4x4f)->mat4x4f {var a00=m[0][0];var a01=m[0][1];var a02=m[0][2];var a03=m[0][3];var a10=m[1][0];var a11=m[1][1];var a12=m[1][2];var a13=m[1][3];var a20=m[2][0]; var a21=m[2][1];var a22=m[2][2];var a23=m[2][3];var a30=m[3][0]; var a31=m[3][1];var a32=m[3][2];var a33=m[3][3];var b00=a00*a11-a01*a10;var b01=a00*a12-a02*a10;var b02=a00*a13-a03*a10;var b03=a01*a12-a02*a11;var b04=a01*a13-a03*a11;var b05=a02*a13-a03*a12;var b06=a20*a31-a21*a30;var b07=a20*a32-a22*a30;var b08=a20*a33-a23*a30;var b09=a21*a32-a22*a31;var b10=a21*a33-a23*a31;var b11=a22*a33-a23*a32;var det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;var mi=mat4x4<f32>( (a11*b11-a12*b10+a13*b09)/det, (a02*b10-a01*b11-a03*b09)/det, (a31*b05-a32*b04+a33*b03)/det, (a22*b04-a21*b05-a23*b03)/det, (a12*b08-a10*b11-a13*b07)/det, (a00*b11-a02*b08+a03*b07)/det, (a32*b02-a30*b05-a33*b01)/det, (a20*b05-a22*b02+a23*b01)/det, (a10*b10-a11*b08+a13*b06)/det, (a01*b08-a00*b10-a03*b06)/det, (a30*b04-a31*b02+a33*b00)/det, (a21*b02-a20*b04-a23*b00)/det, (a11*b07-a10*b09-a12*b06)/det, (a00*b09-a01*b07+a02*b06)/det, (a31*b01-a30*b03-a32*b00)/det, (a20*b03-a21*b01+a22*b00)/det);return mat4x4<f32>(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 fn perturbNormalBase(cotangentFrame: mat3x3f,normal: vec3f,scale: f32)->vec3f {var output=normal; #ifdef NORMALXYSCALE output=normalize(output* vec3f(scale,scale,1.0)); #endif return normalize(cotangentFrame*output);} fn perturbNormal(cotangentFrame: mat3x3f,textureSample: vec3f,scale: f32)->vec3f {return perturbNormalBase(cotangentFrame,textureSample*2.0-1.0,scale);} fn cotangent_frame(normal: vec3f,p: vec3f,uv: vec2f,tangentSpaceParams: vec2f)->mat3x3f {var dp1: vec3f=dpdx(p);var dp2: vec3f=dpdy(p);var duv1: vec2f=dpdx(uv);var duv2: vec2f=dpdy(uv);var dp2perp: vec3f=cross(dp2,normal);var dp1perp: vec3f=cross(normal,dp1);var tangent: vec3f=dp2perp*duv1.x+dp1perp*duv2.x;var bitangent: vec3f=dp2perp*duv1.y+dp1perp*duv2.y;tangent*=tangentSpaceParams.x;bitangent*=tangentSpaceParams.y;var det: f32=max(dot(tangent,tangent),dot(bitangent,bitangent));var invmax: f32=select(inverseSqrt(det),0.0,det==0.0);return mat3x3f(tangent*invmax,bitangent*invmax,normal);} #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStoreWGSL[name$h]) { ShaderStore.IncludesShadersStoreWGSL[name$h] = shader$h; } /** @internal */ const openpbrNormalMapFragmentMainFunctionsWGSL = { 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 minSamples: f32=4.;const maxSamples: f32=15.;const iMaxSamples: i32=15;fn parallaxOcclusion(vViewDirCoT: vec3f,vNormalCoT: vec3f,texCoord: vec2f,parallaxScale: f32)->vec2f {var parallaxLimit: f32=length(vViewDirCoT.xy)/vViewDirCoT.z;parallaxLimit*=parallaxScale;var vOffsetDir: vec2f=normalize(vViewDirCoT.xy);var vMaxOffset: vec2f=vOffsetDir*parallaxLimit;var numSamples: f32=maxSamples+(dot(vViewDirCoT,vNormalCoT)*(minSamples-maxSamples));var stepSize: f32=1.0/numSamples;var currRayHeight: f32=1.0;var vCurrOffset: vec2f= vec2f(0,0);var vLastOffset: vec2f= vec2f(0,0);var lastSampledHeight: f32=1.0;var currSampledHeight: f32=1.0;var keepWorking: bool=true;for (var i: i32=0; i<iMaxSamples; i++) {currSampledHeight=textureSample(geometryNormalSampler,geometryNormalSamplerSampler,texCoord+vCurrOffset).w;if (!keepWorking) {} else if (currSampledHeight>currRayHeight) {var delta1: f32=currSampledHeight-currRayHeight;var delta2: f32=(currRayHeight+stepSize)-lastSampledHeight;var ratio: f32=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;} fn parallaxOffset(viewDir: vec3f,heightScale: f32)->vec2f {var height: f32=textureSample(geometryNormalSampler,geometryNormalSamplerSampler,fragmentInputs.vGeometryNormalUV).w;var texCoordOffset: vec2f=heightScale*viewDir.xy*height; #ifdef PARALLAX_RHS return texCoordOffset; #else return -texCoordOffset; #endif } #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStoreWGSL[name$g]) { ShaderStore.IncludesShadersStoreWGSL[name$g] = shader$g; } /** @internal */ const openpbrNormalMapFragmentFunctionsWGSL = { name: name$g, shader: shader$g }; // Do not edit. const name$f = "openpbrConductorReflectance"; const shader$f = `#define pbr_inline fn conductorReflectance(baseColor: vec3f,specularColor: vec3f,specularWeight: f32)->ReflectanceParams {var outParams: ReflectanceParams; #if (CONDUCTOR_SPECULAR_MODEL==CONDUCTOR_SPECULAR_MODEL_OPENPBR) outParams.coloredF0=baseColor*specularWeight;outParams.coloredF90=specularColor*specularWeight; #else outParams.coloredF0=baseColor;outParams.coloredF90=vec3f(1.0f); #endif outParams.F0=1.0f;outParams.F90=1.0f;return outParams;}`; // Sideeffect if (!ShaderStore.IncludesShadersStoreWGSL[name$f]) { ShaderStore.IncludesShadersStoreWGSL[name$f] = shader$f; } /** @internal */ const openpbrConductorReflectanceWGSL = { name: name$f, shader: shader$f }; // Do not edit. const name$e = "openpbrAmbientOcclusionFunctions"; const shader$e = `fn compute_specular_occlusion(n_dot_v: f32,metallic: f32,ambient_occlusion: f32,roughness: f32)->f32 {let specular_occlusion: f32=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.IncludesShadersStoreWGSL[name$e]) { ShaderStore.IncludesShadersStoreWGSL[name$e] = shader$e; } /** @internal */ const openpbrAmbientOcclusionFunctionsWGSL = { name: name$e, shader: shader$e }; // Do not edit. const name$d = "openpbrVolumeFunctions"; const shader$d = `struct OpenPBRHomogeneousVolume {extinction_coeff: vec3f, ss_albedo: vec3f, multi_scatter_color: vec3f, absorption_coeff: vec3f, scatter_coeff: vec3f, anisotropy: f32, };fn computeOpenPBRTransmissionVolume( transmission_color: vec3f, transmission_depth: f32, transmission_scatter: vec3f, anisotropy: f32 )->OpenPBRHomogeneousVolume {var volumeParams: OpenPBRHomogeneousVolume;volumeParams.absorption_coeff=vec3f(0.0f);volumeParams.scatter_coeff=vec3f(0.0f);volumeParams.anisotropy=anisotropy; #ifdef GEOMETRY_THIN_WALLED volumeParams.scatter_coeff=vec3f(1.0f);volumeParams.anisotropy=1.0f; volumeParams.extinction_coeff=volumeParams.absorption_coeff+volumeParams.scatter_coeff;volumeParams.ss_albedo=vec3f(1.0f); #else if (transmission_depth>0.0f) {let invDepth: vec3f=vec3f(1.f/maxEps(transmission_depth));volumeParams.extinction_coeff=-log(maxEpsVec3(transmission_color.rgb))*invDepth;volumeParams.scatter_coeff=transmission_scatter.rgb*invDepth;volumeParams.absorption_coeff=volumeParams.extinction_coeff-volumeParams.scatter_coeff.rgb;let minCoeff: f32=min3(volumeParams.absorption_coeff);if (minCoeff<0.0f) {volumeParams.absorption_coeff-=vec3f(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=vec3f(0.0f);} #endif return volumeParams;} fn computeOpenPBRSubsurfaceVolume( subsurface_color: vec3f, subsurface_radius: f32, subsurface_radius_scale: vec3f, anisotropy: f32 )->OpenPBRHomogeneousVolume {var volumeParams: OpenPBRHomogeneousVolume;volumeParams.absorption_coeff=vec3f(0.0f);volumeParams.scatter_coeff=vec3f(0.0f);volumeParams.anisotropy=anisotropy;volumeParams.multi_scatter_color=subsurface_color;let mfp: vec3f=subsurface_radius_scale*vec3f(subsurface_radius);volumeParams.extinction_coeff=vec3f(1.0f)/maxEpsVec3(mfp);volumeParams.ss_albedo=multiScatterToSingleScatterAlbedoWithAniso(subsurface_color,anisotropy);volumeParams.scatter_coeff=volumeParams.ss_albedo*volumeParams.extinction_coeff;volumeParams.absorption_coeff=volumeParams.extinction_coeff-volumeParams.scatter_coeff.rgb;let minCoeff: f32=min3(volumeParams.absorption_coeff);if (minCoeff<0.0f) {volumeParams.absorption_coeff-=vec3f(minCoeff);} volumeParams.extinction_coeff=volumeParams.absorption_coeff+volumeParams.scatter_coeff;return volumeParams;} fn sss_pdf(r: f32,d: vec3f)->vec3f {let d_clamped=max(vec3f(1e-4f),d);return (exp(-r/d_clamped)+exp(-r/(3.0f*d_clamped)))/max(vec3f(1e-5f),8.0f*PI*d_clamped*r);} fn sss_samples_pdf(r: f32,d: f32)->f32 {let d_clamped=max(1e-4f,d);return exp(-r/(3.0f*d_clamped))/(6.0f*PI*d_clamped*r);} fn sss_samples_icdf(x: f32,d: f32)->f32 {let d_clamped=max(1e-4f,d);let x_clamped=max(1e-4f,x);return -3.0f*log(x_clamped)*d_clamped;} fn samples_scale(x: f32,d: f32)->f32 {return 1.0f-exp(-x/(3.0f*d));} fn sss_get_position(depth_texture: texture_2d<f32>,tex_coord: vec2f,render_resolution: vec2f,inv_proj: mat4x4f)->vec3f {var P: vec4f=vec4f(tex_coord,textureLoad(depth_texture,vec2i(tex_coord*render_resolution),0).x,1.0f);P.x=2.0f*P.x-1.0f;P.y=2.0f*P.y-1.0f;P=inv_proj*P;return P.xyz/P.w;} fn sss_filter_scale(currZ: f32,proj: mat4x4f)->f32 {return 1.0f/dot(vec2f(proj[2].w,proj[3].w),vec2f(currZ,1.0f));} fn projective_to_pixels(proj_dist: f32,proj: mat4x4f,resolution: vec2f)->f32 {return proj_dist*proj[1][1]*resolution.y;} fn pixels_to_projective(pixel_dist: f32,proj: mat4x4f,resolution: vec2f)->f32 {return pixel_dist/(proj[1][1]*resolution.y);} fn sss_convolve(sss_irradiance_texture: texture_2d<f32>,depth_texture: texture_2d<f32>,render_resolution: vec2f,d: vec3f,proj: mat4x4f,inv_proj: mat4x4f,sample_count: i32,noise: vec2f)->vec3f {let tex_coord: vec2f=fragmentInputs.position.xy/render_resolution;let unconvolved_irradiance: vec3f=textureLoad(sss_irradiance_texture,vec2i(fragmentInputs.position.xy),0).rgb;let curr_pos: vec3f=sss_get_position(depth_texture,tex_coord,render_resolution,inv_proj);var dmax: f32=max3(d);let max_dmax: f32=0.1*f32(sample_count);var d_adjusted=d;if (dmax>max_dmax) {d_adjusted*=max_dmax/dmax;dmax=max_dmax;} var dz: f32=dmax*sss_filter_scale(curr_pos.z,proj);let projMat2d: mat2x2f=mat2x2f(proj[0].xy,proj[1].xy);if (determinant(projMat2d)*dz<1e-4f) {return unconvolved_irradiance;} let overscan_size_in_pixels: f32=max(render_resolution.x,render_resolution.y)*0.1;let filter_crop_ratio: f32=0.8f; let crop_radius: f32=projective_to_pixels(sss_samples_icdf(1.0f-filter_crop_ratio,dz),proj,render_resolution);if (crop_radius>overscan_size_in_pixels) {d_adjusted*=overscan_size_in_pixels/crop_radius;dz*=overscan_size_in_pixels/crop_radius;} let filter_samples_scale: f32=samples_scale(pixels_to_projective(overscan_size_in_pixels,proj,render_resolution),dz);var irradiance_sum: vec3f=vec3f(0.0f);var weight_sum: vec3f=vec3f(0.0f);for (var i: i32=0; i<sample_count; i++) {var r: vec2f=fract(plasticSequence(u32(i))+noise);r.x*=TWO_PI;r.y*=filter_samples_scale;let icdf: f32=sss_samples_icdf(1.0-r.y,dz);let sample_uv: vec2f=tex_coord+icdf*projMat2d*vec2f(cos(r.x),sin(r.x));let sss_irradiance: vec4f=textureLoad(sss_irradiance_texture,vec2i(sample_uv*render_resolution),0);let dist: f32=distance(curr_pos,sss_get_position(depth_texture,sample_uv,render_resolution,inv_proj));if (dist>0.0f) {let weights: vec3f=sss_irradiance.a/sss_samples_pdf(icdf,dz)*sss_pdf(dist,d_adjusted);irradiance_sum+=weights*sss_irradiance.rgb;weight_sum+=weights;}} return vec3f(select(unconvolved_irradiance.r,irradiance_sum.r/weight_sum.r,weight_sum.r>=1e-5f), select(unconvolved_irradiance.g,irradiance_sum.g/weight_sum.g,weight_sum.g>=1e-5f), select(unconvolved_irradiance.b,irradiance_sum.b/weight_sum.b,weight_sum.b>=1e-5f));} `; // Sideeffect if (!ShaderStore.IncludesShadersStoreWGSL[name$d]) { ShaderStore.IncludesShadersStoreWGSL[name$d] = shader$d; } /** @internal */ const openpbrVolumeFunctionsWGSL = { name: name$d, shader: shader$d }; // Do not edit. const name$c = "openpbrNormalMapFragment"; const shader$c = `var uvOffset: vec2f= vec2f(0.0,0.0); #if defined(GEOMETRY_NORMAL) || defined(GEOMETRY_COAT_NORMAL) || defined(PARALLAX) || defined(DETAIL) #ifdef NORMALXYSCALE var normalScale: f32=1.0; #elif defined(GEOMETRY_NORMAL) var normalScale: f32=uniforms.vGeometryNormalInfos.y; #else var normalScale: f32=1.0; #endif #if defined(TANGENT) && defined(NORMAL) var TBN: mat3x3f=mat3x3<f32>(input.vTBN0,input.vTBN1,input.vTBN2); #elif defined(GEOMETRY_NORMAL) var TBNUV: vec2f=select(-fragmentInputs.vGeometryNormalUV,fragmentInputs.vGeometryNormalUV,fragmentInputs.frontFacing);var TBN: mat3x3f=cotangent_frame(normalW*normalScale,input.vPositionW,TBNUV,uniforms.vTangentSpaceParams); #elif defined(GEOMETRY_COAT_NORMAL) var TBNUV: vec2f=select(-fragmentInputs.vGeometryCoatNormalUV,fragmentInputs.vGeometryCoatNormalUV,fragmentInputs.frontFacing);var TBN: mat3x3f=cotangent_frame(normalW*normalScale,input.vPositionW,TBNUV,uniforms.vTangentSpaceParams); #else var TBNUV: vec2f=select(-fragmentInputs.vDetailUV,fragmentInputs.vDetailUV,fragmentInputs.frontFacing);var TBN: mat3x3f=cotangent_frame(normalW*normalScale,input.vPositionW,TBNUV, vec2f(1.,1.)); #endif #elif defined(ANISOTROPIC) || defined(FUZZ) #if defined(TANGENT) && defined(NORMAL) var TBN: mat3x3f=mat3x3<f32>(input.vTBN0,input.vTBN1,input.vTBN2); #else var TBNUV: vec2f=select( -fragmentInputs.vMainUV1,fragmentInputs.vMainUV1,fragmentInputs.frontFacing);var TBN: mat3x3f=cotangent_frame(normalW,input.vPositionW,TBNUV, vec2f(1.,1.)); #endif #endif #ifdef PARALLAX var invTBN: mat3x3f=transposeMat3(TBN); #ifdef PARALLAXOCCLUSION #else #endif #endif #ifdef DETAIL var detailColor: vec4f=textureSample(detailSampler,detailSamplerSampler,fragmentInputs.vDetailUV+uvOffset);var detailNormalRG: vec2f=detailColor.wy*2.0-1.0;var detailNormalB: f32=sqrt(1.-saturate(dot(detailNormalRG,detailNormalRG)));var detailNormal: vec3f= vec3f(detailNormalRG,detailNormalB); #endif #ifdef GEOMETRY_COAT_NORMAL coatNormalW=perturbNormal(TBN,TEXRD(geometryCoatNormalSampler,geometryCoatNormalSamplerSampler,fragmentInputs.vGeometryCoatNormalUV+uvOffset).xyz,uniforms.vGeometryCoatNormalInfos.y); #endif #ifdef GEOMETRY_NORMAL #ifdef OBJECTSPACE_NORMALMAP #define CUSTOM_FRAGMENT_BUMP_FRAGMENT normalW=normalize(TEXRD(geometryNormalSampler,geometryNormalSamplerSampler,fragmentInputs.vGeometryNormalUV).xyz *2.0-1.0);normalW=normalize(mat3x3f(uniforms.normalMatrix[0].xyz,uniforms.normalMatrix[1].xyz,uniforms.normalMatrix[2].xyz)*normalW); #elif !defined(DETAIL) normalW=perturbNormal(TBN,TEXRD(geometryNormalSampler,geometryNormalSamplerSampler,fragmentInputs.vGeometryNormalUV+uvOffset).xyz,uniforms.vGeometryNormalInfos.y); #else var sampledNormal: vec3f=TEXRD(geometryNormalSampler,geometryNormalSamplerSampler,fragmentInputs.vGeometryNormalUV+uvOffset).xyz*2.0-1.0; #if DETAIL_NORMALBLENDMETHOD==0 detailNormal=vec3f(detailNormal.xy*uniforms.vDetailInfos.z,detailNormal.z);var blendedNormal: vec3f=normalize( vec3f(sampledNormal.xy+detailNormal.xy,sampledNormal.z*detailNormal.z)); #elif DETAIL_NORMALBLENDMETHOD==1 detailNormal=vec3f(detailNormal.xy*uniforms.vDetailInfos.z,detailNormal.z);sampledNormal+= vec3f(0.0,0.0,1.0);detailNormal*= vec3f(-1.0,-1.0,1.0);var blendedNormal: vec3f=sampledNormal*dot(sampledNormal,detailNormal)/sampledNormal.z-detailNormal; #endif normalW=perturbNormalBase(TBN,blendedNormal,uniforms.vGeometryNormalInfos.y); #endif #elif defined(DETAIL) detailNormal=vec3f(detailNormal.xy*uniforms.vDetailInfos.z,detailNormal.z);normalW=perturbNormalBase(TBN,detailNormal,uniforms.vDetailInfos.z); #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStoreWGSL[name$c]) { ShaderStore.IncludesShadersStoreWGSL[name$c] = shader$c; } /** @internal */ const openpbrNormalMapFragmentWGSL = { name: name$c, shader: shader$c }; // Do not edit. const name$b = "openpbrBlockNormalFinal"; const shader$b = `#if defined(FORCENORMALFORWARD) && defined(NORMAL) var faceNormal: vec3f=normalize(cross(dpdx(fragmentInputs.vPositionW),dpdy(fragmentInputs.vPositionW)))*scene.vEyePosition.w; #if defined(TWOSIDEDLIGHTING) faceNormal=select(-faceNormal,faceNormal,fragmentInputs.frontFacing); #endif normalW*=sign(dot(normalW,faceNormal));coatNormalW*=sign(dot(coatNormalW,faceNormal)); #endif #if defined(TWOSIDEDLIGHTING) && defined(NORMAL) #if defined(MIRRORED) normalW=select(normalW,-normalW,fragmentInputs.frontFacing);coatNormalW=select(coatNormalW,-coatNormalW,fragmentInputs.frontFacing); #else normalW=select(-normalW,normalW,fragmentInputs.frontFacing);coatNormalW=select(-coatNormalW,coatNormalW,fragmentInputs.frontFacing); #endif #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStoreWGSL[name$b]) { ShaderStore.IncludesShadersStoreWGSL[name$b] = shader$b; } /** @internal */ const openpbrBlockNormalFinalWGSL = { name: name$b, shader: shader$b }; // Do not edit. const name$a = "openpbrBaseLayerData"; const shader$a = `var base_color=vec3f(0.8);var base_metalness: f32=0.0;var base_diffuse_roughness: f32=0.0;var specular_weight: f32=1.0;var specular_roughness: f32=0.3;var specular_color: vec3f=vec3f(1.0);var specular_roughness_anisotropy: f32=0.0;var specular_ior: f32=1.5;var alpha: f32=1.0;var geometry_tangent: vec2f=vec2f(1.0,0.0);var geometry_thickness: f32=0.0; #ifdef BASE_WEIGHT let baseWeightFromTexture: vec4f=TEXRD(baseWeightSampler,baseWeightSamplerSampler,fragmentInputs.vBaseWeightUV+uvOffset); #endif #ifdef BASE_COLOR let baseColorFromTexture: vec4f=TEXRD(baseColorSampler,baseColorSamplerSampler,fragmentInputs.vBaseColorUV+uvOffset); #endif #ifdef BASE_METALNESS let metallicFromTexture: vec4f=TEXRD(baseMetalnessSampler,baseMetalnessSamplerSampler,fragmentInputs.vBaseMetalnessUV+uvOffset); #endif #ifdef BASE_DIFFUSE_ROUGHNESS let baseDiffuseRoughnessFromTexture: f32=TEXRD(baseDiffuseRoughnessSampler,baseDiffuseRoughnessSamplerSampler,fragmentInputs.vBaseDiffuseRoughnessUV+uvOffset).r; #endif #ifdef GEOMETRY_TANGENT let geometryTangentFromTexture: vec3f=TEXRD(geometryTangentSampler,geometryTangentSamplerSampler,fragmentInputs.vGeometryTangentUV+uvOffset).rgb; #endif #ifdef SPECULAR_ROUGHNESS_ANISOTROPY let anisotropyFromTexture: f32=TEXRD(specularRoughnessAnisotropySampler,specularRoughnessAnisotropySamplerSampler,fragmentInputs.vSpecularRoughnessAnisotropyUV+uvOffset).r*uniforms.vSpecularRoughnessAnisotropyInfos.y; #endif #ifdef GEOMETRY_OPACITY let opacityFromTexture: vec4f=TEXRD(geometryOpacitySampler,geometryOpacitySamplerSampler,fragmentInputs.vGeometryOpacityUV+uvOffset); #endif #ifdef GEOMETRY_THICKNESS let thicknessFromTexture: vec4f=TEXRD(geometryThicknessSampler,geometryThicknessSamplerSampler,fragmentInputs.vGeometryThicknessUV+uvOffset); #endif #ifdef DECAL let decalFromTexture: vec4f=textureSample(decalSampler,decalSamplerSampler,fragmentInputs.vDecalUV+uvOffset); #endif #ifdef SPECULAR_COLOR let specularColorFromTexture: vec4f=TEXRD(specularColorSampler,specularColorSamplerSampler,fragmentInputs.vSpecularColorUV+uvOffset); #endif #if defined(SPECULAR_WEIGHT) #ifdef SPECULAR_WEIGHT_IN_ALPHA let specularWeightFromTexture: f32=TEXRD(specularWeightSampler,specularWeightSamplerSampler,fragmentInputs.vSpecularWeightUV+uvOffset).a; #else let specularWeightFromTexture: f32=TEXRD(specularWeightSampler,specularWeightSamplerSampler,fragmentInputs.vSpecularWeightUV+uvOffset).r; #endif #endif #if defined(ANISOTROPIC) || defined(FUZZ) || defined(REFRACTED_BACKGROUND) || defined(USE_IRRADIANCE_TEXTURE_FOR_SCATTERING) let noise=vec3f(2.0)*textureSample(blueNoiseSampler,blueNoiseSamplerSampler,fragmentInputs.position.xy/256.0).xyz-vec3f(1.0); #endif #if defined(SPECULAR_ROUGHNESS_FROM_METALNESS_TEXTURE_GREEN) && defined(BASE_METALNESS) let roughnessFromTexture: f32=metallicFromTexture.g; #elif defined(SPECULAR_ROUGHNESS) let roughnessFromTexture: f32=TEXRD(specularRoughnessSampler,specularRoughnessSamplerSampler,fragmentInputs.vSpecularRoughnessUV+uvOffset).r; #endif base_color=uniforms.vBaseColor.rgb; #if defined(VERTEXCOLOR) || defined(INSTANCESCOLOR) && defined(INSTANCES) base_color*=fragmentInputs.vColor.rgb; #endif #if defined(VERTEXALPHA) || defined(INSTANCESCOLOR) && defined(INSTANCES) alpha*=fragmentInputs.vColor.a; #endif base_color*=vec3(uniforms.vBaseWeight);alpha=uniforms.vBaseColor.a;base_metalness=uniforms.vReflectanceInfo.x;base_diffuse_roughness=uniforms.vBaseDiffuseRoughness;specular_roughness=uniforms.vReflectanceInfo.y;specular_color=uniforms.vSpecularColor.rgb;specular_weight=uniforms.vReflectanceInfo.a;specular_ior=uniforms.vReflectanceInfo.z;specular_roughness_anisotropy=uniforms.vSpecularAnisotropy.b;geometry_tangent=uniforms.vSpecularAnisotropy.rg;geometry_thickness=uniforms.vGeometryThickness; #ifdef BASE_COLOR #ifdef BASE_COLOR_GAMMA base_color*=toLinearSpaceVec3(baseColorFromTexture.rgb); #else base_color*=baseColorFromTexture.rgb; #endif base_color*=uniforms.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*=uniforms.vGeometryOpacityInfos.y; #endif #ifdef GEOMETRY_THICKNESS #ifdef GEOMETRY_THICKNESS_FROM_GREEN_CHANNEL geometry_thickness*=thicknessFromTexture.g; #else geometry_thickness*=thicknessFromTexture.r; #endif geometry_thickness*=uniforms.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*uniforms.vBaseDiffuseRoughnessInfos.y; #endif #ifdef SPECULAR_COLOR #ifdef SPECULAR_COLOR_GAMMA specular_color*=toLinearSpaceVec3(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 {let tangentFromTexture: vec2f=normalize(geometryTangentFromTexture.xy*vec2f(2.0f)-vec2f(1.0f));let tangent_angle_texture: f32=atan2(tangentFromTexture.y,tangentFromTexture.x);let tangent_angle_uniform: f32=atan2(geometry_tangent.y,geometry_tangent.x);let tangent_angle: f32=tangent_angle_texture+tangent_angle_uniform;geometry_tangent=vec2f(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 let detailRoughness: f32=mix(0.5f,detailColor.b,vDetailInfos.w);let loLerp: f32=mix(0.f,specular_roughness,detailRoughness*2.f);let hiLerp: f32=mix(specular_roughness,1.f,(detailRoughness-0.5f)*2.f);specular_roughness=mix(loLerp,hiLerp,step(detailRoughness,0.5f)); #endif #ifdef USE_GLTF_STYLE_ANISOTROPY let baseAlpha: f32=specular_roughness*specular_roughness;let roughnessT: f32=mix(baseAlpha,1.0f,specular_roughness_anisotropy*specular_roughness_anisotropy);let roughnessB: f32=baseAlpha;specular_roughness_anisotropy=1.0f-roughnessB/max(roughnessT,0.00001f);specular_roughness=sqrt(roughnessT/sqrt(2.0f/(1.0f+(1.0f-specular_roughness_anisotropy)*(1.0f-specular_roughness_anisotropy)))); #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStoreWGSL[name$a]) { ShaderStore.IncludesShadersStoreWGSL[name$a] = shader$a; } /** @internal */ const openpbrBaseLayerDataWGSL = { name: name$a, shader: shader$a }; // Do not edit. const name$9 = "openpbrCoatLayerData"; const shader$9 = `var coat_weight: f32=0.0f;var coat_color: vec3f=vec3f(1.0f);var coat_roughness: f32=0.0f;var coat_roughness_anisotropy: f32=0.0f;var coat_ior: f32=1.6f;var coat_darkening: f32=1.0f;var geometry_coat_tangent: vec2f=vec2f(1.0f,0.0f); #ifdef COAT_WEIGHT var coatWeightFromTexture: vec4f=TEXRD(coatWeightSampler,coatWeightSamplerSampler,fragmentInputs.vCoatWeightUV+uvOffset); #endif #ifdef COAT_COLOR var coatColorFromTexture: vec4f=TEXRD(coatColorSampler,coatColorSamplerSampler,fragmentInputs.vCoatColorUV+uvOffset); #endif #ifdef COAT_ROUGHNESS var coatRoughnessFromTexture: vec4f=TEXRD(coatRoughnessSampler,coatRoughnessSamplerSampler,fragmentInputs.vCoatRoughnessUV+uvOffset); #endif #ifdef COAT_ROUGHNESS_ANISOTROPY var coatRoughnessAnisotropyFromTexture: f32=TEXRD(coatRoughnessAnisotropySampler,coatRoughnessAnisotropySamplerSampler,fragmentInputs.vCoatRoughnessAnisotropyUV+uvOffset).r; #endif #ifdef COAT_DARKENING var coatDarkeningFromTexture: vec4f=TEXRD(coatDarkeningSampler,coatDarkeningSamplerSampler,fragmentInputs.vCoatDarkeningUV+uvOffset); #endif #ifdef GEOMETRY_COAT_TANGENT var geometryCoatTangentFromTexture: vec3f=TEXRD(geometryCoatTangentSampler,geometryCoatTangentSamplerSampler,fragmentInputs.vGeometryCoatTangentUV+uvOffset).rgb; #endif coat_color=uniforms.vCoatColor.rgb;coat_weight=uniforms.vCoatWeight;coat_roughness=uniforms.vCoatRoughness;coat_roughness_anisotropy=uniforms.vCoatRoughnessAnisotropy;coat_ior=uniforms.vCoatIor;coat_darkening=uniforms.vCoatDarkening;geometry_coat_tangent=uniforms.vGeometryCoatTangent.rg; #ifdef COAT_WEIGHT coat_weight*=coatWeightFromTexture.r; #endif #ifdef COAT_COLOR #ifdef COAT_COLOR_GAMMA coat_color*=toLinearSpaceVec3(coatColorFromTexture.rgb); #else coat_color*=coatColorFromTexture.rgb; #endif coat_color*=uniforms.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 {let tangentFromTexture: vec2f=normalize(geometryCoatTangentFromTexture.xy*vec2f(2.0f)-vec2f(1.0f));let tangent_angle_texture: f32=atan2(tangentFromTexture.y,tangentFromTexture.x);let tangent_angle_uniform: f32=atan2(geometry_coat_tangent.y,geometry_coat_tangent.x);let tangent_angle: f32=tangent_angle_texture+tangent_angle_uniform;geometry_coat_tangent=vec2f(cos(tangent_angle),sin(tangent_angle));} #endif #ifdef USE_GLTF_STYLE_ANISOTROPY let coatAlpha: f32=coat_roughness*coat_roughness;let coatRoughnessT: f32=mix(coatAlpha,1.0f,coat_roughness_anisotropy*coat_roughness_anisotropy);let coatRoughnessB: f32=coatAlpha;coat_roughness_anisotropy=1.0f-coatRoughnessB/max(coatRoughnessT,0.00001f);coat_roughness=sqrt(coatRoughnessT/sqrt(2.0f/(1.0f+(1.0f-coat_roughness_anisotropy)*(1.0f-coat_roughness_anisotropy)))); #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStoreWGSL[name$9]) { ShaderStore.IncludesShadersStoreWGSL[name$9] = shader$9; } /** @internal */ const openpbrCoatLayerDataWGSL = { name: name$9, shader: shader$9 }; // Do not edit. const name$8 = "openpbrThinFilmLayerData"; const shader$8 = `#ifdef THIN_FILM var thin_film_weight: f32=uniforms.vThinFilmWeight;var thin_film_thickness: f32=uniforms.vThinFilmThickness.r*1000.0f; var thin_film_ior: f32=uniforms.vThinFilmIor; #ifdef THIN_FILM_WEIGHT var thinFilmWeightFromTexture: f32=TEXRD(thinFilmWeightSampler,thinFilmWeightSamplerSampler,fragmentInputs.vThinFilmWeightUV+uvOffset).r*uniforms.vThinFilmWeightInfos.y; #endif #ifdef THIN_FILM_THICKNESS var thinFilmThicknessFromTexture: f32=TEXRD(thinFilmThicknessSampler,thinFilmThicknessSamplerSampler,fragmentInputs.vThinFilmThicknessUV+uvOffset).g*uniforms.vThinFilmThicknessInfos.y; #endif #ifdef THIN_FILM_WEIGHT thin_film_weight*=thinFilmWeightFromTexture; #endif #ifdef THIN_FILM_THICKNESS thin_film_thickness*=thinFilmThicknessFromTexture; #endif let thin_film_ior_scale: f32=clamp(2.0f*abs(thin_film_ior-1.0f),0.0f,1.0f); #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStoreWGSL[name$8]) { ShaderStore.IncludesShadersStoreWGSL[name$8] = shader$8; } /** @internal */ const openpbrThinFilmLayerDataWGSL = { name: name$8, shader: shader$8 }; // Do not edit. const name$7 = "openpbrFuzzLayerData"; const shader$7 = `var fuzz_weight: f32=0.0f;var fuzz_color: vec3f=vec3f(1.0f);var fuzz_roughness: f32=0.0f; #ifdef FUZZ #ifdef FUZZ_WEIGHT let fuzzWeightFromTexture: vec4f=TEXRD(fuzzWeightSampler,fuzzWeightSamplerSampler,fragmentInputs.vFuzzWeightUV+uvOffset); #endif #ifdef FUZZ_COLOR var fuzzColorFromTexture: vec4f=TEXRD(fuzzColorSampler,fuzzColorSamplerSampler,fragmentInputs.vFuzzColorUV+uvOffset); #endif #ifdef FUZZ_ROUGHNESS let fuzzRoughnessFromTexture: vec4f=TEXRD(fuzzRoughnessSampler,fuzzRoughnessSamplerSampler,fragmentInputs.vFuzzRoughnessUV+uvOffset); #endif fuzz_color=uniforms.vFuzzColor.rgb;fuzz_weight=uniforms.vFuzzWeight;fuzz_roughness=uniforms.vFuzzRoughness; #ifdef FUZZ_WEIGHT fuzz_weight*=fuzzWeightFromTexture.r; #endif #ifdef FUZZ_COLOR #ifdef FUZZ_COLOR_GAMMA fuzz_color*=toLinearSpaceVec3(fuzzColorFromTexture.rgb); #else fuzz_color*=fuzzColorFromTexture.rgb; #endif fuzz_color*=uniforms.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.IncludesShadersStoreWGSL[name$7]) { ShaderStore.IncludesShadersStoreWGSL[name$7] = shader$7; } /** @internal */ const openpbrFuzzLayerDataWGSL = { name: name$7, shader: shader$7 }; // Do not edit. const name$6 = "openpbrAmbientOcclusionData"; const shader$6 = `var ambient_occlusion: vec3f=vec3f(1.0f,1.0f,1.0f);var specular_ambient_occlusion: f32=1.0f;var coat_specular_ambient_occlusion: f32=1.0f; #ifdef AMBIENT_OCCLUSION var ambientOcclusionFromTexture: vec3f=TEXRD(ambientOcclusionSampler,ambientOcclusionSamplerSampler,fragmentInputs.vAmbientOcclusionUV+uvOffset).rgb;ambient_occlusion=vec3f(ambientOcclusionFromTexture.r*uniforms.vAmbientOcclusionInfos.y+(1.0f-uniforms.vAmbientOcclusionInfos.y)); #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStoreWGSL[name$6]) { ShaderStore.IncludesShadersStoreWGSL[name$6] = shader$6; } /** @internal */ const openpbrAmbientOcclusionDataWGSL = { name: name$6, shader: shader$6 }; // Do not edit. const name$5 = "openpbrBackgroundTransmission"; const shader$5 = `var slab_translucent_background: vec4f=vec4f(0.,0.,0.,1.); #ifdef REFRACTED_BACKGROUND {let refractionLOD: f32=min(transmission_roughness,0.8)*uniforms.vBackgroundRefractionInfos.x;let lodTexelSize: f32=pow(2.0f,refractionLOD-uniforms.vBackgroundRefractionInfos.x); #ifdef DISPERSION { #ifdef REFRACTION_HIGH_QUALITY_BLUR {var dispResult: vec3f=vec3f(0.0);var dispWeight: vec3f=vec3f(0.0);let noiseOffset: vec2f=noise.xy*select(0.0f,lodTexelSize,refractionLOD>0.0f);for (var k: i32=0; k<6; k++) {let t: f32=(f32(k)+noise.y)/6.0f;let t_rg: f32=clamp(t*2.0f,0.0f,1.0f);let t_gb: f32=clamp((t-0.5f)*2.0f,0.0f,1.0f);let refVec: vec3f=mix(mix(refractedViewVectors[0],refractedViewVectors[1],t_rg),refractedViewVectors[2],t_gb);let uvw: vec3f=vec3f((uniforms.backgroundRefractionMatrix*(scene.view*vec4f(fragmentInputs.vPositionW+refVec*geometry_thickness,1.0f))).xyz);var coords: vec2f=uvw.xy/uvw.z;coords.y=1.0f-coords.y;let s: vec4f=textureSampleLevel(backgroundRefractionSampler,backgroundRefractionSamplerSampler,coords+noiseOffset,refractionLOD);let rw: f32=max(0.0f,1.0f-2.0f*t);let gw: f32=max(0.0f,1.0f-abs(2.0f*t-1.0f));let bw: f32=max(0.0f,2.0f*t-1.0f);let w: vec3f=vec3f(rw,gw,bw);dispResult+=s.rgb*w;dispWeight+=w;} slab_translucent_background=vec4f(dispResult/max(dispWeight,vec3f(1e-6)),1.0f);} #else for (var i: i32=0; i<3; i++) {let refractedViewVector: vec3f=refractedViewVectors[i];let uvw: vec3f=vec3f((uniforms.backgroundRefractionMatrix*(scene.view*vec4f(fragmentInputs.vPositionW+refractedViewVector*geometry_thickness,1.0f))).xyz);var coords: vec2f=uvw.xy/uvw.z;coords.y=1.0f-coords.y;if (refractionLOD>0.0f) {let noiseOffset: vec2f=noise.xy*lodTexelSize;slab_translucent_background[i]=textureSampleLevel(backgroundRefractionSampler,backgroundRefractionSamplerSampler,coords+noiseOffset,refractionLOD)[i];} else {slab_translucent_background[i]=textureSampleLevel(backgroundRefractionSampler,backgroundRefractionSamplerSampler,coords,0.0f)[i];}} #endif } #else {let refractionUVW: vec3f=vec3f((uniforms.backgroundRefractionMatrix*(scene.view*vec4f(fragmentInputs.vPositionW+refractedViewVector*geometry_thickness,1.0f))).xyz);var refractionCoords: vec2f=refractionUVW.xy/refractionUVW.z;refractionCoords.y=1.0f-refractionCoords.y;if (refractionLOD>0.0f) { #ifdef REFRACTION_HIGH_QUALITY_BLUR let cosA: f32=cos(noise.x*PI);let sinA: f32=sin(noise.x*PI);let u: vec2f=vec2f( cosA,sinA)*(0.5f*lodTexelSize);let v: vec2f=vec2f(-sinA,cosA)*(0.5f*lodTexelSize);slab_translucent_background=0.25f*( textureSampleLevel(backgroundRefractionSampler,backgroundRefractionSamplerSampler,refractionCoords+u+v,refractionLOD) + textureSampleLevel(backgroundRefractionSampler,backgroundRefractionSamplerSampler,refractionCoords-u+v,refractionLOD) + textureSampleLevel(backgroundRefractionSampler,backgroundRefractionSamplerSampler,refractionCoords+u-v,refractionLOD) + textureSampleLevel(backgroundRefractionSampler,backgroundRefractionSamplerSampler,refractionCoords-u-v,refractionLOD) ); #else let noiseOffset: vec2f=noise.xy*lodTexelSize;slab_translucent_background=textureSampleLevel(backgroundRefractionSampler,backgroundRefractionSamplerSampler,refractionCoords+noiseOffset,refractionLOD); #endif } else {slab_translucent_background=textureSampleLevel(backgroundRefractionSampler,backgroundRefractionSamplerSampler,refractionCoords,0.0f);}} #endif } #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStoreWGSL[name$5]) { ShaderStore.IncludesShadersStoreWGSL[name$5] = shader$5; } /** @internal */ const openpbrBackgroundTransmissionWGSL = { name: name$5, shader: shader$5 }; // Do not edit. const name$4 = "openpbrEnvironmentLighting"; const shader$4 = `#if defined(REFLECTION) || defined(REFRACTED_BACKGROUND) var coatAbsorption=vec3f(1.0f);var coatIblFresnel: f32=0.0;if (coat_weight>0.0) {coatIblFresnel=computeDielectricIblFresnel(coatReflectance,coatGeoInfo.environmentBrdf);let hemisphere_avg_fresnel: f32=coatReflectance.F0+0.5f*(1.0f-coatReflectance.F0);var averageReflectance: f32=(coatIblFresnel+hemisphere_avg_fresnel)*0.5f;let roughnessFactor=1.0f-coat_roughness*0.5f;averageReflectance*=roughnessFactor;var darkened_transmission: f32=(1.0f-averageReflectance)*(1.0f-averageReflectance);darkened_transmission=mix(1.0,darkened_transmission,coat_darkening);var sin2: f32=1.0f-coatGeoInfo.NdotV*coatGeoInfo.NdotV;sin2=sin2/(coat_ior*coat_ior)*coat_weight;let cos_t: f32=sqrt(1.0f-sin2);let coatPathLength=1.0f/cos_t;let effectivePathLength=coatPathLength*coat_weight;let colored_transmission: vec3f=pow(coat_color,vec3f(effectivePathLength));coatAbsorption=colored_transmission*mix(1.0f,darkened_transmission,coat_weight);} #endif #ifdef REFLECTION #if defined(FUZZ) && defined(FUZZENVIRONMENTBRDF) let environmentFuzzBrdf: vec3f=getFuzzBRDFLookup(fuzzGeoInfo.NdotV,sqrt(fuzz_roughness)); #endif var baseDiffuseEnvironmentLight: vec3f=sampleIrradiance( normalW #if defined(NORMAL) && defined(USESPHERICALINVERTEX) ,vEnvironmentIrradiance #endif #if (defined(USESPHERICALFROMREFLECTIONMAP) && (!defined(NORMAL) || !defined(USESPHERICALINVERTEX))) || (defined(USEIRRADIANCEMAP) && defined(REFLECTIONMAP_3D)) ,uniforms.reflectionMatrix #endif #ifdef USEIRRADIANCEMAP ,irradianceSampler ,irradianceSamplerSampler #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION ,uniforms.vReflectionDominantDirection #endif #endif #ifdef REALTIME_FILTERING ,uniforms.vReflectionFilteringInfo #ifdef IBL_CDF_FILTERING ,icdfSampler ,icdfSamplerSampler #endif #endif ,uniforms.vReflectionInfos ,viewDirectionW ,base_diffuse_roughness ,base_color ); #ifdef REFLECTIONMAP_3D var reflectionCoords: vec3f=vec3f(0.f,0.f,0.f); #else var reflectionCoords: vec2f=vec2f(0.f,0.f); #endif let specularAlphaG: f32=specular_roughness*specular_roughness; #ifdef ANISOTROPIC_BASE var baseSpecularEnvironmentLight: vec3f=sampleRadianceAnisotropic(specularAlphaG,uniforms.vReflectionMicrosurfaceInfos.rgb,uniforms.vReflectionInfos ,baseGeoInfo ,normalW ,viewDirectionW ,fragmentInputs.vPositionW ,noise ,false ,1.0 ,reflectionSampler ,reflectionSamplerSampler #ifdef REALTIME_FILTERING ,uniforms.vReflectionFilteringInfo #endif ); #else reflectionCoords=createReflectionCoords(fragmentInputs.vPositionW,normalW);var baseSpecularEnvironmentLight: vec3f=sampleRadiance(specularAlphaG,uniforms.vReflectionMicrosurfaceInfos.rgb,uniforms.vReflectionInfos ,baseGeoInfo ,reflectionSampler ,reflectionSamplerSampler ,reflectionCoords #ifdef REALTIME_FILTERING ,uniforms.vReflectionFilteringInfo #endif ); #endif #ifdef ANISOTROPIC_BASE baseSpecularEnvironmentLight=mix(baseSpecularEnvironmentLight.rgb,baseDiffuseEnvironmentLight,specularAlphaG*specularAlphaG *max(1.0f-baseGeoInfo.anisotropy,0.3f)); #else baseSpecularEnvironmentLight=mix(baseSpecularEnvironmentLight.rgb,baseDiffuseEnvironmentLight,specularAlphaG); #endif var coatEnvironmentLight: vec3f=vec3f(0.f,0.f,0.f);if (coat_weight>0.0) { #ifdef REFLECTIONMAP_3D var reflectionCoords: vec3f=vec3f(0.f,0.f,0.f); #else var reflectionCoords: vec2f=vec2f(0.f,0.f); #endif reflectionCoords=createReflectionCoords(fragmentInputs.vPositionW,coatNormalW);var coatAlphaG: f32=coat_roughness*coat_roughness; #ifdef ANISOTROPIC_COAT coatEnvironmentLight=sampleRadianceAnisotropic(coatAlphaG,uniforms.vReflectionMicrosurfaceInfos.rgb,uniforms.vReflectionInfos ,coatGeoInfo ,coatNormalW ,viewDirectionW ,fragmentInputs.vPositionW ,noise ,false ,1.0 ,reflectionSampler ,reflectionSamplerSampler #ifdef REALTIME_FILTERING ,uniforms.vReflectionFilteringInfo #endif ); #else coatEnvironmentLight=sampleRadiance(coatAlphaG,uniforms.vReflectionMicrosurfaceInfos.rgb,uniforms.vReflectionInfos ,coatGeoInfo ,reflectionSampler ,reflectionSamplerSampler ,reflectionCoords #ifdef REALTIME_FILTERING ,uniforms.vReflectionFilteringInfo #endif ); #endif } #if defined(FUZZ) && defined(FUZZENVIRONMENTBRDF) let modifiedFuzzRoughness: f32=clamp(fuzz_roughness*fuzz_roughness*(1.0f+0.5f*environmentFuzzBrdf.y),0.0f,1.0f);var fuzzEnvironmentLight=vec3f(0.0f,0.0f,0.0f);let fuzzIblFresnel: f32=min(environmentFuzzBrdf.z*2.0f,1.0f);let viewTangent: vec2f=vec2f(dot(viewDirectionW,fuzzTangent),dot(viewDirectionW,fuzzBitangent));let centerAngle: f32=atan2(viewTangent.y,viewTangent.x);for (var i: i32=0; i<i32(FUZZ_IBL_SAMPLES); i++) {let angle: f32=centerAngle+(f32(i)/f32(FUZZ_IBL_SAMPLES)-0.5f+noise.x/f32(FUZZ_IBL_SAMPLES))*3.141592f;let fiberCylinderNormal: vec3f=normalize(cos(angle)*fuzzTangent+sin(angle)*fuzzBitangent);let fuzzReflectionCoords: vec3f=(uniforms.reflectionMatrix*vec4f(fiberCylinderNormal,0.0f)).xyz;let radianceSample: vec3f=sampleRadiance(modifiedFuzzRoughness,uniforms.vReflectionMicrosurfaceInfos.rgb,uniforms.vReflectionInfos ,fuzzGeoInfo ,reflectionSampler ,reflectionSamplerSampler ,fuzzReflectionCoords #ifdef REALTIME_FILTERING ,uniforms.vReflectionFilteringInfo #endif );fuzzEnvironmentLight+=radianceSample;} fuzzEnvironmentLight/=f32(FUZZ_IBL_SAMPLES); #if defined(GEOMETRY_NORMAL) || defined(GEOMETRY_COAT_NORMAL) var fuzzDiffuseEnvironmentLight: vec3f=sampleIrradiance( fuzzNormalW #if defined(NORMAL) && defined(USESPHERICALINVERTEX) ,vEnvironmentIrradiance #endif #if (defined(USESPHERICALFROMREFLECTIONMAP) && (!defined(NORMAL) || !defined(USESPHERICALINVERTEX))) || (defined(USEIRRADIANCEMAP) && defined(REFLECTIONMAP_3D)) ,uniforms.reflectionMatrix #endif #ifdef USEIRRADIANCEMAP ,irradianceSampler ,irradianceSamplerSampler #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION ,uniforms.vReflectionDominantDirection #endif #endif #ifdef REALTIME_FILTERING ,uniforms.vReflectionFilteringInfo #ifdef IBL_CDF_FILTERING ,icdfSampler ,icdfSamplerSampler #endif #endif ,uniforms.vReflectionInfos ,viewDirectionW ,0.0f ,vec3f(1.0f) ); #else var fuzzDiffuseEnvironmentLight: vec3f=baseDiffuseEnvironmentLight; #endif fuzzEnvironmentLight=mix(min(fuzzEnvironmentLight,fuzzDiffuseEnvironmentLight),fuzzDiffuseEnvironmentLight,modifiedFuzzRoughness); #endif var dielectricIblFresnel: f32=computeDielectricIblFresnel(baseDielectricReflectance,baseGeoInfo.environmentBrdf);var dielectricIblColoredFresnel: vec3f=dielectricIblFresnel*specular_color; #ifdef THIN_FILM let thin_film_cos_theta: