123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- // Do not edit.
- import { ShaderStore } from "../../Engines/shaderStore.js";
- const name = "pbrBlockSubSurface";
- const shader = `struct subSurfaceOutParams
- {vec3 specularEnvironmentReflectance;
- #ifdef SS_REFRACTION
- vec3 finalRefraction;vec3 surfaceAlbedo;
- #ifdef SS_LINKREFRACTIONTOTRANSPARENCY
- float alpha;
- #endif
- #ifdef REFLECTION
- float refractionFactorForIrradiance;
- #endif
- #endif
- #ifdef SS_TRANSLUCENCY
- vec3 transmittance;float translucencyIntensity;
- #ifdef REFLECTION
- vec3 refractionIrradiance;
- #endif
- #endif
- #if DEBUGMODE>0
- #ifdef SS_THICKNESSANDMASK_TEXTURE
- vec4 thicknessMap;
- #endif
- #ifdef SS_REFRACTION
- vec4 environmentRefraction;vec3 refractionTransmittance;
- #endif
- #endif
- };
- #ifdef SUBSURFACE
- #ifdef SS_REFRACTION
- #define pbr_inline
- #define inline
- vec4 sampleEnvironmentRefraction(
- in float ior
- ,in float thickness
- ,in float refractionLOD
- ,in vec3 normalW
- ,in vec3 vPositionW
- ,in vec3 viewDirectionW
- ,in mat4 view
- ,in vec4 vRefractionInfos
- ,in mat4 refractionMatrix
- ,in vec4 vRefractionMicrosurfaceInfos
- ,in float alphaG
- #ifdef SS_REFRACTIONMAP_3D
- ,in samplerCube refractionSampler
- #ifndef LODBASEDMICROSFURACE
- ,in samplerCube refractionSamplerLow
- ,in samplerCube refractionSamplerHigh
- #endif
- #else
- ,in sampler2D refractionSampler
- #ifndef LODBASEDMICROSFURACE
- ,in sampler2D refractionSamplerLow
- ,in sampler2D refractionSamplerHigh
- #endif
- #endif
- #ifdef ANISOTROPIC
- ,in anisotropicOutParams anisotropicOut
- #endif
- #ifdef REALTIME_FILTERING
- ,in vec2 vRefractionFilteringInfo
- #endif
- #ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC
- ,in vec3 refractionPosition
- ,in vec3 refractionSize
- #endif
- ) {vec4 environmentRefraction=vec4(0.,0.,0.,0.);
- #ifdef ANISOTROPIC
- vec3 refractionVector=refract(-viewDirectionW,anisotropicOut.anisotropicNormal,ior);
- #else
- vec3 refractionVector=refract(-viewDirectionW,normalW,ior);
- #endif
- #ifdef SS_REFRACTIONMAP_OPPOSITEZ
- refractionVector.z*=-1.0;
- #endif
- #ifdef SS_REFRACTIONMAP_3D
- #ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC
- refractionVector=parallaxCorrectNormal(vPositionW,refractionVector,refractionSize,refractionPosition);
- #endif
- refractionVector.y=refractionVector.y*vRefractionInfos.w;vec3 refractionCoords=refractionVector;refractionCoords=vec3(refractionMatrix*vec4(refractionCoords,0));
- #else
- #ifdef SS_USE_THICKNESS_AS_DEPTH
- vec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*thickness,1.0)));
- #else
- vec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));
- #endif
- vec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;refractionCoords.y=1.0-refractionCoords.y;
- #endif
- #ifdef LODBASEDMICROSFURACE
- refractionLOD=refractionLOD*vRefractionMicrosurfaceInfos.y+vRefractionMicrosurfaceInfos.z;
- #ifdef SS_LODINREFRACTIONALPHA
- float automaticRefractionLOD=UNPACK_LOD(sampleRefraction(refractionSampler,refractionCoords).a);float requestedRefractionLOD=max(automaticRefractionLOD,refractionLOD);
- #else
- float requestedRefractionLOD=refractionLOD;
- #endif
- #if defined(REALTIME_FILTERING) && defined(SS_REFRACTIONMAP_3D)
- environmentRefraction=vec4(radiance(alphaG,refractionSampler,refractionCoords,vRefractionFilteringInfo),1.0);
- #else
- environmentRefraction=sampleRefractionLod(refractionSampler,refractionCoords,requestedRefractionLOD);
- #endif
- #else
- float lodRefractionNormalized=saturate(refractionLOD/log2(vRefractionMicrosurfaceInfos.x));float lodRefractionNormalizedDoubled=lodRefractionNormalized*2.0;vec4 environmentRefractionMid=sampleRefraction(refractionSampler,refractionCoords);if (lodRefractionNormalizedDoubled<1.0){environmentRefraction=mix(
- sampleRefraction(refractionSamplerHigh,refractionCoords),
- environmentRefractionMid,
- lodRefractionNormalizedDoubled
- );} else {environmentRefraction=mix(
- environmentRefractionMid,
- sampleRefraction(refractionSamplerLow,refractionCoords),
- lodRefractionNormalizedDoubled-1.0
- );}
- #endif
- #ifdef SS_RGBDREFRACTION
- environmentRefraction.rgb=fromRGBD(environmentRefraction);
- #endif
- #ifdef SS_GAMMAREFRACTION
- environmentRefraction.rgb=toLinearSpace(environmentRefraction.rgb);
- #endif
- return environmentRefraction;}
- #endif
- #define pbr_inline
- #define inline
- void subSurfaceBlock(
- in vec3 vSubSurfaceIntensity,
- in vec2 vThicknessParam,
- in vec4 vTintColor,
- in vec3 normalW,
- in vec3 specularEnvironmentReflectance,
- #ifdef SS_THICKNESSANDMASK_TEXTURE
- in vec4 thicknessMap,
- #endif
- #ifdef SS_REFRACTIONINTENSITY_TEXTURE
- in vec4 refractionIntensityMap,
- #endif
- #ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE
- in vec4 translucencyIntensityMap,
- #endif
- #ifdef REFLECTION
- #ifdef SS_TRANSLUCENCY
- in mat4 reflectionMatrix,
- #ifdef USESPHERICALFROMREFLECTIONMAP
- #if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)
- in vec3 irradianceVector_,
- #endif
- #if defined(REALTIME_FILTERING)
- in samplerCube reflectionSampler,
- in vec2 vReflectionFilteringInfo,
- #endif
- #endif
- #ifdef USEIRRADIANCEMAP
- #ifdef REFLECTIONMAP_3D
- in samplerCube irradianceSampler,
- #else
- in sampler2D irradianceSampler,
- #endif
- #endif
- #endif
- #endif
- #if defined(SS_REFRACTION) || defined(SS_TRANSLUCENCY)
- in vec3 surfaceAlbedo,
- #endif
- #ifdef SS_REFRACTION
- in vec3 vPositionW,
- in vec3 viewDirectionW,
- in mat4 view,
- in vec4 vRefractionInfos,
- in mat4 refractionMatrix,
- in vec4 vRefractionMicrosurfaceInfos,
- in vec4 vLightingIntensity,
- #ifdef SS_LINKREFRACTIONTOTRANSPARENCY
- in float alpha,
- #endif
- #ifdef SS_LODINREFRACTIONALPHA
- in float NdotVUnclamped,
- #endif
- #ifdef SS_LINEARSPECULARREFRACTION
- in float roughness,
- #endif
- in float alphaG,
- #ifdef SS_REFRACTIONMAP_3D
- in samplerCube refractionSampler,
- #ifndef LODBASEDMICROSFURACE
- in samplerCube refractionSamplerLow,
- in samplerCube refractionSamplerHigh,
- #endif
- #else
- in sampler2D refractionSampler,
- #ifndef LODBASEDMICROSFURACE
- in sampler2D refractionSamplerLow,
- in sampler2D refractionSamplerHigh,
- #endif
- #endif
- #ifdef ANISOTROPIC
- in anisotropicOutParams anisotropicOut,
- #endif
- #ifdef REALTIME_FILTERING
- in vec2 vRefractionFilteringInfo,
- #endif
- #ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC
- in vec3 refractionPosition,
- in vec3 refractionSize,
- #endif
- #ifdef SS_DISPERSION
- in float dispersion,
- #endif
- #endif
- #ifdef SS_TRANSLUCENCY
- in vec3 vDiffusionDistance,
- #endif
- out subSurfaceOutParams outParams
- )
- {outParams.specularEnvironmentReflectance=specularEnvironmentReflectance;
- #ifdef SS_REFRACTION
- float refractionIntensity=vSubSurfaceIntensity.x;
- #ifdef SS_LINKREFRACTIONTOTRANSPARENCY
- refractionIntensity*=(1.0-alpha);outParams.alpha=1.0;
- #endif
- #endif
- #ifdef SS_TRANSLUCENCY
- float translucencyIntensity=vSubSurfaceIntensity.y;
- #endif
- #ifdef SS_THICKNESSANDMASK_TEXTURE
- #if defined(SS_USE_GLTF_TEXTURES)
- float thickness=thicknessMap.g*vThicknessParam.y+vThicknessParam.x;
- #else
- float thickness=thicknessMap.r*vThicknessParam.y+vThicknessParam.x;
- #endif
- #if DEBUGMODE>0
- outParams.thicknessMap=thicknessMap;
- #endif
- #if defined(SS_REFRACTION) && defined(SS_REFRACTION_USE_INTENSITY_FROM_THICKNESS)
- #if defined(SS_USE_GLTF_TEXTURES)
- refractionIntensity*=thicknessMap.r;
- #else
- refractionIntensity*=thicknessMap.g;
- #endif
- #endif
- #if defined(SS_TRANSLUCENCY) && defined(SS_TRANSLUCENCY_USE_INTENSITY_FROM_THICKNESS)
- translucencyIntensity*=thicknessMap.b;
- #endif
- #else
- float thickness=vThicknessParam.y;
- #endif
- #if defined(SS_REFRACTION) && defined(SS_REFRACTIONINTENSITY_TEXTURE)
- #ifdef SS_USE_GLTF_TEXTURES
- refractionIntensity*=refractionIntensityMap.r;
- #else
- refractionIntensity*=refractionIntensityMap.g;
- #endif
- #endif
- #if defined(SS_TRANSLUCENCY) && defined(SS_TRANSLUCENCYINTENSITY_TEXTURE)
- translucencyIntensity*=translucencyIntensityMap.b;
- #endif
- #ifdef SS_TRANSLUCENCY
- thickness=maxEps(thickness);vec3 transmittance=transmittanceBRDF_Burley(vTintColor.rgb,vDiffusionDistance,thickness);transmittance*=translucencyIntensity;outParams.transmittance=transmittance;outParams.translucencyIntensity=translucencyIntensity;
- #endif
- #ifdef SS_REFRACTION
- vec4 environmentRefraction=vec4(0.,0.,0.,0.);
- #ifdef SS_HAS_THICKNESS
- float ior=vRefractionInfos.y;
- #else
- float ior=vRefractionMicrosurfaceInfos.w;
- #endif
- #ifdef SS_LODINREFRACTIONALPHA
- float refractionAlphaG=alphaG;refractionAlphaG=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLodFromAlphaG(vRefractionMicrosurfaceInfos.x,refractionAlphaG,NdotVUnclamped);
- #elif defined(SS_LINEARSPECULARREFRACTION)
- float refractionRoughness=alphaG;refractionRoughness=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLinearLodFromRoughness(vRefractionMicrosurfaceInfos.x,refractionRoughness);
- #else
- float refractionAlphaG=alphaG;refractionAlphaG=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLodFromAlphaG(vRefractionMicrosurfaceInfos.x,refractionAlphaG);
- #endif
- float refraction_ior=vRefractionInfos.y;
- #ifdef SS_DISPERSION
- float realIOR=1.0/refraction_ior;float iorDispersionSpread=0.04*dispersion*(realIOR-1.0);vec3 iors=vec3(1.0/(realIOR-iorDispersionSpread),refraction_ior,1.0/(realIOR+iorDispersionSpread));for (int i=0; i<3; i++) {refraction_ior=iors[i];
- #endif
- vec4 envSample=sampleEnvironmentRefraction(refraction_ior,thickness,refractionLOD,normalW,vPositionW,viewDirectionW,view,vRefractionInfos,refractionMatrix,vRefractionMicrosurfaceInfos,alphaG
- #ifdef SS_REFRACTIONMAP_3D
- ,refractionSampler
- #ifndef LODBASEDMICROSFURACE
- ,refractionSamplerLow
- ,refractionSamplerHigh
- #endif
- #else
- ,refractionSampler
- #ifndef LODBASEDMICROSFURACE
- ,refractionSamplerLow
- ,refractionSamplerHigh
- #endif
- #endif
- #ifdef ANISOTROPIC
- ,anisotropicOut
- #endif
- #ifdef REALTIME_FILTERING
- ,vRefractionFilteringInfo
- #endif
- #ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC
- ,refractionPosition
- ,refractionSize
- #endif
- );
- #ifdef SS_DISPERSION
- environmentRefraction[i]=envSample[i];}
- #else
- environmentRefraction=envSample;
- #endif
- environmentRefraction.rgb*=vRefractionInfos.x;
- #endif
- #ifdef SS_REFRACTION
- vec3 refractionTransmittance=vec3(refractionIntensity);
- #ifdef SS_THICKNESSANDMASK_TEXTURE
- vec3 volumeAlbedo=computeColorAtDistanceInMedia(vTintColor.rgb,vTintColor.w);refractionTransmittance*=cocaLambert(volumeAlbedo,thickness);
- #elif defined(SS_LINKREFRACTIONTOTRANSPARENCY)
- float maxChannel=max(max(surfaceAlbedo.r,surfaceAlbedo.g),surfaceAlbedo.b);vec3 volumeAlbedo=saturate(maxChannel*surfaceAlbedo);environmentRefraction.rgb*=volumeAlbedo;
- #else
- vec3 volumeAlbedo=computeColorAtDistanceInMedia(vTintColor.rgb,vTintColor.w);refractionTransmittance*=cocaLambert(volumeAlbedo,vThicknessParam.y);
- #endif
- #ifdef SS_ALBEDOFORREFRACTIONTINT
- environmentRefraction.rgb*=surfaceAlbedo.rgb;
- #endif
- outParams.surfaceAlbedo=surfaceAlbedo*(1.-refractionIntensity);
- #ifdef REFLECTION
- outParams.refractionFactorForIrradiance=(1.-refractionIntensity);
- #endif
- #ifdef UNUSED_MULTIPLEBOUNCES
- vec3 bounceSpecularEnvironmentReflectance=(2.0*specularEnvironmentReflectance)/(1.0+specularEnvironmentReflectance);outParams.specularEnvironmentReflectance=mix(bounceSpecularEnvironmentReflectance,specularEnvironmentReflectance,refractionIntensity);
- #endif
- refractionTransmittance*=1.0-outParams.specularEnvironmentReflectance;
- #if DEBUGMODE>0
- outParams.refractionTransmittance=refractionTransmittance;
- #endif
- outParams.finalRefraction=environmentRefraction.rgb*refractionTransmittance*vLightingIntensity.z;
- #if DEBUGMODE>0
- outParams.environmentRefraction=environmentRefraction;
- #endif
- #endif
- #if defined(REFLECTION) && defined(SS_TRANSLUCENCY)
- #if defined(NORMAL) && defined(USESPHERICALINVERTEX) || !defined(USESPHERICALFROMREFLECTIONMAP)
- vec3 irradianceVector=vec3(reflectionMatrix*vec4(normalW,0)).xyz;
- #ifdef REFLECTIONMAP_OPPOSITEZ
- irradianceVector.z*=-1.0;
- #endif
- #ifdef INVERTCUBICMAP
- irradianceVector.y*=-1.0;
- #endif
- #else
- vec3 irradianceVector=irradianceVector_;
- #endif
- #if defined(USESPHERICALFROMREFLECTIONMAP)
- #if defined(REALTIME_FILTERING)
- vec3 refractionIrradiance=irradiance(reflectionSampler,-irradianceVector,vReflectionFilteringInfo);
- #else
- vec3 refractionIrradiance=computeEnvironmentIrradiance(-irradianceVector);
- #endif
- #elif defined(USEIRRADIANCEMAP)
- #ifdef REFLECTIONMAP_3D
- vec3 irradianceCoords=irradianceVector;
- #else
- vec2 irradianceCoords=irradianceVector.xy;
- #ifdef REFLECTIONMAP_PROJECTION
- irradianceCoords/=irradianceVector.z;
- #endif
- irradianceCoords.y=1.0-irradianceCoords.y;
- #endif
- vec4 refractionIrradiance=sampleReflection(irradianceSampler,-irradianceCoords);
- #ifdef RGBDREFLECTION
- refractionIrradiance.rgb=fromRGBD(refractionIrradiance);
- #endif
- #ifdef GAMMAREFLECTION
- refractionIrradiance.rgb=toLinearSpace(refractionIrradiance.rgb);
- #endif
- #else
- vec4 refractionIrradiance=vec4(0.);
- #endif
- refractionIrradiance.rgb*=transmittance;
- #ifdef SS_ALBEDOFORTRANSLUCENCYTINT
- refractionIrradiance.rgb*=surfaceAlbedo.rgb;
- #endif
- outParams.refractionIrradiance=refractionIrradiance.rgb;
- #endif
- }
- #endif
- `;
- // Sideeffect
- ShaderStore.IncludesShadersStore[name] = shader;
- /** @internal */
- export const pbrBlockSubSurface = { name, shader };
- //# sourceMappingURL=pbrBlockSubSurface.js.map
|