@babylonjs/core
Version:
Getting started? Play directly with the Babylon.js API using our [playground](https://playground.babylonjs.com/). It also contains a lot of samples to learn how to use it.
408 lines • 13.4 kB
JavaScript
// Do not edit.
import { ShaderStore } from "../../Engines/shaderStore.js";
const name = "pbrBlockSubSurface";
const shader = `struct subSurfaceOutParams
{vec3 specularEnvironmentReflectance;
vec3 finalRefraction;vec3 surfaceAlbedo;
float alpha;
float refractionOpacity;
vec3 transmittance;float translucencyIntensity;
vec3 refractionIrradiance;
vec4 thicknessMap;
vec4 environmentRefraction;vec3 refractionTransmittance;
};
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
,in samplerCube refractionSampler
,in samplerCube refractionSamplerLow
,in samplerCube refractionSamplerHigh
,in sampler2D refractionSampler
,in sampler2D refractionSamplerLow
,in sampler2D refractionSamplerHigh
,in anisotropicOutParams anisotropicOut
,in vec2 vRefractionFilteringInfo
,in vec3 refractionPosition
,in vec3 refractionSize
) {vec4 environmentRefraction=vec4(0.,0.,0.,0.);
vec3 refractionVector=refract(-viewDirectionW,anisotropicOut.anisotropicNormal,ior);
vec3 refractionVector=refract(-viewDirectionW,normalW,ior);
refractionVector.z*=-1.0;
refractionVector=parallaxCorrectNormal(vPositionW,refractionVector,refractionSize,refractionPosition);
refractionVector.y=refractionVector.y*vRefractionInfos.w;vec3 refractionCoords=refractionVector;refractionCoords=vec3(refractionMatrix*vec4(refractionCoords,0));
vec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*thickness,1.0)));
vec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));
vec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;refractionCoords.y=1.0-refractionCoords.y;
refractionLOD=refractionLOD*vRefractionMicrosurfaceInfos.y+vRefractionMicrosurfaceInfos.z;
float automaticRefractionLOD=UNPACK_LOD(sampleRefraction(refractionSampler,refractionCoords).a);float requestedRefractionLOD=max(automaticRefractionLOD,refractionLOD);
float requestedRefractionLOD=refractionLOD;
environmentRefraction=vec4(radiance(alphaG,refractionSampler,refractionCoords,vRefractionFilteringInfo),1.0);
environmentRefraction=sampleRefractionLod(refractionSampler,refractionCoords,requestedRefractionLOD);
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
);}
environmentRefraction.rgb=fromRGBD(environmentRefraction);
environmentRefraction.rgb=toLinearSpace(environmentRefraction.rgb);
return environmentRefraction;}
subSurfaceOutParams subSurfaceBlock(
in vec3 vSubSurfaceIntensity
,in vec2 vThicknessParam
,in vec4 vTintColor
,in vec3 normalW
,in vec3 vSpecularEnvironmentReflectance
,in vec4 thicknessMap
,in vec4 refractionIntensityMap
,in vec4 translucencyIntensityMap
,in mat4 reflectionMatrix
,in vec3 irradianceVector_
,in samplerCube reflectionSampler
,in vec2 vReflectionFilteringInfo
,in sampler2D icdfSampler
,in samplerCube irradianceSampler
,in sampler2D irradianceSampler
,in vec3 surfaceAlbedo
,in vec3 vPositionW
,in vec3 viewDirectionW
,in mat4 view
,in vec4 vRefractionInfos
,in mat4 refractionMatrix
,in vec4 vRefractionMicrosurfaceInfos
,in vec4 vLightingIntensity
,in float alpha
,in float NdotVUnclamped
,in float roughness
,in float alphaG
,in samplerCube refractionSampler
,in samplerCube refractionSamplerLow
,in samplerCube refractionSamplerHigh
,in sampler2D refractionSampler
,in sampler2D refractionSamplerLow
,in sampler2D refractionSamplerHigh
,in anisotropicOutParams anisotropicOut
,in vec2 vRefractionFilteringInfo
,in vec3 refractionPosition
,in vec3 refractionSize
,in float dispersion
,in vec3 vDiffusionDistance
,in vec4 vTranslucencyColor
,in vec4 translucencyColorMap
)
{subSurfaceOutParams outParams;outParams.specularEnvironmentReflectance=vSpecularEnvironmentReflectance;
float refractionIntensity=vSubSurfaceIntensity.x;
refractionIntensity*=(1.0-alpha);outParams.alpha=1.0;
float translucencyIntensity=vSubSurfaceIntensity.y;
float thickness=thicknessMap.g*vThicknessParam.y+vThicknessParam.x;
float thickness=thicknessMap.r*vThicknessParam.y+vThicknessParam.x;
outParams.thicknessMap=thicknessMap;
refractionIntensity*=thicknessMap.r;
refractionIntensity*=thicknessMap.g;
translucencyIntensity*=thicknessMap.a;
translucencyIntensity*=thicknessMap.b;
float thickness=vThicknessParam.y;
refractionIntensity*=refractionIntensityMap.r;
refractionIntensity*=refractionIntensityMap.g;
translucencyIntensity*=translucencyIntensityMap.a;
translucencyIntensity*=translucencyIntensityMap.b;
thickness=maxEps(thickness);vec4 translucencyColor=vTranslucencyColor;
translucencyColor*=translucencyColorMap;
vec3 transmittance=transmittanceBRDF_Burley(translucencyColor.rgb,vDiffusionDistance,thickness);transmittance*=translucencyIntensity;outParams.transmittance=transmittance;outParams.translucencyIntensity=translucencyIntensity;
vec4 environmentRefraction=vec4(0.,0.,0.,0.);
float ior=vRefractionInfos.y;
float ior=vRefractionMicrosurfaceInfos.w;
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);
float refractionRoughness=alphaG;refractionRoughness=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLinearLodFromRoughness(vRefractionMicrosurfaceInfos.x,refractionRoughness);
float refractionAlphaG=alphaG;refractionAlphaG=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLodFromAlphaG(vRefractionMicrosurfaceInfos.x,refractionAlphaG);
float refraction_ior=vRefractionInfos.y;
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];
vec4 envSample=sampleEnvironmentRefraction(refraction_ior,thickness,refractionLOD,normalW,vPositionW,viewDirectionW,view,vRefractionInfos,refractionMatrix,vRefractionMicrosurfaceInfos,alphaG
,refractionSampler
,refractionSamplerLow
,refractionSamplerHigh
,refractionSampler
,refractionSamplerLow
,refractionSamplerHigh
,anisotropicOut
,vRefractionFilteringInfo
,refractionPosition
,refractionSize
);
environmentRefraction[i]=envSample[i];}
environmentRefraction=envSample;
environmentRefraction.rgb*=vRefractionInfos.x;
vec3 refractionTransmittance=vec3(refractionIntensity);
vec3 volumeAlbedo=computeColorAtDistanceInMedia(vTintColor.rgb,vTintColor.w);refractionTransmittance*=cocaLambert(volumeAlbedo,thickness);
float maxChannel=max(max(surfaceAlbedo.r,surfaceAlbedo.g),surfaceAlbedo.b);vec3 volumeAlbedo=saturate(maxChannel*surfaceAlbedo);environmentRefraction.rgb*=volumeAlbedo;
vec3 volumeAlbedo=computeColorAtDistanceInMedia(vTintColor.rgb,vTintColor.w);refractionTransmittance*=cocaLambert(volumeAlbedo,vThicknessParam.y);
environmentRefraction.rgb*=surfaceAlbedo.rgb;
outParams.surfaceAlbedo=surfaceAlbedo;outParams.refractionOpacity=1.-refractionIntensity;
outParams.surfaceAlbedo*=outParams.refractionOpacity;
vec3 bounceSpecularEnvironmentReflectance=(2.0*vSpecularEnvironmentReflectance)/(1.0+vSpecularEnvironmentReflectance);outParams.specularEnvironmentReflectance=mix(bounceSpecularEnvironmentReflectance,vSpecularEnvironmentReflectance,refractionIntensity);
outParams.refractionTransmittance=refractionTransmittance;
outParams.finalRefraction=environmentRefraction.rgb*refractionTransmittance*vLightingIntensity.z;outParams.finalRefraction*=vec3(1.0)-vSpecularEnvironmentReflectance;
outParams.environmentRefraction=environmentRefraction;
vec3 irradianceVector=vec3(reflectionMatrix*vec4(normalW,0)).xyz;
irradianceVector.z*=-1.0;
irradianceVector.y*=-1.0;
vec3 irradianceVector=irradianceVector_;
vec3 refractionIrradiance=irradiance(reflectionSampler,-irradianceVector,vReflectionFilteringInfo,0.0,surfaceAlbedo,irradianceVector
,icdfSampler
);
vec3 refractionIrradiance=computeEnvironmentIrradiance(-irradianceVector);
vec3 irradianceCoords=irradianceVector;
vec2 irradianceCoords=irradianceVector.xy;
irradianceCoords/=irradianceVector.z;
irradianceCoords.y=1.0-irradianceCoords.y;
vec4 refractionIrradiance=sampleReflection(irradianceSampler,-irradianceCoords);
refractionIrradiance.rgb=fromRGBD(refractionIrradiance);
refractionIrradiance.rgb=toLinearSpace(refractionIrradiance.rgb);
vec4 refractionIrradiance=vec4(0.);
refractionIrradiance.rgb*=transmittance;
refractionIrradiance.rgb*=surfaceAlbedo.rgb;
outParams.refractionIrradiance=refractionIrradiance.rgb;
return outParams;}
`;
// Sideeffect
if (!ShaderStore.IncludesShadersStore[name]) {
ShaderStore.IncludesShadersStore[name] = shader;
}
/** @internal */
export const pbrBlockSubSurface = { name, shader };
//# sourceMappingURL=pbrBlockSubSurface.js.map