@babylonjs/addons 8.26.2 → 8.27.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/atmosphere/Shaders/ShadersInclude/atmosphereFunctions.js +1 -1
- package/atmosphere/Shaders/ShadersInclude/atmosphereFunctions.js.map +1 -1
- package/atmosphere/atmosphere.d.ts +4 -4
- package/atmosphere/atmosphere.js +28 -17
- package/atmosphere/atmosphere.js.map +1 -1
- package/atmosphere/sampling.d.ts +1 -1
- package/atmosphere/sampling.js +9 -2
- package/atmosphere/sampling.js.map +1 -1
- package/atmosphere/test/unit/sampling.test.d.ts +1 -0
- package/atmosphere/test/unit/sampling.test.js +77 -0
- package/atmosphere/test/unit/sampling.test.js.map +1 -0
- package/package.json +2 -2
|
@@ -157,8 +157,8 @@ transmittance,
|
|
|
157
157
|
multiScattering);float weight=RECIPROCAL_PI4*abs(sinInclination)*MultiScatteringAngleStepProduct;multiScatteringTotal+=multiScattering*weight;inscattered+=radiance*weight;}}
|
|
158
158
|
vec3 multiScattering=inscattered/max(vec3(0.000001),vec3(1.)-multiScatteringTotal);return vec4(multiScattering,1.);}
|
|
159
159
|
#endif
|
|
160
|
-
#if RENDER_SKY_VIEW
|
|
161
160
|
float computeCosHorizonAngleFromZenith(float radius) {float sinAngleBetweenHorizonAndNadir=min(1.,planetRadius/radius);float cosHorizonAngleFromNadir=sqrt(1.-sinAngleBetweenHorizonAndNadir*sinAngleBetweenHorizonAndNadir);float cosHorizonAngleFromZenith=-cosHorizonAngleFromNadir;return cosHorizonAngleFromZenith;}
|
|
161
|
+
#if RENDER_SKY_VIEW
|
|
162
162
|
void getSkyViewParametersFromUV(
|
|
163
163
|
float radius,
|
|
164
164
|
vec2 uv,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atmosphereFunctions.js","sourceRoot":"","sources":["../../../../../../dev/addons/src/atmosphere/Shaders/ShadersInclude/atmosphereFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,+CAAiC;AACvD,yEAA2D;AAE3D,MAAM,IAAI,GAAG,qBAAqB,CAAC;AACnC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Nd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\nimport \"core/Shaders/ShadersInclude/intersectionFunctions\";\n\nconst name = \"atmosphereFunctions\";\nconst shader = `#include<intersectionFunctions>\nconst vec2 MultiScatteringLutSize=vec2(32.0,32.0);const vec2 MultiScatteringLutDomainInUVSpace=(MultiScatteringLutSize-vec2(1.0))/MultiScatteringLutSize;const vec2 MultiScatteringLutHalfTexelSize=vec2(0.5)/MultiScatteringLutSize;const float NumAerialPerspectiveLutLayers=32.0;const vec3 AerialPerspectiveLutSize=vec3(16.0,64.0,NumAerialPerspectiveLutLayers);const vec2 DiffuseSkyIrradianceLutSize=vec2(64.0,16.0);const vec2 DiffuseSkyIrradianceLutDomainInUVSpace=(DiffuseSkyIrradianceLutSize-vec2(1.0))/DiffuseSkyIrradianceLutSize;const vec2 DiffuseSkyIrradianceLutHalfTexelSize=vec2(0.5)/DiffuseSkyIrradianceLutSize;const vec2 SkyViewLutSize=vec2(128.0,128.0);const vec2 SkyViewLutDomainInUVSpace=(SkyViewLutSize-vec2(1.0))/SkyViewLutSize;const vec2 SkyViewLutHalfTexelSize=vec2(0.5)/SkyViewLutSize;const float AerialPerspectiveLutKMPerSlice=4.0;const float AerialPerspectiveLutRangeKM=AerialPerspectiveLutKMPerSlice*NumAerialPerspectiveLutLayers;const float TransmittanceSampleCount=128.0;const float SkyViewLutSampleCount=30.0;const vec2 TransmittanceLutSize=vec2(256.,64.);const vec2 TransmittanceLutDomainInUVSpace=(TransmittanceLutSize-vec2(1.))/TransmittanceLutSize;const vec2 TransmittanceLutHalfTexelSize=vec2(0.5)/TransmittanceLutSize;const float TransmittanceHorizonRange=2.*TransmittanceLutHalfTexelSize.x;const float TransmittanceMaxUnoccludedU=1.-0.5*TransmittanceHorizonRange;const float TransmittanceMinOccludedU=1.+0.5*TransmittanceHorizonRange;vec2 uvToUnit(vec2 uv,vec2 domainInUVSpace,vec2 halfTexelSize) {return (uv-halfTexelSize)/domainInUVSpace;}\nvec2 unitToUV(vec2 unit,vec2 domainInUVSpace,vec2 halfTexelSize) {return unit*domainInUVSpace+halfTexelSize;}\nfloat sphereIntersectNearest(vec3 rayOrigin,vec3 rayDirection,float sphereRadius) {vec2 result=sphereIntersectFromOrigin(rayOrigin,rayDirection,sphereRadius);float c=dot(rayOrigin,rayOrigin)-sphereRadius*sphereRadius;return c>=0.0 ?\nresult.y :\nresult.x;}\nvoid moveToTopAtmosphere(\nvec3 cameraPosition,\nfloat positionRadius,\nvec3 positionGeocentricNormal,\nvec3 rayDirection,\nout bool intersectsAtmosphere,\nout vec3 cameraPositionClampedToTopOfAtmosphere) {intersectsAtmosphere=true;cameraPositionClampedToTopOfAtmosphere=cameraPosition;if (positionRadius>atmosphereRadius) {float tTop=sphereIntersectNearest(cameraPosition,rayDirection,atmosphereRadius);if (tTop>=0.0) {vec3 upOffset=-planetRadiusOffset*positionGeocentricNormal;cameraPositionClampedToTopOfAtmosphere=cameraPosition+rayDirection*tTop+upOffset;} else {intersectsAtmosphere=false;}}}\nvoid getSkyViewUVFromParameters(\nbool intersectsGround,\nfloat cosHorizonAngleFromZenith,\nfloat cosAngleBetweenViewAndZenith,\nfloat cosAngleBetweenViewAndLightOnPlane,\nout vec2 uv)\n{vec2 unit=vec2(0.0);if (intersectsGround) {float coord=(cosAngleBetweenViewAndZenith+1.0)/(cosHorizonAngleFromZenith+1.0);coord=sqrtClamped(coord); \nunit.y=0.5*coord; } else {float coord=(cosAngleBetweenViewAndZenith-cosHorizonAngleFromZenith)/(1.0-cosHorizonAngleFromZenith);coord=sqrtClamped(coord); \nunit.y=0.5*coord+0.5; }\n{float coord=0.5-0.5*cosAngleBetweenViewAndLightOnPlane;unit.x=coord;}\nuv=unitToUV(unit,SkyViewLutDomainInUVSpace,SkyViewLutHalfTexelSize);}\nvec4 sampleSkyViewLut(\nsampler2D skyViewLut,\nfloat positionRadius,\nvec3 geocentricNormal,\nvec3 rayDirection,\nvec3 directionToLight,\nfloat cosHorizonAngleFromZenith,\nout float cosAngleBetweenViewAndZenith,\nout bool isRayIntersectingGround) {cosAngleBetweenViewAndZenith=dot(rayDirection,geocentricNormal);if (positionRadius>atmosphereRadius) {float sinAngleBetweenViewAndNadir=sqrtClamped(1.-cosAngleBetweenViewAndZenith*cosAngleBetweenViewAndZenith);if (sinAngleBetweenViewAndNadir>sinCameraAtmosphereHorizonAngleFromNadir) {isRayIntersectingGround=false;return vec4(0.);}}\nvec3 sideVector=normalize(cross(geocentricNormal,rayDirection));vec3 forwardVector=normalize(cross(sideVector,geocentricNormal));vec2 lightOnPlane=normalize(vec2(dot(directionToLight,forwardVector),dot(directionToLight,sideVector)));float cosAngleBetweenViewAndLightOnPlane=lightOnPlane.x;float rayIntersectionScale=mix(0.95,1.,saturate((positionRadius-planetRadius)/atmosphereThickness));isRayIntersectingGround =\npositionRadius>planetRadius &&\n(rayIntersectionScale*cosAngleBetweenViewAndZenith)<=cosHorizonAngleFromZenith;vec2 uv;getSkyViewUVFromParameters(\nisRayIntersectingGround,\ncosHorizonAngleFromZenith,\ncosAngleBetweenViewAndZenith,\ncosAngleBetweenViewAndLightOnPlane,\nuv);return textureLod(skyViewLut,uv,0.);}\nfloat computeRayleighPhase(float onePlusCosThetaSq) {return 0.0596831037*onePlusCosThetaSq;}\nfloat computeMiePhaseCornetteShanks(float cosTheta,float onePlusCosThetaSq) {const float g=0.8;const float gSquared=g*g;const float oneMinusGSquared=1.-gSquared;const float onePlusGSquared=1.+gSquared;const float twoPlusGSquared=2.+gSquared;const float twoG=2.*g;const float threeOverEightPi=3./(8.*PI);return threeOverEightPi*oneMinusGSquared*onePlusCosThetaSq/(twoPlusGSquared*pow(onePlusGSquared-twoG*cosTheta,1.5));}\nfloat computeOzoneDensity(float normalizedViewHeight) {const float MinOzoneDensity=0.135;const float OneMinusMinOzoneDensity=1.-MinOzoneDensity;const float OzoneStartHeight=.15; \nconst float PeakOzoneHeight=.25;const float MaxOzoneHeight=0.6;const float InverseRampupDistance=1./(PeakOzoneHeight-OzoneStartHeight);const float InverseRampdownDistance=1./(MaxOzoneHeight-PeakOzoneHeight);float lowerAtmosphereDensity=MinOzoneDensity+OneMinusMinOzoneDensity*max(0.,normalizedViewHeight-OzoneStartHeight)*InverseRampupDistance;float sqrtUpperAtmosphereDensity=max(0.,1.-(normalizedViewHeight-PeakOzoneHeight)*InverseRampdownDistance);float upperAtmosphereDensity=sqrtUpperAtmosphereDensity*sqrtUpperAtmosphereDensity;float densityOzone=normalizedViewHeight<PeakOzoneHeight ? lowerAtmosphereDensity : upperAtmosphereDensity;return densityOzone;}\nvoid sampleMediumRGB(\nfloat viewHeight,\nout vec3 scatteringRayleigh,\nout vec3 scatteringMie,\nout vec3 extinction,\nout vec3 scattering) {float normalizedViewHeight=saturate(viewHeight*inverseAtmosphereThickness);float densityMie=exp(-83.333*normalizedViewHeight);float densityRayleigh=exp(-12.5*normalizedViewHeight);float densityOzone=computeOzoneDensity(normalizedViewHeight);scatteringRayleigh=densityRayleigh*peakRayleighScattering;scatteringMie=densityMie*peakMieScattering;scattering=scatteringMie+scatteringRayleigh;vec3 extinctionRayleigh=scatteringRayleigh;vec3 extinctionMie=densityMie*peakMieExtinction;vec3 extinctionOzone=densityOzone*peakOzoneAbsorption;extinction=extinctionRayleigh+extinctionMie+extinctionOzone;}\nvec3 computeTransmittance(vec3 rayOriginGlobal,vec3 rayDirection,float tMax,float sampleCount) {vec3 opticalDepth=vec3(0.);float t=0.;float sampleSegmentWeight=tMax/sampleCount;const float sampleSegmentT=0.3;for (float s=0.; s<sampleCount; s+=1.) {float newT=sampleSegmentWeight*(s+sampleSegmentT);float dt=newT-t;t=newT;vec3 scatteringRayleigh,scatteringMie,extinction,scattering;vec3 samplePositionGlobal=rayOriginGlobal+t*rayDirection;sampleMediumRGB(length(samplePositionGlobal)-planetRadius,scatteringRayleigh,scatteringMie,extinction,scattering);opticalDepth+=extinction*dt;}\nreturn exp(-opticalDepth);}\nvec2 getTransmittanceUV(float radius,float cosAngleLightToZenith,out float distanceToHorizon) {float radiusSquared=radius*radius;distanceToHorizon=sqrtClamped(radiusSquared-planetRadiusSquared);float cosAngleLightToZenithSquared=cosAngleLightToZenith*cosAngleLightToZenith;float discriminant=radiusSquared*(cosAngleLightToZenithSquared-1.)+atmosphereRadiusSquared;float distanceToAtmosphereEdge=max(0.,-radius*cosAngleLightToZenith+sqrtClamped(discriminant));float minDistanceToAtmosphereEdge=max(0.,atmosphereRadius-radius);float maxDistanceToAtmosphereEdge=distanceToHorizon+horizonDistanceToAtmosphereEdge;float cosAngleLightToZenithCoordinate=(distanceToAtmosphereEdge-minDistanceToAtmosphereEdge)/max(0.000001,maxDistanceToAtmosphereEdge-minDistanceToAtmosphereEdge);float distanceToHorizonCoordinate=distanceToHorizon/max(0.000001,horizonDistanceToAtmosphereEdge);vec2 unit=vec2(cosAngleLightToZenithCoordinate,distanceToHorizonCoordinate);return unit*TransmittanceLutDomainInUVSpace+TransmittanceLutHalfTexelSize; }\nvec4 sampleTransmittanceLut(sampler2D transmittanceLut,float positionRadius,float cosAngleLightToZenith) {float distanceToHorizon;vec2 uv=getTransmittanceUV(positionRadius,cosAngleLightToZenith,distanceToHorizon);float weight=smoothstep(TransmittanceMinOccludedU,TransmittanceMaxUnoccludedU,uv.x);return weight*textureLod(transmittanceLut,uv,0.);}\nvec3 sampleMultiScatteringLut(sampler2D multiScatteringLut,float radius,float cosAngleLightToZenith) {vec2 unit=vec2(0.5+0.5*cosAngleLightToZenith,(radius-planetRadius)/atmosphereThickness);vec2 uv=unitToUV(unit,MultiScatteringLutDomainInUVSpace,MultiScatteringLutHalfTexelSize);vec3 multiScattering=textureLod(multiScatteringLut,uv,0.).rgb;return max(minMultiScattering,multiScattering);}\nconst float uniformPhase=RECIPROCAL_PI4;void integrateScatteredRadiance(\nbool isAerialPerspectiveLut,\nfloat lightIntensity,\nsampler2D transmittanceLut,\n#ifndef COMPUTE_MULTI_SCATTERING\nsampler2D multiScatteringLut,\nfloat multiScatteringIntensity,\n#endif\nvec3 rayOriginGlobal,\nvec3 rayDirection,\nvec3 directionToLight,\nfloat tMaxMax,\nfloat sampleCount,\nfloat distanceToSurface,\nout vec3 radiance,\nout vec3 transmittance\n#if COMPUTE_MULTI_SCATTERING\n,out vec3 multiScattering\n#endif\n) {radiance=vec3(0.);transmittance=vec3(1.);\n#if COMPUTE_MULTI_SCATTERING\nmultiScattering=vec3(0.);\n#endif\nfloat tBottom=sphereIntersectNearest(rayOriginGlobal,rayDirection,planetRadius);float tTop=sphereIntersectNearest(rayOriginGlobal,rayDirection,atmosphereRadius);float tMax=0.;if (tBottom<0.) {if (tTop<0.) {return;} else {tMax=tTop;}} else {if (tTop>0.) {if (isAerialPerspectiveLut) {tMax=tTop;} else {tMax=min(tBottom,tTop);}}}\nif (distanceToSurface>0. && distanceToSurface<tMax) {tMax=distanceToSurface;}\ntMax=min(tMax,tMaxMax);\n#ifndef COMPUTE_MULTI_SCATTERING\nfloat cosTheta=dot(rayDirection,directionToLight);float onePlusCosThetaSq=1.+cosTheta*cosTheta;float rayleighPhase=computeRayleighPhase(onePlusCosThetaSq);float miePhase=computeMiePhaseCornetteShanks(cosTheta,onePlusCosThetaSq);\n#endif\nfloat transmittanceScale=isAerialPerspectiveLut ? aerialPerspectiveTransmittanceScale : 1.;float t=0.;float sampleSegmentWeight=tMax/sampleCount;const float sampleSegmentT=0.3;for (float s=0.; s<sampleCount; s+=1.) {float newT=sampleSegmentWeight*(s+sampleSegmentT);float dt=newT-t;t=newT;vec3 samplePositionGlobal=rayOriginGlobal+t*rayDirection;float sampleRadiusGlobal=length(samplePositionGlobal);vec3 sampleGeocentricNormal=samplePositionGlobal/sampleRadiusGlobal;float sampleCosAngleLightToZenith=dot(directionToLight,sampleGeocentricNormal);vec3 scatteringRayleigh,scatteringMie,extinction,scattering;sampleMediumRGB(sampleRadiusGlobal-planetRadius,scatteringRayleigh,scatteringMie,extinction,scattering);vec3 transmittanceToLight=sampleTransmittanceLut(transmittanceLut,sampleRadiusGlobal,sampleCosAngleLightToZenith).rgb;\n#if COMPUTE_MULTI_SCATTERING\nvec3 phaseTimesScattering=uniformPhase*scattering;vec3 S=transmittanceToLight*phaseTimesScattering;\n#else\nvec3 phaseTimesScattering=scatteringMie*miePhase+scatteringRayleigh*rayleighPhase;vec3 multiScatteredRadiance=sampleMultiScatteringLut(multiScatteringLut,sampleRadiusGlobal,sampleCosAngleLightToZenith);vec3 S=transmittanceScale*transmittanceToLight*phaseTimesScattering+multiScatteringIntensity*multiScatteredRadiance*scattering;\n#endif\nvec3 sampleOpticalDepth=extinction*dt;vec3 sampleTransmittance=exp(-sampleOpticalDepth);vec3 clampedExtinction=max(vec3(0.0000001),extinction);vec3 SInt=(S-S*sampleTransmittance)/clampedExtinction;radiance+=transmittance*SInt;\n#if COMPUTE_MULTI_SCATTERING\nvec3 MSInt=(scattering-scattering*sampleTransmittance)/clampedExtinction;multiScattering+=transmittance*MSInt;\n#endif\ntransmittance*=sampleTransmittance;}\n#if USE_GROUND_ALBEDO\nif (tMax==tBottom && tBottom>0.) {vec3 planetPos=rayOriginGlobal+tBottom*rayDirection;float planetPosRadius=length(planetPos);vec3 planetPosGeocentricNormal=planetPos/planetPosRadius;float nDotL=dot(directionToLight,planetPosGeocentricNormal);vec3 lightTransmittance=sampleTransmittanceLut(transmittanceLut,planetPosRadius,nDotL).rgb;const float diffuseBrdf=RECIPROCAL_PI;radiance+=lightTransmittance*transmittance*groundAlbedo*(nDotL*diffuseBrdf);}\n#endif\nradiance*=lightIntensity;}\nfloat layerIdxToAerialPerspectiveLayer(float layerIdx) {float layer=(layerIdx+1.)/NumAerialPerspectiveLutLayers;layer*=layer; \nlayer*=NumAerialPerspectiveLutLayers;return layer;}\nfloat toAerialPerspectiveDepth(float layer) {return layer*AerialPerspectiveLutKMPerSlice;}\nfloat toAerialPerspectiveLayer(float distance,float aerialPerspectiveLutDistancePerSlice) {return distance/aerialPerspectiveLutDistancePerSlice;}\nvec4 applyAerialPerspectiveSaturation(vec4 aerialPerspective) {float previousRadiance=getLuminance(aerialPerspective.rgb);aerialPerspective.rgb=mix(vec3(previousRadiance),aerialPerspective.rgb,aerialPerspectiveSaturation);return aerialPerspective;}\nvec4 applyAerialPerspectiveIntensity(vec4 aerialPerspective) {\n#if APPLY_AERIAL_PERSPECTIVE_INTENSITY\nif (aerialPerspectiveIntensity==0.) {aerialPerspective=vec4(0.);} else {float previousAlpha=aerialPerspective.a;aerialPerspective/=max(0.00001,previousAlpha);aerialPerspective*=pow(previousAlpha,1./aerialPerspectiveIntensity);}\n#endif\nreturn aerialPerspective;}\nvec4 applyAerialPerspectiveRadianceBias(vec4 aerialPerspective) {\n#if APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\nfloat originalRadiance=dot(aerialPerspective.rgb,LuminanceEncodeApprox);float targetRadiance=originalRadiance+aerialPerspectiveRadianceBias;if (originalRadiance>0.) {aerialPerspective*=max(0.,targetRadiance/originalRadiance);} else {aerialPerspective=max(vec4(0.),vec4(vec3(aerialPerspectiveRadianceBias),aerialPerspectiveRadianceBias));}\naerialPerspective.a=min(aerialPerspective.a,1.);\n#endif\nreturn aerialPerspective;}\nbool sampleAerialPerspectiveLut(\nvec2 screenUV,\nbool clampToLutRange,\nfloat distanceFromCamera,\nfloat numAerialPerspectiveLutLayers,\nfloat aerialPerspectiveLutKMPerSlice,\nfloat aerialPerspectiveLutRangeKM,\nout vec4 aerialPerspective) {aerialPerspective=vec4(0.);\n#if USE_AERIAL_PERSPECTIVE_LUT\nif (distanceFromCamera>0. &&\n(clampToLutRange || distanceFromCamera<aerialPerspectiveLutRangeKM) &&\nclampedCameraRadius<=atmosphereRadius) {float layer=toAerialPerspectiveLayer(distanceFromCamera,aerialPerspectiveLutKMPerSlice);float normalizedLayer=sqrt(layer/numAerialPerspectiveLutLayers); \nlayer=min(normalizedLayer*numAerialPerspectiveLutLayers,numAerialPerspectiveLutLayers);float weight=min(layer,1.);float layerIdx=max(0.,layer-1.);float floorLayerIdx=floor(layerIdx);vec4 aerialPerspectiveLayer0=textureLod(aerialPerspectiveLut,vec3(screenUV,floorLayerIdx),0.);vec4 aerialPerspectiveLayer1=textureLod(aerialPerspectiveLut,vec3(screenUV,floorLayerIdx+1.),0.);aerialPerspective=mix(aerialPerspectiveLayer0,aerialPerspectiveLayer1,layerIdx-floorLayerIdx);aerialPerspective.rgb*=atmosphereExposure;aerialPerspective=applyAerialPerspectiveSaturation(aerialPerspective);aerialPerspective=weight*applyAerialPerspectiveIntensity(aerialPerspective);aerialPerspective=applyAerialPerspectiveRadianceBias(aerialPerspective);return true;}\n#endif\nreturn false;}\n#if RENDER_TRANSMITTANCE\nvoid getTransmittanceParameters(vec2 uv,out float radius,out float cosAngleLightToZenith,out float distanceToAtmosphereEdge) {vec2 unit=uvToUnit(uv,TransmittanceLutDomainInUVSpace,TransmittanceLutHalfTexelSize);float distanceToHorizon=unit.y*horizonDistanceToAtmosphereEdge;float distanceToHorizonSquared=distanceToHorizon*distanceToHorizon;radius=sqrtClamped(distanceToHorizonSquared+planetRadiusSquared);float minDistanceToAtmosphereEdge=atmosphereRadius-radius;float maxDistanceToAtmosphereEdge=distanceToHorizon+horizonDistanceToAtmosphereEdge;distanceToAtmosphereEdge=minDistanceToAtmosphereEdge+unit.x*(maxDistanceToAtmosphereEdge-minDistanceToAtmosphereEdge);float distanceToAtmosphereEdgeSquared=distanceToAtmosphereEdge*distanceToAtmosphereEdge;cosAngleLightToZenith =\ndistanceToAtmosphereEdge<=0. ?\n1. :\n(horizonDistanceToAtmosphereEdgeSquared-distanceToAtmosphereEdgeSquared-distanceToHorizonSquared)/(2.*radius*distanceToAtmosphereEdge);cosAngleLightToZenith=clamp(cosAngleLightToZenith,-1.,1.);}\nvec4 renderTransmittance(vec2 uv) {float radius,cosAngleLightToZenith,distanceToAtmosphereEdgeAlongAngle;getTransmittanceParameters(uv,radius,cosAngleLightToZenith,distanceToAtmosphereEdgeAlongAngle);float sinAngleLightToZenith=sqrtClamped(1.-cosAngleLightToZenith*cosAngleLightToZenith);vec3 directionToLight=normalize(vec3(0.,cosAngleLightToZenith,sinAngleLightToZenith));vec3 transmittance=computeTransmittance(vec3(0.,radius,0.),directionToLight,distanceToAtmosphereEdgeAlongAngle,TransmittanceSampleCount);return vec4(transmittance,avg(transmittance));}\n#endif\n#if RENDER_MULTI_SCATTERING\nvec3 getSphereSample(float azimuth,float inclination,out float sinInclination) {sinInclination=sin(inclination);return vec3(sinInclination*sin(azimuth),cos(inclination),sinInclination*cos(azimuth));}\nconst float MultiScatteringInclinationSampleCount=8.;const float MultiScatteringAzimuthSampleCount=2.*MultiScatteringInclinationSampleCount;const float MultiScatteringLutSampleCount=64.;const float MultiScatteringAzimuthIterationAngle=TWO_PI/MultiScatteringAzimuthSampleCount;const float MultiScatteringInclinationIterationAngle=PI/MultiScatteringInclinationSampleCount;const float MultiScatteringAngleStepProduct=MultiScatteringAzimuthIterationAngle*MultiScatteringInclinationIterationAngle;vec4 renderMultiScattering(vec2 uv,sampler2D transmittanceLut) {vec2 unit=uvToUnit(uv,MultiScatteringLutDomainInUVSpace,MultiScatteringLutHalfTexelSize);float cosAngleLightToZenith=2.*unit.x-1.;float sinAngleLightToZenith=sqrtClamped(1.-cosAngleLightToZenith*cosAngleLightToZenith);vec3 directionToLight=normalize(vec3(0.,cosAngleLightToZenith,sinAngleLightToZenith));float rayOriginRadius=planetRadius+max(unit.y,0.001)*atmosphereThickness;vec3 rayOrigin=vec3(0.,rayOriginRadius,0.);vec3 inscattered=vec3(0.);vec3 multiScatteringTotal=vec3(0.);for (float i=0.5; i<MultiScatteringAzimuthSampleCount; ++i) {float azimuth=MultiScatteringAzimuthIterationAngle*i;for (float j=0.5; j<MultiScatteringInclinationSampleCount; ++j) {float inclination=MultiScatteringInclinationIterationAngle*j;float sinInclination;vec3 rayDirection=getSphereSample(azimuth,inclination,sinInclination);vec3 radiance;vec3 transmittance;vec3 multiScattering;integrateScatteredRadiance(\nfalse,\n1.,\ntransmittanceLut,\nrayOrigin,\nrayDirection,\ndirectionToLight,\n100000000.,\nMultiScatteringLutSampleCount,\n-1.,\nradiance,\ntransmittance,\nmultiScattering);float weight=RECIPROCAL_PI4*abs(sinInclination)*MultiScatteringAngleStepProduct;multiScatteringTotal+=multiScattering*weight;inscattered+=radiance*weight;}}\nvec3 multiScattering=inscattered/max(vec3(0.000001),vec3(1.)-multiScatteringTotal);return vec4(multiScattering,1.);}\n#endif\n#if RENDER_SKY_VIEW\nfloat computeCosHorizonAngleFromZenith(float radius) {float sinAngleBetweenHorizonAndNadir=min(1.,planetRadius/radius);float cosHorizonAngleFromNadir=sqrt(1.-sinAngleBetweenHorizonAndNadir*sinAngleBetweenHorizonAndNadir);float cosHorizonAngleFromZenith=-cosHorizonAngleFromNadir;return cosHorizonAngleFromZenith;}\nvoid getSkyViewParametersFromUV(\nfloat radius,\nvec2 uv,\nout float cosAngleBetweenViewAndZenith,\nout float cosAngleBetweenViewAndLightOnPlane) {vec2 unit=uvToUnit(uv,SkyViewLutDomainInUVSpace,SkyViewLutHalfTexelSize);float cosHorizonAngleFromZenith=computeCosHorizonAngleFromZenith(radius);if (unit.y<0.5) {float coord=2.*unit.y; \ncoord*=coord; \ncosAngleBetweenViewAndZenith=mix(-1.,cosHorizonAngleFromZenith,coord); } else {float coord=2.*unit.y-1.; \ncoord*=coord; \ncosAngleBetweenViewAndZenith=mix(cosHorizonAngleFromZenith,1.,coord); }\n{float coord=unit.x;cosAngleBetweenViewAndLightOnPlane=1.-2.*coord;}}\nvec4 renderSkyView(vec2 uv,sampler2D transmittanceLut,sampler2D multiScatteringLut) {float cosAngleBetweenViewAndZenith;float cosAngleBetweenViewAndLightOnPlane;getSkyViewParametersFromUV(clampedCameraRadius,uv,cosAngleBetweenViewAndZenith,cosAngleBetweenViewAndLightOnPlane);float sinAngleBetweenViewAndZenith=sqrtClamped(1.-cosAngleBetweenViewAndZenith*cosAngleBetweenViewAndZenith);float sinAngleBetweenViewAndLightOnPlane=sqrtClamped(1.-cosAngleBetweenViewAndLightOnPlane*cosAngleBetweenViewAndLightOnPlane);vec3 rayDirection =\nvec3(\nsinAngleBetweenViewAndZenith*cosAngleBetweenViewAndLightOnPlane,\ncosAngleBetweenViewAndZenith,\nsinAngleBetweenViewAndZenith*sinAngleBetweenViewAndLightOnPlane);bool intersectsAtmosphere=false;vec3 cameraPositionGlobalClampedToTopOfAtmosphere=vec3(0.);moveToTopAtmosphere(\nvec3(0.,clampedCameraRadius,0.),\nclampedCameraRadius,\nvec3(0.,1.,0.),\nrayDirection,\nintersectsAtmosphere,\ncameraPositionGlobalClampedToTopOfAtmosphere);if (!intersectsAtmosphere) {return vec4(0.);}\nvec3 transmittance;vec3 radiance;integrateScatteredRadiance(\nfalse,\natmosphereExposure*lightIntensity,\ntransmittanceLut,\nmultiScatteringLut,\nmultiScatteringIntensity,\ncameraPositionGlobalClampedToTopOfAtmosphere,\nrayDirection,\ndirectionToLightRelativeToCameraGeocentricNormal,\n100000000.,\nSkyViewLutSampleCount,\n-1.,\nradiance,\ntransmittance);float transparency=1.-avg(transmittance);return vec4(radiance,transparency);}\n#endif\n#if RENDER_CAMERA_VOLUME\nvec4 renderCameraVolume(\nvec3 positionOnNearPlane,\nfloat layerIdx,\nsampler2D transmittanceLut,\nsampler2D multiScatteringLut) {vec4 result=vec4(0.);vec3 rayDirection=normalize(positionOnNearPlane);float layer=layerIdxToAerialPerspectiveLayer(layerIdx);float tMax=toAerialPerspectiveDepth(layer);float tMaxMax=tMax;vec3 cameraPositionGlobalClampedToTopOfAtmosphere=clampedCameraPositionGlobal;if (clampedCameraRadius>=atmosphereRadius) {bool intersectsAtmosphere=false;moveToTopAtmosphere(\nclampedCameraPositionGlobal,\nclampedCameraRadius,\ncameraGeocentricNormal,\nrayDirection,\nintersectsAtmosphere,\ncameraPositionGlobalClampedToTopOfAtmosphere);if (!intersectsAtmosphere) {return result;}\nfloat distanceToAtmosphere=distance(clampedCameraPositionGlobal,cameraPositionGlobalClampedToTopOfAtmosphere);if (tMaxMax<distanceToAtmosphere) {return result;}\ntMaxMax=max(0.,tMaxMax-distanceToAtmosphere);}\nfloat sampleCount=min(SkyViewLutSampleCount,2.*layer+2.);vec3 transmittance;vec3 radiance;integrateScatteredRadiance(\ntrue,\nlightIntensity,\ntransmittanceLut,\nmultiScatteringLut,\nmultiScatteringIntensity,\ncameraPositionGlobalClampedToTopOfAtmosphere,\nrayDirection,\ndirectionToLight,\ntMaxMax,\nsampleCount,\n-1.,\nradiance,\ntransmittance);float transparency=1.-avg(transmittance);result=vec4(radiance,transparency);return result;}\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const atmosphereFunctions = { name, shader };\n"]}
|
|
1
|
+
{"version":3,"file":"atmosphereFunctions.js","sourceRoot":"","sources":["../../../../../../dev/addons/src/atmosphere/Shaders/ShadersInclude/atmosphereFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,+CAAiC;AACvD,yEAA2D;AAE3D,MAAM,IAAI,GAAG,qBAAqB,CAAC;AACnC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Nd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\nimport \"core/Shaders/ShadersInclude/intersectionFunctions\";\n\nconst name = \"atmosphereFunctions\";\nconst shader = `#include<intersectionFunctions>\nconst vec2 MultiScatteringLutSize=vec2(32.0,32.0);const vec2 MultiScatteringLutDomainInUVSpace=(MultiScatteringLutSize-vec2(1.0))/MultiScatteringLutSize;const vec2 MultiScatteringLutHalfTexelSize=vec2(0.5)/MultiScatteringLutSize;const float NumAerialPerspectiveLutLayers=32.0;const vec3 AerialPerspectiveLutSize=vec3(16.0,64.0,NumAerialPerspectiveLutLayers);const vec2 DiffuseSkyIrradianceLutSize=vec2(64.0,16.0);const vec2 DiffuseSkyIrradianceLutDomainInUVSpace=(DiffuseSkyIrradianceLutSize-vec2(1.0))/DiffuseSkyIrradianceLutSize;const vec2 DiffuseSkyIrradianceLutHalfTexelSize=vec2(0.5)/DiffuseSkyIrradianceLutSize;const vec2 SkyViewLutSize=vec2(128.0,128.0);const vec2 SkyViewLutDomainInUVSpace=(SkyViewLutSize-vec2(1.0))/SkyViewLutSize;const vec2 SkyViewLutHalfTexelSize=vec2(0.5)/SkyViewLutSize;const float AerialPerspectiveLutKMPerSlice=4.0;const float AerialPerspectiveLutRangeKM=AerialPerspectiveLutKMPerSlice*NumAerialPerspectiveLutLayers;const float TransmittanceSampleCount=128.0;const float SkyViewLutSampleCount=30.0;const vec2 TransmittanceLutSize=vec2(256.,64.);const vec2 TransmittanceLutDomainInUVSpace=(TransmittanceLutSize-vec2(1.))/TransmittanceLutSize;const vec2 TransmittanceLutHalfTexelSize=vec2(0.5)/TransmittanceLutSize;const float TransmittanceHorizonRange=2.*TransmittanceLutHalfTexelSize.x;const float TransmittanceMaxUnoccludedU=1.-0.5*TransmittanceHorizonRange;const float TransmittanceMinOccludedU=1.+0.5*TransmittanceHorizonRange;vec2 uvToUnit(vec2 uv,vec2 domainInUVSpace,vec2 halfTexelSize) {return (uv-halfTexelSize)/domainInUVSpace;}\nvec2 unitToUV(vec2 unit,vec2 domainInUVSpace,vec2 halfTexelSize) {return unit*domainInUVSpace+halfTexelSize;}\nfloat sphereIntersectNearest(vec3 rayOrigin,vec3 rayDirection,float sphereRadius) {vec2 result=sphereIntersectFromOrigin(rayOrigin,rayDirection,sphereRadius);float c=dot(rayOrigin,rayOrigin)-sphereRadius*sphereRadius;return c>=0.0 ?\nresult.y :\nresult.x;}\nvoid moveToTopAtmosphere(\nvec3 cameraPosition,\nfloat positionRadius,\nvec3 positionGeocentricNormal,\nvec3 rayDirection,\nout bool intersectsAtmosphere,\nout vec3 cameraPositionClampedToTopOfAtmosphere) {intersectsAtmosphere=true;cameraPositionClampedToTopOfAtmosphere=cameraPosition;if (positionRadius>atmosphereRadius) {float tTop=sphereIntersectNearest(cameraPosition,rayDirection,atmosphereRadius);if (tTop>=0.0) {vec3 upOffset=-planetRadiusOffset*positionGeocentricNormal;cameraPositionClampedToTopOfAtmosphere=cameraPosition+rayDirection*tTop+upOffset;} else {intersectsAtmosphere=false;}}}\nvoid getSkyViewUVFromParameters(\nbool intersectsGround,\nfloat cosHorizonAngleFromZenith,\nfloat cosAngleBetweenViewAndZenith,\nfloat cosAngleBetweenViewAndLightOnPlane,\nout vec2 uv)\n{vec2 unit=vec2(0.0);if (intersectsGround) {float coord=(cosAngleBetweenViewAndZenith+1.0)/(cosHorizonAngleFromZenith+1.0);coord=sqrtClamped(coord); \nunit.y=0.5*coord; } else {float coord=(cosAngleBetweenViewAndZenith-cosHorizonAngleFromZenith)/(1.0-cosHorizonAngleFromZenith);coord=sqrtClamped(coord); \nunit.y=0.5*coord+0.5; }\n{float coord=0.5-0.5*cosAngleBetweenViewAndLightOnPlane;unit.x=coord;}\nuv=unitToUV(unit,SkyViewLutDomainInUVSpace,SkyViewLutHalfTexelSize);}\nvec4 sampleSkyViewLut(\nsampler2D skyViewLut,\nfloat positionRadius,\nvec3 geocentricNormal,\nvec3 rayDirection,\nvec3 directionToLight,\nfloat cosHorizonAngleFromZenith,\nout float cosAngleBetweenViewAndZenith,\nout bool isRayIntersectingGround) {cosAngleBetweenViewAndZenith=dot(rayDirection,geocentricNormal);if (positionRadius>atmosphereRadius) {float sinAngleBetweenViewAndNadir=sqrtClamped(1.-cosAngleBetweenViewAndZenith*cosAngleBetweenViewAndZenith);if (sinAngleBetweenViewAndNadir>sinCameraAtmosphereHorizonAngleFromNadir) {isRayIntersectingGround=false;return vec4(0.);}}\nvec3 sideVector=normalize(cross(geocentricNormal,rayDirection));vec3 forwardVector=normalize(cross(sideVector,geocentricNormal));vec2 lightOnPlane=normalize(vec2(dot(directionToLight,forwardVector),dot(directionToLight,sideVector)));float cosAngleBetweenViewAndLightOnPlane=lightOnPlane.x;float rayIntersectionScale=mix(0.95,1.,saturate((positionRadius-planetRadius)/atmosphereThickness));isRayIntersectingGround =\npositionRadius>planetRadius &&\n(rayIntersectionScale*cosAngleBetweenViewAndZenith)<=cosHorizonAngleFromZenith;vec2 uv;getSkyViewUVFromParameters(\nisRayIntersectingGround,\ncosHorizonAngleFromZenith,\ncosAngleBetweenViewAndZenith,\ncosAngleBetweenViewAndLightOnPlane,\nuv);return textureLod(skyViewLut,uv,0.);}\nfloat computeRayleighPhase(float onePlusCosThetaSq) {return 0.0596831037*onePlusCosThetaSq;}\nfloat computeMiePhaseCornetteShanks(float cosTheta,float onePlusCosThetaSq) {const float g=0.8;const float gSquared=g*g;const float oneMinusGSquared=1.-gSquared;const float onePlusGSquared=1.+gSquared;const float twoPlusGSquared=2.+gSquared;const float twoG=2.*g;const float threeOverEightPi=3./(8.*PI);return threeOverEightPi*oneMinusGSquared*onePlusCosThetaSq/(twoPlusGSquared*pow(onePlusGSquared-twoG*cosTheta,1.5));}\nfloat computeOzoneDensity(float normalizedViewHeight) {const float MinOzoneDensity=0.135;const float OneMinusMinOzoneDensity=1.-MinOzoneDensity;const float OzoneStartHeight=.15; \nconst float PeakOzoneHeight=.25;const float MaxOzoneHeight=0.6;const float InverseRampupDistance=1./(PeakOzoneHeight-OzoneStartHeight);const float InverseRampdownDistance=1./(MaxOzoneHeight-PeakOzoneHeight);float lowerAtmosphereDensity=MinOzoneDensity+OneMinusMinOzoneDensity*max(0.,normalizedViewHeight-OzoneStartHeight)*InverseRampupDistance;float sqrtUpperAtmosphereDensity=max(0.,1.-(normalizedViewHeight-PeakOzoneHeight)*InverseRampdownDistance);float upperAtmosphereDensity=sqrtUpperAtmosphereDensity*sqrtUpperAtmosphereDensity;float densityOzone=normalizedViewHeight<PeakOzoneHeight ? lowerAtmosphereDensity : upperAtmosphereDensity;return densityOzone;}\nvoid sampleMediumRGB(\nfloat viewHeight,\nout vec3 scatteringRayleigh,\nout vec3 scatteringMie,\nout vec3 extinction,\nout vec3 scattering) {float normalizedViewHeight=saturate(viewHeight*inverseAtmosphereThickness);float densityMie=exp(-83.333*normalizedViewHeight);float densityRayleigh=exp(-12.5*normalizedViewHeight);float densityOzone=computeOzoneDensity(normalizedViewHeight);scatteringRayleigh=densityRayleigh*peakRayleighScattering;scatteringMie=densityMie*peakMieScattering;scattering=scatteringMie+scatteringRayleigh;vec3 extinctionRayleigh=scatteringRayleigh;vec3 extinctionMie=densityMie*peakMieExtinction;vec3 extinctionOzone=densityOzone*peakOzoneAbsorption;extinction=extinctionRayleigh+extinctionMie+extinctionOzone;}\nvec3 computeTransmittance(vec3 rayOriginGlobal,vec3 rayDirection,float tMax,float sampleCount) {vec3 opticalDepth=vec3(0.);float t=0.;float sampleSegmentWeight=tMax/sampleCount;const float sampleSegmentT=0.3;for (float s=0.; s<sampleCount; s+=1.) {float newT=sampleSegmentWeight*(s+sampleSegmentT);float dt=newT-t;t=newT;vec3 scatteringRayleigh,scatteringMie,extinction,scattering;vec3 samplePositionGlobal=rayOriginGlobal+t*rayDirection;sampleMediumRGB(length(samplePositionGlobal)-planetRadius,scatteringRayleigh,scatteringMie,extinction,scattering);opticalDepth+=extinction*dt;}\nreturn exp(-opticalDepth);}\nvec2 getTransmittanceUV(float radius,float cosAngleLightToZenith,out float distanceToHorizon) {float radiusSquared=radius*radius;distanceToHorizon=sqrtClamped(radiusSquared-planetRadiusSquared);float cosAngleLightToZenithSquared=cosAngleLightToZenith*cosAngleLightToZenith;float discriminant=radiusSquared*(cosAngleLightToZenithSquared-1.)+atmosphereRadiusSquared;float distanceToAtmosphereEdge=max(0.,-radius*cosAngleLightToZenith+sqrtClamped(discriminant));float minDistanceToAtmosphereEdge=max(0.,atmosphereRadius-radius);float maxDistanceToAtmosphereEdge=distanceToHorizon+horizonDistanceToAtmosphereEdge;float cosAngleLightToZenithCoordinate=(distanceToAtmosphereEdge-minDistanceToAtmosphereEdge)/max(0.000001,maxDistanceToAtmosphereEdge-minDistanceToAtmosphereEdge);float distanceToHorizonCoordinate=distanceToHorizon/max(0.000001,horizonDistanceToAtmosphereEdge);vec2 unit=vec2(cosAngleLightToZenithCoordinate,distanceToHorizonCoordinate);return unit*TransmittanceLutDomainInUVSpace+TransmittanceLutHalfTexelSize; }\nvec4 sampleTransmittanceLut(sampler2D transmittanceLut,float positionRadius,float cosAngleLightToZenith) {float distanceToHorizon;vec2 uv=getTransmittanceUV(positionRadius,cosAngleLightToZenith,distanceToHorizon);float weight=smoothstep(TransmittanceMinOccludedU,TransmittanceMaxUnoccludedU,uv.x);return weight*textureLod(transmittanceLut,uv,0.);}\nvec3 sampleMultiScatteringLut(sampler2D multiScatteringLut,float radius,float cosAngleLightToZenith) {vec2 unit=vec2(0.5+0.5*cosAngleLightToZenith,(radius-planetRadius)/atmosphereThickness);vec2 uv=unitToUV(unit,MultiScatteringLutDomainInUVSpace,MultiScatteringLutHalfTexelSize);vec3 multiScattering=textureLod(multiScatteringLut,uv,0.).rgb;return max(minMultiScattering,multiScattering);}\nconst float uniformPhase=RECIPROCAL_PI4;void integrateScatteredRadiance(\nbool isAerialPerspectiveLut,\nfloat lightIntensity,\nsampler2D transmittanceLut,\n#ifndef COMPUTE_MULTI_SCATTERING\nsampler2D multiScatteringLut,\nfloat multiScatteringIntensity,\n#endif\nvec3 rayOriginGlobal,\nvec3 rayDirection,\nvec3 directionToLight,\nfloat tMaxMax,\nfloat sampleCount,\nfloat distanceToSurface,\nout vec3 radiance,\nout vec3 transmittance\n#if COMPUTE_MULTI_SCATTERING\n,out vec3 multiScattering\n#endif\n) {radiance=vec3(0.);transmittance=vec3(1.);\n#if COMPUTE_MULTI_SCATTERING\nmultiScattering=vec3(0.);\n#endif\nfloat tBottom=sphereIntersectNearest(rayOriginGlobal,rayDirection,planetRadius);float tTop=sphereIntersectNearest(rayOriginGlobal,rayDirection,atmosphereRadius);float tMax=0.;if (tBottom<0.) {if (tTop<0.) {return;} else {tMax=tTop;}} else {if (tTop>0.) {if (isAerialPerspectiveLut) {tMax=tTop;} else {tMax=min(tBottom,tTop);}}}\nif (distanceToSurface>0. && distanceToSurface<tMax) {tMax=distanceToSurface;}\ntMax=min(tMax,tMaxMax);\n#ifndef COMPUTE_MULTI_SCATTERING\nfloat cosTheta=dot(rayDirection,directionToLight);float onePlusCosThetaSq=1.+cosTheta*cosTheta;float rayleighPhase=computeRayleighPhase(onePlusCosThetaSq);float miePhase=computeMiePhaseCornetteShanks(cosTheta,onePlusCosThetaSq);\n#endif\nfloat transmittanceScale=isAerialPerspectiveLut ? aerialPerspectiveTransmittanceScale : 1.;float t=0.;float sampleSegmentWeight=tMax/sampleCount;const float sampleSegmentT=0.3;for (float s=0.; s<sampleCount; s+=1.) {float newT=sampleSegmentWeight*(s+sampleSegmentT);float dt=newT-t;t=newT;vec3 samplePositionGlobal=rayOriginGlobal+t*rayDirection;float sampleRadiusGlobal=length(samplePositionGlobal);vec3 sampleGeocentricNormal=samplePositionGlobal/sampleRadiusGlobal;float sampleCosAngleLightToZenith=dot(directionToLight,sampleGeocentricNormal);vec3 scatteringRayleigh,scatteringMie,extinction,scattering;sampleMediumRGB(sampleRadiusGlobal-planetRadius,scatteringRayleigh,scatteringMie,extinction,scattering);vec3 transmittanceToLight=sampleTransmittanceLut(transmittanceLut,sampleRadiusGlobal,sampleCosAngleLightToZenith).rgb;\n#if COMPUTE_MULTI_SCATTERING\nvec3 phaseTimesScattering=uniformPhase*scattering;vec3 S=transmittanceToLight*phaseTimesScattering;\n#else\nvec3 phaseTimesScattering=scatteringMie*miePhase+scatteringRayleigh*rayleighPhase;vec3 multiScatteredRadiance=sampleMultiScatteringLut(multiScatteringLut,sampleRadiusGlobal,sampleCosAngleLightToZenith);vec3 S=transmittanceScale*transmittanceToLight*phaseTimesScattering+multiScatteringIntensity*multiScatteredRadiance*scattering;\n#endif\nvec3 sampleOpticalDepth=extinction*dt;vec3 sampleTransmittance=exp(-sampleOpticalDepth);vec3 clampedExtinction=max(vec3(0.0000001),extinction);vec3 SInt=(S-S*sampleTransmittance)/clampedExtinction;radiance+=transmittance*SInt;\n#if COMPUTE_MULTI_SCATTERING\nvec3 MSInt=(scattering-scattering*sampleTransmittance)/clampedExtinction;multiScattering+=transmittance*MSInt;\n#endif\ntransmittance*=sampleTransmittance;}\n#if USE_GROUND_ALBEDO\nif (tMax==tBottom && tBottom>0.) {vec3 planetPos=rayOriginGlobal+tBottom*rayDirection;float planetPosRadius=length(planetPos);vec3 planetPosGeocentricNormal=planetPos/planetPosRadius;float nDotL=dot(directionToLight,planetPosGeocentricNormal);vec3 lightTransmittance=sampleTransmittanceLut(transmittanceLut,planetPosRadius,nDotL).rgb;const float diffuseBrdf=RECIPROCAL_PI;radiance+=lightTransmittance*transmittance*groundAlbedo*(nDotL*diffuseBrdf);}\n#endif\nradiance*=lightIntensity;}\nfloat layerIdxToAerialPerspectiveLayer(float layerIdx) {float layer=(layerIdx+1.)/NumAerialPerspectiveLutLayers;layer*=layer; \nlayer*=NumAerialPerspectiveLutLayers;return layer;}\nfloat toAerialPerspectiveDepth(float layer) {return layer*AerialPerspectiveLutKMPerSlice;}\nfloat toAerialPerspectiveLayer(float distance,float aerialPerspectiveLutDistancePerSlice) {return distance/aerialPerspectiveLutDistancePerSlice;}\nvec4 applyAerialPerspectiveSaturation(vec4 aerialPerspective) {float previousRadiance=getLuminance(aerialPerspective.rgb);aerialPerspective.rgb=mix(vec3(previousRadiance),aerialPerspective.rgb,aerialPerspectiveSaturation);return aerialPerspective;}\nvec4 applyAerialPerspectiveIntensity(vec4 aerialPerspective) {\n#if APPLY_AERIAL_PERSPECTIVE_INTENSITY\nif (aerialPerspectiveIntensity==0.) {aerialPerspective=vec4(0.);} else {float previousAlpha=aerialPerspective.a;aerialPerspective/=max(0.00001,previousAlpha);aerialPerspective*=pow(previousAlpha,1./aerialPerspectiveIntensity);}\n#endif\nreturn aerialPerspective;}\nvec4 applyAerialPerspectiveRadianceBias(vec4 aerialPerspective) {\n#if APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\nfloat originalRadiance=dot(aerialPerspective.rgb,LuminanceEncodeApprox);float targetRadiance=originalRadiance+aerialPerspectiveRadianceBias;if (originalRadiance>0.) {aerialPerspective*=max(0.,targetRadiance/originalRadiance);} else {aerialPerspective=max(vec4(0.),vec4(vec3(aerialPerspectiveRadianceBias),aerialPerspectiveRadianceBias));}\naerialPerspective.a=min(aerialPerspective.a,1.);\n#endif\nreturn aerialPerspective;}\nbool sampleAerialPerspectiveLut(\nvec2 screenUV,\nbool clampToLutRange,\nfloat distanceFromCamera,\nfloat numAerialPerspectiveLutLayers,\nfloat aerialPerspectiveLutKMPerSlice,\nfloat aerialPerspectiveLutRangeKM,\nout vec4 aerialPerspective) {aerialPerspective=vec4(0.);\n#if USE_AERIAL_PERSPECTIVE_LUT\nif (distanceFromCamera>0. &&\n(clampToLutRange || distanceFromCamera<aerialPerspectiveLutRangeKM) &&\nclampedCameraRadius<=atmosphereRadius) {float layer=toAerialPerspectiveLayer(distanceFromCamera,aerialPerspectiveLutKMPerSlice);float normalizedLayer=sqrt(layer/numAerialPerspectiveLutLayers); \nlayer=min(normalizedLayer*numAerialPerspectiveLutLayers,numAerialPerspectiveLutLayers);float weight=min(layer,1.);float layerIdx=max(0.,layer-1.);float floorLayerIdx=floor(layerIdx);vec4 aerialPerspectiveLayer0=textureLod(aerialPerspectiveLut,vec3(screenUV,floorLayerIdx),0.);vec4 aerialPerspectiveLayer1=textureLod(aerialPerspectiveLut,vec3(screenUV,floorLayerIdx+1.),0.);aerialPerspective=mix(aerialPerspectiveLayer0,aerialPerspectiveLayer1,layerIdx-floorLayerIdx);aerialPerspective.rgb*=atmosphereExposure;aerialPerspective=applyAerialPerspectiveSaturation(aerialPerspective);aerialPerspective=weight*applyAerialPerspectiveIntensity(aerialPerspective);aerialPerspective=applyAerialPerspectiveRadianceBias(aerialPerspective);return true;}\n#endif\nreturn false;}\n#if RENDER_TRANSMITTANCE\nvoid getTransmittanceParameters(vec2 uv,out float radius,out float cosAngleLightToZenith,out float distanceToAtmosphereEdge) {vec2 unit=uvToUnit(uv,TransmittanceLutDomainInUVSpace,TransmittanceLutHalfTexelSize);float distanceToHorizon=unit.y*horizonDistanceToAtmosphereEdge;float distanceToHorizonSquared=distanceToHorizon*distanceToHorizon;radius=sqrtClamped(distanceToHorizonSquared+planetRadiusSquared);float minDistanceToAtmosphereEdge=atmosphereRadius-radius;float maxDistanceToAtmosphereEdge=distanceToHorizon+horizonDistanceToAtmosphereEdge;distanceToAtmosphereEdge=minDistanceToAtmosphereEdge+unit.x*(maxDistanceToAtmosphereEdge-minDistanceToAtmosphereEdge);float distanceToAtmosphereEdgeSquared=distanceToAtmosphereEdge*distanceToAtmosphereEdge;cosAngleLightToZenith =\ndistanceToAtmosphereEdge<=0. ?\n1. :\n(horizonDistanceToAtmosphereEdgeSquared-distanceToAtmosphereEdgeSquared-distanceToHorizonSquared)/(2.*radius*distanceToAtmosphereEdge);cosAngleLightToZenith=clamp(cosAngleLightToZenith,-1.,1.);}\nvec4 renderTransmittance(vec2 uv) {float radius,cosAngleLightToZenith,distanceToAtmosphereEdgeAlongAngle;getTransmittanceParameters(uv,radius,cosAngleLightToZenith,distanceToAtmosphereEdgeAlongAngle);float sinAngleLightToZenith=sqrtClamped(1.-cosAngleLightToZenith*cosAngleLightToZenith);vec3 directionToLight=normalize(vec3(0.,cosAngleLightToZenith,sinAngleLightToZenith));vec3 transmittance=computeTransmittance(vec3(0.,radius,0.),directionToLight,distanceToAtmosphereEdgeAlongAngle,TransmittanceSampleCount);return vec4(transmittance,avg(transmittance));}\n#endif\n#if RENDER_MULTI_SCATTERING\nvec3 getSphereSample(float azimuth,float inclination,out float sinInclination) {sinInclination=sin(inclination);return vec3(sinInclination*sin(azimuth),cos(inclination),sinInclination*cos(azimuth));}\nconst float MultiScatteringInclinationSampleCount=8.;const float MultiScatteringAzimuthSampleCount=2.*MultiScatteringInclinationSampleCount;const float MultiScatteringLutSampleCount=64.;const float MultiScatteringAzimuthIterationAngle=TWO_PI/MultiScatteringAzimuthSampleCount;const float MultiScatteringInclinationIterationAngle=PI/MultiScatteringInclinationSampleCount;const float MultiScatteringAngleStepProduct=MultiScatteringAzimuthIterationAngle*MultiScatteringInclinationIterationAngle;vec4 renderMultiScattering(vec2 uv,sampler2D transmittanceLut) {vec2 unit=uvToUnit(uv,MultiScatteringLutDomainInUVSpace,MultiScatteringLutHalfTexelSize);float cosAngleLightToZenith=2.*unit.x-1.;float sinAngleLightToZenith=sqrtClamped(1.-cosAngleLightToZenith*cosAngleLightToZenith);vec3 directionToLight=normalize(vec3(0.,cosAngleLightToZenith,sinAngleLightToZenith));float rayOriginRadius=planetRadius+max(unit.y,0.001)*atmosphereThickness;vec3 rayOrigin=vec3(0.,rayOriginRadius,0.);vec3 inscattered=vec3(0.);vec3 multiScatteringTotal=vec3(0.);for (float i=0.5; i<MultiScatteringAzimuthSampleCount; ++i) {float azimuth=MultiScatteringAzimuthIterationAngle*i;for (float j=0.5; j<MultiScatteringInclinationSampleCount; ++j) {float inclination=MultiScatteringInclinationIterationAngle*j;float sinInclination;vec3 rayDirection=getSphereSample(azimuth,inclination,sinInclination);vec3 radiance;vec3 transmittance;vec3 multiScattering;integrateScatteredRadiance(\nfalse,\n1.,\ntransmittanceLut,\nrayOrigin,\nrayDirection,\ndirectionToLight,\n100000000.,\nMultiScatteringLutSampleCount,\n-1.,\nradiance,\ntransmittance,\nmultiScattering);float weight=RECIPROCAL_PI4*abs(sinInclination)*MultiScatteringAngleStepProduct;multiScatteringTotal+=multiScattering*weight;inscattered+=radiance*weight;}}\nvec3 multiScattering=inscattered/max(vec3(0.000001),vec3(1.)-multiScatteringTotal);return vec4(multiScattering,1.);}\n#endif\nfloat computeCosHorizonAngleFromZenith(float radius) {float sinAngleBetweenHorizonAndNadir=min(1.,planetRadius/radius);float cosHorizonAngleFromNadir=sqrt(1.-sinAngleBetweenHorizonAndNadir*sinAngleBetweenHorizonAndNadir);float cosHorizonAngleFromZenith=-cosHorizonAngleFromNadir;return cosHorizonAngleFromZenith;}\n#if RENDER_SKY_VIEW\nvoid getSkyViewParametersFromUV(\nfloat radius,\nvec2 uv,\nout float cosAngleBetweenViewAndZenith,\nout float cosAngleBetweenViewAndLightOnPlane) {vec2 unit=uvToUnit(uv,SkyViewLutDomainInUVSpace,SkyViewLutHalfTexelSize);float cosHorizonAngleFromZenith=computeCosHorizonAngleFromZenith(radius);if (unit.y<0.5) {float coord=2.*unit.y; \ncoord*=coord; \ncosAngleBetweenViewAndZenith=mix(-1.,cosHorizonAngleFromZenith,coord); } else {float coord=2.*unit.y-1.; \ncoord*=coord; \ncosAngleBetweenViewAndZenith=mix(cosHorizonAngleFromZenith,1.,coord); }\n{float coord=unit.x;cosAngleBetweenViewAndLightOnPlane=1.-2.*coord;}}\nvec4 renderSkyView(vec2 uv,sampler2D transmittanceLut,sampler2D multiScatteringLut) {float cosAngleBetweenViewAndZenith;float cosAngleBetweenViewAndLightOnPlane;getSkyViewParametersFromUV(clampedCameraRadius,uv,cosAngleBetweenViewAndZenith,cosAngleBetweenViewAndLightOnPlane);float sinAngleBetweenViewAndZenith=sqrtClamped(1.-cosAngleBetweenViewAndZenith*cosAngleBetweenViewAndZenith);float sinAngleBetweenViewAndLightOnPlane=sqrtClamped(1.-cosAngleBetweenViewAndLightOnPlane*cosAngleBetweenViewAndLightOnPlane);vec3 rayDirection =\nvec3(\nsinAngleBetweenViewAndZenith*cosAngleBetweenViewAndLightOnPlane,\ncosAngleBetweenViewAndZenith,\nsinAngleBetweenViewAndZenith*sinAngleBetweenViewAndLightOnPlane);bool intersectsAtmosphere=false;vec3 cameraPositionGlobalClampedToTopOfAtmosphere=vec3(0.);moveToTopAtmosphere(\nvec3(0.,clampedCameraRadius,0.),\nclampedCameraRadius,\nvec3(0.,1.,0.),\nrayDirection,\nintersectsAtmosphere,\ncameraPositionGlobalClampedToTopOfAtmosphere);if (!intersectsAtmosphere) {return vec4(0.);}\nvec3 transmittance;vec3 radiance;integrateScatteredRadiance(\nfalse,\natmosphereExposure*lightIntensity,\ntransmittanceLut,\nmultiScatteringLut,\nmultiScatteringIntensity,\ncameraPositionGlobalClampedToTopOfAtmosphere,\nrayDirection,\ndirectionToLightRelativeToCameraGeocentricNormal,\n100000000.,\nSkyViewLutSampleCount,\n-1.,\nradiance,\ntransmittance);float transparency=1.-avg(transmittance);return vec4(radiance,transparency);}\n#endif\n#if RENDER_CAMERA_VOLUME\nvec4 renderCameraVolume(\nvec3 positionOnNearPlane,\nfloat layerIdx,\nsampler2D transmittanceLut,\nsampler2D multiScatteringLut) {vec4 result=vec4(0.);vec3 rayDirection=normalize(positionOnNearPlane);float layer=layerIdxToAerialPerspectiveLayer(layerIdx);float tMax=toAerialPerspectiveDepth(layer);float tMaxMax=tMax;vec3 cameraPositionGlobalClampedToTopOfAtmosphere=clampedCameraPositionGlobal;if (clampedCameraRadius>=atmosphereRadius) {bool intersectsAtmosphere=false;moveToTopAtmosphere(\nclampedCameraPositionGlobal,\nclampedCameraRadius,\ncameraGeocentricNormal,\nrayDirection,\nintersectsAtmosphere,\ncameraPositionGlobalClampedToTopOfAtmosphere);if (!intersectsAtmosphere) {return result;}\nfloat distanceToAtmosphere=distance(clampedCameraPositionGlobal,cameraPositionGlobalClampedToTopOfAtmosphere);if (tMaxMax<distanceToAtmosphere) {return result;}\ntMaxMax=max(0.,tMaxMax-distanceToAtmosphere);}\nfloat sampleCount=min(SkyViewLutSampleCount,2.*layer+2.);vec3 transmittance;vec3 radiance;integrateScatteredRadiance(\ntrue,\nlightIntensity,\ntransmittanceLut,\nmultiScatteringLut,\nmultiScatteringIntensity,\ncameraPositionGlobalClampedToTopOfAtmosphere,\nrayDirection,\ndirectionToLight,\ntMaxMax,\nsampleCount,\n-1.,\nradiance,\ntransmittance);float transparency=1.-avg(transmittance);result=vec4(radiance,transparency);return result;}\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const atmosphereFunctions = { name, shader };\n"]}
|
|
@@ -372,15 +372,15 @@ export declare class Atmosphere implements IDisposable {
|
|
|
372
372
|
/**
|
|
373
373
|
* Draws the aerial perspective compositor using {@link EffectWrapper} and {@link EffectRenderer}.
|
|
374
374
|
*/
|
|
375
|
-
|
|
375
|
+
drawAerialPerspectiveCompositor(): void;
|
|
376
376
|
/**
|
|
377
377
|
* Draws the sky compositor using {@link EffectWrapper} and {@link EffectRenderer}.
|
|
378
378
|
*/
|
|
379
|
-
|
|
379
|
+
drawSkyCompositor(): void;
|
|
380
380
|
/**
|
|
381
381
|
* Draws the globe atmosphere compositor using {@link EffectWrapper} and {@link EffectRenderer}.
|
|
382
382
|
*/
|
|
383
|
-
|
|
383
|
+
drawGlobeAtmosphereCompositor(): void;
|
|
384
384
|
private _disposeSkyCompositor;
|
|
385
385
|
private _disposeAerialPerspectiveCompositor;
|
|
386
386
|
private _disposeGlobeAtmosphereCompositor;
|
|
@@ -406,7 +406,7 @@ export declare class Atmosphere implements IDisposable {
|
|
|
406
406
|
/**
|
|
407
407
|
* Updates the atmosphere's uniform buffer.
|
|
408
408
|
*/
|
|
409
|
-
|
|
409
|
+
updateUniformBuffer(): void;
|
|
410
410
|
/**
|
|
411
411
|
* Draws the aerial perspective LUT using {@link EffectWrapper} and {@link EffectRenderer}.
|
|
412
412
|
*/
|
package/atmosphere/atmosphere.js
CHANGED
|
@@ -733,17 +733,29 @@ export class Atmosphere {
|
|
|
733
733
|
});
|
|
734
734
|
{
|
|
735
735
|
const renderingManager = scene.renderingManager;
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
736
|
+
if (this._skyRenderingGroup >= 0) {
|
|
737
|
+
renderingManager.getRenderingGroup(this._skyRenderingGroup);
|
|
738
|
+
}
|
|
739
|
+
if (this._aerialPerspectiveRenderingGroup >= 0) {
|
|
740
|
+
renderingManager.getRenderingGroup(this._aerialPerspectiveRenderingGroup);
|
|
741
|
+
}
|
|
742
|
+
if (this._globeAtmosphereRenderingGroup >= 0) {
|
|
743
|
+
renderingManager.getRenderingGroup(this._globeAtmosphereRenderingGroup);
|
|
744
|
+
}
|
|
739
745
|
// Mark all rendering groups as being "not empty" before rendering the corresponding targets.
|
|
740
746
|
// This ensures onAfterRenderTargetsRenderObservable is called for empty groups,
|
|
741
747
|
// which allows the atmosphere to be rendered even when the groups are otherwise empty e.g.,
|
|
742
748
|
// a scene with only the atmosphere in it, and no other Meshes.
|
|
743
749
|
this._onBeforeDrawPhaseObserver = scene.onBeforeDrawPhaseObservable.add(() => {
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
750
|
+
if (this._skyRenderingGroup >= 0) {
|
|
751
|
+
renderingManager.getRenderingGroup(this._skyRenderingGroup)._empty = false;
|
|
752
|
+
}
|
|
753
|
+
if (this._aerialPerspectiveRenderingGroup >= 0) {
|
|
754
|
+
renderingManager.getRenderingGroup(this._aerialPerspectiveRenderingGroup)._empty = false;
|
|
755
|
+
}
|
|
756
|
+
if (this._globeAtmosphereRenderingGroup >= 0) {
|
|
757
|
+
renderingManager.getRenderingGroup(this._globeAtmosphereRenderingGroup)._empty = false;
|
|
758
|
+
}
|
|
747
759
|
});
|
|
748
760
|
// Draw compositors after the respective rendering group.
|
|
749
761
|
this._onAfterRenderingGroupObserver = scene.onAfterRenderingGroupObservable.add((group) => {
|
|
@@ -752,13 +764,13 @@ export class Atmosphere {
|
|
|
752
764
|
}
|
|
753
765
|
const groupId = group.renderingGroupId;
|
|
754
766
|
if (this._skyRenderingGroup === groupId) {
|
|
755
|
-
this.
|
|
767
|
+
this.drawSkyCompositor();
|
|
756
768
|
}
|
|
757
769
|
if (this._aerialPerspectiveRenderingGroup === groupId) {
|
|
758
|
-
this.
|
|
770
|
+
this.drawAerialPerspectiveCompositor();
|
|
759
771
|
}
|
|
760
772
|
if (this._globeAtmosphereRenderingGroup === groupId) {
|
|
761
|
-
this.
|
|
773
|
+
this.drawGlobeAtmosphereCompositor();
|
|
762
774
|
}
|
|
763
775
|
});
|
|
764
776
|
}
|
|
@@ -883,7 +895,7 @@ export class Atmosphere {
|
|
|
883
895
|
/**
|
|
884
896
|
* Draws the aerial perspective compositor using {@link EffectWrapper} and {@link EffectRenderer}.
|
|
885
897
|
*/
|
|
886
|
-
|
|
898
|
+
drawAerialPerspectiveCompositor() {
|
|
887
899
|
// Only works if we have a depth texture.
|
|
888
900
|
if (this.depthTexture === null) {
|
|
889
901
|
return;
|
|
@@ -938,7 +950,7 @@ export class Atmosphere {
|
|
|
938
950
|
/**
|
|
939
951
|
* Draws the sky compositor using {@link EffectWrapper} and {@link EffectRenderer}.
|
|
940
952
|
*/
|
|
941
|
-
|
|
953
|
+
drawSkyCompositor() {
|
|
942
954
|
const isEnabled = this.isEnabled();
|
|
943
955
|
if (!isEnabled) {
|
|
944
956
|
return;
|
|
@@ -979,7 +991,7 @@ export class Atmosphere {
|
|
|
979
991
|
/**
|
|
980
992
|
* Draws the globe atmosphere compositor using {@link EffectWrapper} and {@link EffectRenderer}.
|
|
981
993
|
*/
|
|
982
|
-
|
|
994
|
+
drawGlobeAtmosphereCompositor() {
|
|
983
995
|
const isEnabled = this.isEnabled();
|
|
984
996
|
if (!isEnabled) {
|
|
985
997
|
return;
|
|
@@ -1068,7 +1080,7 @@ export class Atmosphere {
|
|
|
1068
1080
|
this._lightRadianceAtCamera.set(intensity * this._linearLightColor.r, intensity * this._linearLightColor.g, intensity * this._linearLightColor.b);
|
|
1069
1081
|
}
|
|
1070
1082
|
if (this.uniformBuffer.useUbo) {
|
|
1071
|
-
this.
|
|
1083
|
+
this.updateUniformBuffer();
|
|
1072
1084
|
}
|
|
1073
1085
|
// Render the LUTs.
|
|
1074
1086
|
const isEnabled = this.isEnabled();
|
|
@@ -1119,17 +1131,16 @@ export class Atmosphere {
|
|
|
1119
1131
|
const name = uniformBuffer.name;
|
|
1120
1132
|
uniformBuffer.bindToEffect(effect, name);
|
|
1121
1133
|
if (uniformBuffer.useUbo) {
|
|
1122
|
-
|
|
1123
|
-
engine.bindUniformBufferBase(uniformBuffer.getBuffer(), effect._uniformBuffersNames[name], name);
|
|
1134
|
+
uniformBuffer.bindUniformBuffer();
|
|
1124
1135
|
}
|
|
1125
1136
|
else {
|
|
1126
|
-
this.
|
|
1137
|
+
this.updateUniformBuffer();
|
|
1127
1138
|
}
|
|
1128
1139
|
}
|
|
1129
1140
|
/**
|
|
1130
1141
|
* Updates the atmosphere's uniform buffer.
|
|
1131
1142
|
*/
|
|
1132
|
-
|
|
1143
|
+
updateUniformBuffer() {
|
|
1133
1144
|
const physicalProperties = this._physicalProperties;
|
|
1134
1145
|
const cameraAtmosphereVariables = this._cameraAtmosphereVariables;
|
|
1135
1146
|
const ubo = this.uniformBuffer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atmosphere.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmosphere.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// MIT License\r\n\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { AtmospherePBRMaterialPlugin } from \"./atmospherePBRMaterialPlugin\";\r\nimport { AtmospherePerCameraVariables } from \"./atmospherePerCameraVariables\";\r\nimport { AtmospherePhysicalProperties } from \"./atmospherePhysicalProperties\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { DeepImmutable, Nullable } from \"core/types\";\r\nimport { DiffuseSkyIrradianceLut } from \"./diffuseSkyIrradianceLut\";\r\nimport type { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport type { Effect } from \"core/Materials/effect\";\r\nimport { EffectRenderer, EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport type { IAtmosphereOptions } from \"./atmosphereOptions\";\r\nimport type { IColor3Like, IVector3Like } from \"core/Maths/math.like\";\r\nimport type { IDisposable, Scene } from \"core/scene\";\r\nimport { Observable, type Observer } from \"core/Misc/observable\";\r\nimport { RegisterMaterialPlugin, UnregisterMaterialPlugin } from \"core/Materials/materialPluginManager\";\r\nimport type { RenderingGroupInfo } from \"core/Rendering/renderingManager\";\r\nimport { RenderTargetTexture, type RenderTargetTextureOptions } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { TransmittanceLut } from \"./transmittanceLut\";\r\nimport { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport \"./Shaders/compositeAerialPerspective.fragment\";\r\nimport \"./Shaders/compositeSky.fragment\";\r\nimport \"./Shaders/compositeGlobeAtmosphere.fragment\";\r\nimport \"./Shaders/fullscreenTriangle.vertex\";\r\nimport \"./Shaders/multiScattering.fragment\";\r\nimport \"./Shaders/skyView.fragment\";\r\nimport \"./Shaders/aerialPerspective.fragment\";\r\nimport \"./Shaders/ShadersInclude/atmosphereFragmentDeclaration\";\r\nimport \"./Shaders/ShadersInclude/atmosphereFunctions\";\r\nimport \"./Shaders/ShadersInclude/atmosphereUboDeclaration\";\r\nimport \"./Shaders/ShadersInclude/atmosphereVertexDeclaration\";\r\nimport \"./Shaders/ShadersInclude/depthFunctions\";\r\n\r\nconst MaterialPlugin = \"atmo-pbr\";\r\n\r\n/**\r\n * Renders a physically based atmosphere.\r\n * Use {@link IsSupported} to check if the atmosphere is supported before creating an instance.\r\n * @experimental\r\n */\r\nexport class Atmosphere implements IDisposable {\r\n private readonly _directionToLight = Vector3.Zero();\r\n private readonly _tempSceneAmbient = new Color3();\r\n private readonly _engine: AbstractEngine;\r\n private _physicalProperties: AtmospherePhysicalProperties;\r\n private _transmittanceLut: Nullable<TransmittanceLut>;\r\n private _diffuseSkyIrradianceLut: Nullable<DiffuseSkyIrradianceLut>;\r\n private _isSkyViewLutEnabled: boolean;\r\n private _isAerialPerspectiveLutEnabled: boolean;\r\n private _aerialPerspectiveTransmittanceScale: number;\r\n private _aerialPerspectiveSaturation: number;\r\n private _aerialPerspectiveIntensity: number;\r\n private _aerialPerspectiveRadianceBias: number;\r\n private _diffuseSkyIrradianceDesaturationFactor: number;\r\n private _additionalDiffuseSkyIrradianceIntensity: number;\r\n private _additionalDiffuseSkyIrradianceColor: Color3;\r\n private _additionalDiffuseSkyIrradiance = new Color3();\r\n private _diffuseSkyIrradianceIntensity: number;\r\n private _multiScatteringIntensity: number;\r\n private _groundAlbedo: Color3;\r\n private _minimumMultiScatteringColor: Color3;\r\n private _minimumMultiScatteringIntensity: number;\r\n private _lights: DirectionalLight[];\r\n private _atmosphereUbo: Nullable<UniformBuffer> = null;\r\n private _minimumMultiScattering = new Vector3();\r\n private _cameraAtmosphereVariables = new AtmospherePerCameraVariables();\r\n private _isLinearSpaceComposition: boolean;\r\n private _isLinearSpaceLight: boolean;\r\n private _lightRadianceAtCamera = new Vector3();\r\n private _linearLightColor = new Color3();\r\n private _originHeight: number;\r\n private _applyApproximateTransmittance: boolean;\r\n private _exposure: number;\r\n private _atmosphereUniformBufferAsArray: UniformBuffer[] = [];\r\n private _effectRenderer: Nullable<EffectRenderer> = null;\r\n private _skyRenderingGroup: number;\r\n private _aerialPerspectiveRenderingGroup: number;\r\n private _globeAtmosphereRenderingGroup: number;\r\n private _isEnabled = true;\r\n\r\n private _hasRenderedMultiScatteringLut = false;\r\n private _multiScatteringEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _multiScatteringLutRenderTarget: Nullable<RenderTargetTexture> = null;\r\n\r\n private _aerialPerspectiveLutEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _aerialPerspectiveLutEffectRenderer: Nullable<EffectRenderer> = null;\r\n private _aerialPerspectiveLutRenderTarget: Nullable<RenderTargetTexture> = null;\r\n\r\n private _skyViewLutEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _skyViewLutEffectRenderer: Nullable<EffectRenderer> = null;\r\n private _skyViewLutRenderTarget: Nullable<RenderTargetTexture> = null;\r\n\r\n private _aerialPerspectiveCompositorEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _skyCompositorEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _globeAtmosphereCompositorEffectWrapper: Nullable<EffectWrapper> = null;\r\n\r\n private _onBeforeCameraRenderObserver: Nullable<Observer<Camera>> = null;\r\n private _onBeforeDrawPhaseObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterRenderingGroupObserver: Nullable<Observer<RenderingGroupInfo>> = null;\r\n\r\n /**\r\n * Checks if the {@link Atmosphere} is supported.\r\n * @param engine - The engine to check.\r\n * @returns True if the atmosphere is supported, false otherwise.\r\n */\r\n public static IsSupported(engine: AbstractEngine): boolean {\r\n return !engine._badOS && !engine.isWebGPU && engine.version >= 2;\r\n }\r\n\r\n /**\r\n * Called after the atmosphere variables have been updated for the specified camera.\r\n */\r\n public readonly onAfterUpdateVariablesForCameraObservable = new Observable<Camera>();\r\n\r\n /**\r\n * Called immediately before the light variables are finalized.\r\n */\r\n public readonly onBeforeLightVariablesUpdateObservable = new Observable<void>();\r\n\r\n /**\r\n * Called before the LUTs are rendered for this camera. This happens after the per-camera UBO update.\r\n */\r\n public readonly onBeforeRenderLutsForCameraObservable = new Observable<void>();\r\n\r\n /**\r\n * Called after the LUTs were rendered.\r\n */\r\n public readonly onAfterRenderLutsForCameraObservable = new Observable<void>();\r\n\r\n /**\r\n * If provided, this is the depth texture used for composition passes.\r\n * Expects an infinite far plane on the camera (camera.maxZ = 0) and the non-linear depth accessible in red channel.\r\n * @internal\r\n */\r\n public readonly depthTexture: Nullable<BaseTexture> = null;\r\n\r\n /**\r\n * Controls the overall brightness of the atmosphere rendering.\r\n */\r\n public get exposure(): number {\r\n return this._exposure;\r\n }\r\n\r\n public set exposure(value: number) {\r\n this._exposure = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Affects the overall intensity of the multiple scattering.\r\n */\r\n public get multiScatteringIntensity(): number {\r\n return this._multiScatteringIntensity;\r\n }\r\n\r\n public set multiScatteringIntensity(value: number) {\r\n const newValue = Math.max(0.0, value);\r\n if (newValue !== this._multiScatteringIntensity) {\r\n this._multiScatteringIntensity = value;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Affects the multiply scattered light contribution in the atmosphere by describing the average light color reflected off the ground.\r\n */\r\n public get groundAlbedo(): DeepImmutable<IColor3Like> {\r\n return this._groundAlbedo;\r\n }\r\n\r\n public set groundAlbedo(value: DeepImmutable<IColor3Like>) {\r\n if (!this._groundAlbedo.equals(value)) {\r\n this._groundAlbedo.copyFrom(value);\r\n this._multiScatteringEffectWrapper?.dispose();\r\n this._multiScatteringEffectWrapper = null;\r\n this._hasRenderedMultiScatteringLut = false;\r\n }\r\n }\r\n\r\n /**\r\n * Can be used to clamp the multiple scattering to a minimum value.\r\n */\r\n public get minimumMultiScatteringColor(): DeepImmutable<IColor3Like> {\r\n return this._minimumMultiScatteringColor;\r\n }\r\n\r\n public set minimumMultiScatteringColor(value: DeepImmutable<IColor3Like>) {\r\n if (!this._minimumMultiScatteringColor.equals(value)) {\r\n const minimumScatteringColor = this._minimumMultiScatteringColor.copyFrom(value);\r\n this._minimumMultiScattering.x = minimumScatteringColor.r * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.y = minimumScatteringColor.g * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.z = minimumScatteringColor.b * this._minimumMultiScatteringIntensity;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * This is an additional scaling factor applied to the {@link minimumMultiScatteringColor}.\r\n */\r\n public get minimumMultiScatteringIntensity(): number {\r\n return this._minimumMultiScatteringIntensity;\r\n }\r\n\r\n public set minimumMultiScatteringIntensity(value: number) {\r\n const newValue = Math.max(0.0, value);\r\n if (newValue !== this._minimumMultiScatteringIntensity) {\r\n this._minimumMultiScatteringIntensity = value;\r\n this._minimumMultiScattering.x = this._minimumMultiScatteringColor.r * value;\r\n this._minimumMultiScattering.y = this._minimumMultiScatteringColor.g * value;\r\n this._minimumMultiScattering.z = this._minimumMultiScatteringColor.b * value;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Can be used to force the diffuse irradiance towards a gray color.\r\n */\r\n public get diffuseSkyIrradianceDesaturationFactor(): number {\r\n return this._diffuseSkyIrradianceDesaturationFactor;\r\n }\r\n\r\n public set diffuseSkyIrradianceDesaturationFactor(value: number) {\r\n const newValue = Math.max(value, 0.0);\r\n if (newValue !== this._diffuseSkyIrradianceDesaturationFactor) {\r\n this._diffuseSkyIrradianceDesaturationFactor = newValue;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * This is an additional amount of irradiance added to the diffuse irradiance.\r\n */\r\n public get additionalDiffuseSkyIrradianceIntensity(): number {\r\n return this._additionalDiffuseSkyIrradianceIntensity;\r\n }\r\n\r\n public set additionalDiffuseSkyIrradianceIntensity(value: number) {\r\n value = Math.max(0.0, value);\r\n if (value !== this._additionalDiffuseSkyIrradianceIntensity) {\r\n this._additionalDiffuseSkyIrradianceIntensity = value;\r\n this._additionalDiffuseSkyIrradianceColor.scaleToRef(value, this._additionalDiffuseSkyIrradiance);\r\n }\r\n }\r\n\r\n /**\r\n * This is the color for the additional amount of irradiance added to the diffuse irradiance.\r\n */\r\n public get additionalDiffuseSkyIrradianceColor(): DeepImmutable<IColor3Like> {\r\n return this._additionalDiffuseSkyIrradianceColor;\r\n }\r\n\r\n public set additionalDiffuseSkyIrradianceColor(value: DeepImmutable<IColor3Like>) {\r\n if (!this._additionalDiffuseSkyIrradianceColor.equals(value)) {\r\n this._additionalDiffuseSkyIrradianceColor.copyFrom(value).scaleToRef(this._additionalDiffuseSkyIrradianceIntensity, this._additionalDiffuseSkyIrradiance);\r\n }\r\n }\r\n\r\n /**\r\n * The final additional diffuse irradiance, taking into account the intensity and color.\r\n */\r\n public get additionalDiffuseSkyIrradiance(): DeepImmutable<IColor3Like> {\r\n return this._additionalDiffuseSkyIrradiance;\r\n }\r\n\r\n /**\r\n * The intensity of the diffuse irradiance.\r\n */\r\n public get diffuseSkyIrradianceIntensity(): number {\r\n return this._diffuseSkyIrradianceIntensity;\r\n }\r\n\r\n public set diffuseSkyIrradianceIntensity(value: number) {\r\n this._diffuseSkyIrradianceIntensity = Math.max(value, 0.0);\r\n }\r\n\r\n /**\r\n * True if the sky view LUT should be used for compositing the sky instead of a per-pixel ray march.\r\n */\r\n public get isSkyViewLutEnabled(): boolean {\r\n return this._isSkyViewLutEnabled;\r\n }\r\n\r\n public set isSkyViewLutEnabled(value: boolean) {\r\n this._isSkyViewLutEnabled = value;\r\n this._disposeSkyCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n\r\n /**\r\n * Gets the sky view LUT render target or null if not enabled.\r\n * @returns The render target.\r\n */\r\n public get skyViewLutRenderTarget(): Nullable<RenderTargetTexture> {\r\n if (!this._isSkyViewLutEnabled) {\r\n return null;\r\n }\r\n\r\n if (this._skyViewLutRenderTarget !== null) {\r\n return this._skyViewLutRenderTarget;\r\n }\r\n\r\n const renderTarget = (this._skyViewLutRenderTarget = CreateRenderTargetTexture(\"atmo-skyView\", { width: 128, height: 128 }, this.scene));\r\n renderTarget.coordinatesMode = Constants.TEXTURE_EQUIRECTANGULAR_MODE;\r\n\r\n this._skyViewLutEffectWrapper = CreateSkyViewEffectWrapper(this._engine, this.uniformBuffer);\r\n\r\n return renderTarget;\r\n }\r\n /**\r\n * True if the aerial perspective LUT should be used.\r\n * If false, full ray marching would be used instead.\r\n */\r\n public get isAerialPerspectiveLutEnabled(): boolean {\r\n return this._isAerialPerspectiveLutEnabled;\r\n }\r\n\r\n public set isAerialPerspectiveLutEnabled(value: boolean) {\r\n this._isAerialPerspectiveLutEnabled = value;\r\n this._disposeAerialPerspectiveCompositor();\r\n }\r\n\r\n /**\r\n * Gets the aerial perspective LUT render target or null if not enabled.\r\n * @returns The render target.\r\n */\r\n public get aerialPerspectiveLutRenderTarget(): Nullable<RenderTargetTexture> {\r\n if (!this._isAerialPerspectiveLutEnabled) {\r\n return null;\r\n }\r\n\r\n if (this._aerialPerspectiveLutRenderTarget !== null) {\r\n return this._aerialPerspectiveLutRenderTarget;\r\n }\r\n\r\n const scene = this.scene;\r\n const name = \"atmo-aerialPerspective\";\r\n const renderTarget = (this._aerialPerspectiveLutRenderTarget = CreateRenderTargetTexture(name, { width: 16, height: 64, layers: 32 }, scene, {}));\r\n this._aerialPerspectiveLutEffectWrapper = CreateAerialPerspectiveEffectWrapper(this._engine, this.uniformBuffer);\r\n\r\n return renderTarget;\r\n }\r\n\r\n /**\r\n * The intensity of the aerial perspective.\r\n */\r\n public get aerialPerspectiveIntensity(): number {\r\n return this._aerialPerspectiveIntensity;\r\n }\r\n\r\n public set aerialPerspectiveIntensity(value: number) {\r\n value = Math.max(0.001, value);\r\n if (value !== this._aerialPerspectiveIntensity) {\r\n // Define only needs to change if the value is changing between 1 and not 1.\r\n const hasDefineChanged = (value === 1) !== (this._aerialPerspectiveIntensity === 1);\r\n this._aerialPerspectiveIntensity = value;\r\n if (hasDefineChanged) {\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The amount of light transmitted into aerial perspective.\r\n * A scale of 1 is physically correct.\r\n */\r\n public get aerialPerspectiveTransmittanceScale(): number {\r\n return this._aerialPerspectiveTransmittanceScale;\r\n }\r\n\r\n public set aerialPerspectiveTransmittanceScale(value: number) {\r\n value = Math.max(0, value);\r\n if (value !== this._aerialPerspectiveTransmittanceScale) {\r\n this._aerialPerspectiveTransmittanceScale = value;\r\n }\r\n }\r\n\r\n /**\r\n * The amount of saturation applied to the aerial perspective.\r\n * Reducing to zero desaturates the aerial perspective completely.\r\n * A value of 1 has no effect.\r\n */\r\n public get aerialPerspectiveSaturation(): number {\r\n return this._aerialPerspectiveSaturation;\r\n }\r\n\r\n public set aerialPerspectiveSaturation(value: number) {\r\n value = Math.max(0.0, value);\r\n if (value !== this._aerialPerspectiveSaturation) {\r\n this._aerialPerspectiveSaturation = value;\r\n }\r\n }\r\n\r\n /**\r\n * A radiance bias applied to aerial perspective.\r\n */\r\n public get aerialPerspectiveRadianceBias(): number {\r\n return this._aerialPerspectiveRadianceBias;\r\n }\r\n\r\n public set aerialPerspectiveRadianceBias(value: number) {\r\n if (value !== this._aerialPerspectiveRadianceBias) {\r\n // Define only needs to change if the value is changing between 0 and not 0.\r\n const hasDefineChanged = (value === 0) !== (this._aerialPerspectiveRadianceBias === 0);\r\n this._aerialPerspectiveRadianceBias = value;\r\n if (hasDefineChanged) {\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * True if the composition should be in linear space (e.g. for HDR rendering).\r\n * Typically linear space is expected when ImageProcessing is enabled via PostProcesses.\r\n * False for non-linear output.\r\n */\r\n public get isLinearSpaceComposition(): boolean {\r\n return this._isLinearSpaceComposition;\r\n }\r\n\r\n public set isLinearSpaceComposition(value: boolean) {\r\n if (value !== this._isLinearSpaceComposition) {\r\n this._isLinearSpaceComposition = value;\r\n // Note, LUTs will remain in linear space. Up to compositors to apply gamma if needed.\r\n this._disposeSkyCompositor();\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n\r\n /**\r\n * True if the {@link light} value should be specified in linear space.\r\n * If using PBRMaterials, light value is expected to be linear.\r\n */\r\n public get isLinearSpaceLight(): boolean {\r\n return this._isLinearSpaceLight;\r\n }\r\n\r\n public set isLinearSpaceLight(value: boolean) {\r\n this._isLinearSpaceLight = value;\r\n }\r\n\r\n /**\r\n * The lookup table for transmittance.\r\n */\r\n public get transmittanceLut(): Nullable<TransmittanceLut> {\r\n return this._transmittanceLut;\r\n }\r\n\r\n /**\r\n * Gets the multiple scattering LUT render target.\r\n * @returns The render target.\r\n */\r\n public get multiScatteringLutRenderTarget(): Nullable<RenderTargetTexture> {\r\n return this._multiScatteringLutRenderTarget;\r\n }\r\n\r\n /**\r\n * The lookup table for diffuse sky irradiance, or null if not enabled.\r\n */\r\n public get diffuseSkyIrradianceLut(): Nullable<DiffuseSkyIrradianceLut> {\r\n return this._diffuseSkyIrradianceLut;\r\n }\r\n\r\n /**\r\n * The properties used to describe the size and optical parameters of the atmosphere.\r\n */\r\n public get physicalProperties(): AtmospherePhysicalProperties {\r\n return this._physicalProperties;\r\n }\r\n\r\n /**\r\n * The height in kilometers of the scene's origin.\r\n */\r\n public get originHeight(): number {\r\n return this._originHeight;\r\n }\r\n\r\n public set originHeight(value: number) {\r\n this._originHeight = value;\r\n }\r\n\r\n /**\r\n * When atmospheric scattering is applied to surfaces, if this value is set to true,\r\n * a grayscale approximation of the transmittance is used to dim surfaces.\r\n *\r\n * When set to false, the atmospheric composition does not dim the surfaces behind it.\r\n * It is up to the client application to apply transmittance manually.\r\n */\r\n public get applyApproximateTransmittance(): boolean {\r\n return this._applyApproximateTransmittance;\r\n }\r\n\r\n public set applyApproximateTransmittance(value: boolean) {\r\n if (this._applyApproximateTransmittance !== value) {\r\n this._applyApproximateTransmittance = value;\r\n this._disposeSkyCompositor();\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n\r\n /**\r\n * The directional lights in the scene which represent the suns illuminating the atmosphere.\r\n * Each frame, the color and intensity of the lights are updated based on the camera position and the light's direction.\r\n */\r\n public get lights(): ReadonlyArray<DirectionalLight> {\r\n return this._lights;\r\n }\r\n\r\n /**\r\n * The rendering group ID for the sky compositor.\r\n * The sky will only be rendered for this group.\r\n */\r\n public get skyRenderingGroup(): number {\r\n return this._skyRenderingGroup;\r\n }\r\n\r\n public set skyRenderingGroup(value: number) {\r\n this._skyRenderingGroup = value;\r\n this.scene.renderingManager.getRenderingGroup(value);\r\n }\r\n\r\n /**\r\n * The rendering group ID for the aerial perspective compositor.\r\n * Aerial perspective will only be rendered for this group.\r\n */\r\n public get aerialPerspectiveRenderingGroup(): number {\r\n return this._aerialPerspectiveRenderingGroup;\r\n }\r\n\r\n public set aerialPerspectiveRenderingGroup(value: number) {\r\n this._aerialPerspectiveRenderingGroup = value;\r\n this.scene.renderingManager.getRenderingGroup(value);\r\n }\r\n\r\n /**\r\n * The rendering group ID for the globe atmosphere compositor.\r\n * The globe atmosphere will only be rendered for this group.\r\n */\r\n public get globeAtmosphereRenderingGroup(): number {\r\n return this._globeAtmosphereRenderingGroup;\r\n }\r\n\r\n public set globeAtmosphereRenderingGroup(value: number) {\r\n this._globeAtmosphereRenderingGroup = value;\r\n this.scene.renderingManager.getRenderingGroup(value);\r\n }\r\n\r\n /**\r\n * Gets the uniform buffer used to store the atmosphere's physical properties.\r\n */\r\n public get uniformBuffer(): UniformBuffer {\r\n if (this._atmosphereUbo === null) {\r\n const atmosphereUbo = (this._atmosphereUbo = new UniformBuffer(this._engine, undefined, true, \"Atmosphere\"));\r\n atmosphereUbo.addUniform(\"peakRayleighScattering\", 3);\r\n atmosphereUbo.addUniform(\"planetRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakMieScattering\", 3);\r\n atmosphereUbo.addUniform(\"atmosphereThickness\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakMieAbsorption\", 3);\r\n atmosphereUbo.addUniform(\"planetRadiusSquared\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakMieExtinction\", 3);\r\n atmosphereUbo.addUniform(\"atmosphereRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakOzoneAbsorption\", 3);\r\n atmosphereUbo.addUniform(\"atmosphereRadiusSquared\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"horizonDistanceToAtmosphereEdge\", 1);\r\n atmosphereUbo.addUniform(\"horizonDistanceToAtmosphereEdgeSquared\", 1);\r\n atmosphereUbo.addUniform(\"planetRadiusWithOffset\", 1);\r\n atmosphereUbo.addUniform(\"planetRadiusOffset\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"atmosphereExposure\", 1);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveRadianceBias\", 1);\r\n atmosphereUbo.addUniform(\"inverseAtmosphereThickness\", 1);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveTransmittanceScale\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"inverseViewProjectionWithoutTranslation\", 16);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"directionToLight\", 3);\r\n atmosphereUbo.addUniform(\"multiScatteringIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"directionToLightRelativeToCameraGeocentricNormal\", 3);\r\n atmosphereUbo.addUniform(\"cameraRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"lightRadianceAtCamera\", 3);\r\n atmosphereUbo.addUniform(\"diffuseSkyIrradianceDesaturationFactor\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"groundAlbedo\", 3);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveSaturation\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"minMultiScattering\", 3);\r\n atmosphereUbo.addUniform(\"diffuseSkyIrradianceIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraPositionGlobal\", 3);\r\n atmosphereUbo.addUniform(\"lightIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"clampedCameraPositionGlobal\", 3);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraGeocentricNormal\", 3);\r\n atmosphereUbo.addUniform(\"clampedCameraRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraForward\", 3);\r\n atmosphereUbo.addUniform(\"clampedCameraHeight\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraPosition\", 3);\r\n atmosphereUbo.addUniform(\"cosCameraHorizonAngleFromZenith\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"viewport\", 4);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"additionalDiffuseSkyIrradiance\", 3);\r\n atmosphereUbo.addUniform(\"cameraHeight\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraNearPlane\", 1);\r\n atmosphereUbo.addUniform(\"originHeight\", 1);\r\n atmosphereUbo.addUniform(\"sinCameraAtmosphereHorizonAngleFromNadir\", 1);\r\n atmosphereUbo.create();\r\n }\r\n return this._atmosphereUbo;\r\n }\r\n\r\n /**\r\n * Gets the camera-related variables for this atmosphere. Updated each frame.\r\n */\r\n public get cameraAtmosphereVariables(): AtmospherePerCameraVariables {\r\n return this._cameraAtmosphereVariables;\r\n }\r\n\r\n // These fields and properties are used to interop with the inspector and not meant to be part of the API.\r\n\r\n private _peakRayleighScatteringMmInternal = new Vector3();\r\n private _peakRayleighScatteringKm = new Vector3();\r\n private _peakMieScatteringMmInternal = new Vector3();\r\n private _peakMieScatteringKm = new Vector3();\r\n private _peakMieAbsorptionMmInternal = new Vector3();\r\n private _peakMieAbsorptionKm = new Vector3();\r\n private _peakOzoneAbsorptionMmInternal = new Vector3();\r\n private _peakOzoneAbsorptionKm = new Vector3();\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _planetRadius(): number {\r\n return this._physicalProperties.planetRadius;\r\n }\r\n private set _planetRadius(value: number) {\r\n this._physicalProperties.planetRadius = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _planetRadiusOffset(): number {\r\n return this._physicalProperties.planetRadiusOffset;\r\n }\r\n private set _planetRadiusOffset(value: number) {\r\n this._physicalProperties.planetRadiusOffset = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _atmosphereThickness(): number {\r\n return this._physicalProperties.atmosphereThickness;\r\n }\r\n private set _atmosphereThickness(value: number) {\r\n this._physicalProperties.atmosphereThickness = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _rayleighScatteringScale(): number {\r\n return this._physicalProperties.rayleighScatteringScale;\r\n }\r\n private set _rayleighScatteringScale(value: number) {\r\n this._physicalProperties.rayleighScatteringScale = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _peakRayleighScatteringMm(): Vector3 {\r\n this._physicalProperties.peakRayleighScattering.scaleToRef(1000.0, this._peakRayleighScatteringMmInternal);\r\n return this._peakRayleighScatteringMmInternal;\r\n }\r\n private set _peakRayleighScatteringMm(value: Vector3) {\r\n this._peakRayleighScatteringMmInternal.copyFrom(value);\r\n this._peakRayleighScatteringMmInternal.scaleToRef(0.001, this._peakRayleighScatteringKm);\r\n this._physicalProperties.peakRayleighScattering = this._peakRayleighScatteringKm;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _mieScatteringScale(): number {\r\n return this._physicalProperties.mieScatteringScale;\r\n }\r\n private set _mieScatteringScale(value: number) {\r\n this._physicalProperties.mieScatteringScale = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _peakMieScatteringMm(): Vector3 {\r\n this._physicalProperties.peakMieScattering.scaleToRef(1000.0, this._peakMieScatteringMmInternal);\r\n return this._peakMieScatteringMmInternal;\r\n }\r\n private set _peakMieScatteringMm(value: Vector3) {\r\n this._peakMieScatteringMmInternal.copyFrom(value);\r\n this._peakMieScatteringMmInternal.scaleToRef(0.001, this._peakMieScatteringKm);\r\n this._physicalProperties.peakMieScattering = this._peakMieScatteringKm;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _mieAbsorptionScale(): number {\r\n return this._physicalProperties.mieAbsorptionScale;\r\n }\r\n private set _mieAbsorptionScale(value: number) {\r\n this._physicalProperties.mieAbsorptionScale = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _peakMieAbsorptionMm(): Vector3 {\r\n this._physicalProperties.peakMieAbsorption.scaleToRef(1000.0, this._peakMieAbsorptionMmInternal);\r\n return this._peakMieAbsorptionMmInternal;\r\n }\r\n private set _peakMieAbsorptionMm(value: Vector3) {\r\n this._peakMieAbsorptionMmInternal.copyFrom(value);\r\n this._peakMieAbsorptionMmInternal.scaleToRef(0.001, this._peakMieAbsorptionKm);\r\n this._physicalProperties.peakMieAbsorption = this._peakMieAbsorptionKm;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _ozoneAbsorptionScale(): number {\r\n return this._physicalProperties.ozoneAbsorptionScale;\r\n }\r\n private set _ozoneAbsorptionScale(value: number) {\r\n this._physicalProperties.ozoneAbsorptionScale = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _peakOzoneAbsorptionMm(): Vector3 {\r\n this._physicalProperties.peakOzoneAbsorption.scaleToRef(1000.0, this._peakOzoneAbsorptionMmInternal);\r\n return this._peakOzoneAbsorptionMmInternal;\r\n }\r\n private set _peakOzoneAbsorptionMm(value: Vector3) {\r\n this._peakOzoneAbsorptionMmInternal.copyFrom(value);\r\n this._peakOzoneAbsorptionMmInternal.scaleToRef(0.001, this._peakOzoneAbsorptionKm);\r\n this._physicalProperties.peakOzoneAbsorption = this._peakOzoneAbsorptionKm;\r\n }\r\n\r\n /**\r\n * Constructs the {@link Atmosphere}.\r\n * @param name - The name of this instance.\r\n * @param scene - The scene to which the atmosphere will be added.\r\n * @param lights - The light sources that illuminate the atmosphere. Currently only supports one light, and that light should be the first light in the scene.\r\n * @param options - The options used to create the atmosphere.\r\n */\r\n public constructor(\r\n public readonly name: string,\r\n public readonly scene: Scene,\r\n lights: DirectionalLight[],\r\n options?: IAtmosphereOptions\r\n ) {\r\n const engine = (this._engine = scene.getEngine());\r\n if (engine.isWebGPU) {\r\n throw new Error(\"Atmosphere is not supported on WebGPU.\");\r\n }\r\n if (engine.version < 2) {\r\n throw new Error(`Atmosphere is not supported on WebGL ${engine.version}.`);\r\n }\r\n\r\n this._physicalProperties = options?.physicalProperties ?? new AtmospherePhysicalProperties();\r\n this._physicalProperties.onChangedObservable.add(() => {\r\n this._transmittanceLut?.markDirty();\r\n });\r\n\r\n if (lights.length !== 1) {\r\n throw new Error(\"Atmosphere only supports one light source currently.\");\r\n }\r\n this._lights = lights;\r\n\r\n this.depthTexture = options?.depthTexture ?? null;\r\n this._exposure = options?.exposure ?? 1.0;\r\n this._isLinearSpaceLight = options?.isLinearSpaceLight ?? false;\r\n this._isLinearSpaceComposition = options?.isLinearSpaceComposition ?? false;\r\n this._applyApproximateTransmittance = options?.applyApproximateTransmittance ?? true;\r\n this._aerialPerspectiveRadianceBias = options?.aerialPerspectiveRadianceBias ?? 0.0;\r\n this._aerialPerspectiveTransmittanceScale = options?.aerialPerspectiveTransmittanceScale ?? 1.0;\r\n this._aerialPerspectiveSaturation = options?.aerialPerspectiveSaturation ?? 1.0;\r\n this._aerialPerspectiveIntensity = options?.aerialPerspectiveIntensity ?? 1.0;\r\n this._diffuseSkyIrradianceDesaturationFactor = options?.diffuseSkyIrradianceDesaturationFactor ?? 0.5;\r\n this._diffuseSkyIrradianceIntensity = options?.diffuseSkyIrradianceIntensity ?? 1.0;\r\n this._additionalDiffuseSkyIrradianceIntensity = options?.additionalDiffuseSkyIrradianceIntensity ?? 0.01;\r\n this._multiScatteringIntensity = options?.multiScatteringIntensity ?? 1.0;\r\n this._minimumMultiScatteringIntensity = options?.minimumMultiScatteringIntensity ?? 0.000618;\r\n this._isSkyViewLutEnabled = options?.isSkyViewLutEnabled ?? true;\r\n this._isAerialPerspectiveLutEnabled = options?.isAerialPerspectiveLutEnabled ?? true;\r\n this._originHeight = options?.originHeight ?? 0;\r\n this._additionalDiffuseSkyIrradianceColor = options?.additionalDiffuseSkyIrradianceColor\r\n ? new Color3().copyFrom(options.additionalDiffuseSkyIrradianceColor)\r\n : new Color3(163 / 255.0, 199 / 255.0, 1.0);\r\n this._groundAlbedo = options?.groundAlbedo ? new Color3().copyFrom(options.groundAlbedo) : new Color3().set(124.0 / 255.0, 165.0 / 255.0, 1.0);\r\n const minimumMultiScatteringColor = (this._minimumMultiScatteringColor = options?.minimumMultiScatteringColor\r\n ? new Color3().copyFrom(options.minimumMultiScatteringColor)\r\n : new Color3(30.0 / 255.0, 40.0 / 255.0, 77.0 / 255.0));\r\n\r\n this._skyRenderingGroup = options?.skyRenderingGroup ?? 0;\r\n this._aerialPerspectiveRenderingGroup = options?.aerialPerspectiveRenderingGroup ?? 0;\r\n this._globeAtmosphereRenderingGroup = options?.globeAtmosphereRenderingGroup ?? 0;\r\n\r\n this._additionalDiffuseSkyIrradianceColor.scaleToRef(this._additionalDiffuseSkyIrradianceIntensity, this._additionalDiffuseSkyIrradiance);\r\n this._minimumMultiScattering.x = minimumMultiScatteringColor.r * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.y = minimumMultiScatteringColor.g * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.z = minimumMultiScatteringColor.b * this._minimumMultiScatteringIntensity;\r\n\r\n this._effectRenderer = new EffectRenderer(engine, {\r\n // Full screen triangle.\r\n indices: [0, 2, 1],\r\n positions: [-1, -1, -1, 3, 3, -1],\r\n });\r\n\r\n this._transmittanceLut = new TransmittanceLut(this);\r\n this._multiScatteringLutRenderTarget = CreateRenderTargetTexture(\"atmo-multiScattering\", { width: 32, height: 32 }, scene);\r\n if (options?.isDiffuseSkyIrradianceLutEnabled ?? true) {\r\n this._diffuseSkyIrradianceLut = new DiffuseSkyIrradianceLut(this);\r\n }\r\n if (this._isSkyViewLutEnabled) {\r\n this.skyViewLutRenderTarget!;\r\n }\r\n if (this._isAerialPerspectiveLutEnabled) {\r\n this.aerialPerspectiveLutRenderTarget!;\r\n }\r\n\r\n // Before rendering, make sure the per-camera variables have been updated.\r\n this._onBeforeCameraRenderObserver = scene.onBeforeCameraRenderObservable.add((x) => {\r\n this._updatePerCameraVariables(x);\r\n this._renderLutsForCamera();\r\n });\r\n\r\n {\r\n const renderingManager = scene.renderingManager;\r\n renderingManager.getRenderingGroup(this._skyRenderingGroup);\r\n renderingManager.getRenderingGroup(this._aerialPerspectiveRenderingGroup);\r\n renderingManager.getRenderingGroup(this._globeAtmosphereRenderingGroup);\r\n\r\n // Mark all rendering groups as being \"not empty\" before rendering the corresponding targets.\r\n // This ensures onAfterRenderTargetsRenderObservable is called for empty groups,\r\n // which allows the atmosphere to be rendered even when the groups are otherwise empty e.g.,\r\n // a scene with only the atmosphere in it, and no other Meshes.\r\n this._onBeforeDrawPhaseObserver = scene.onBeforeDrawPhaseObservable.add(() => {\r\n renderingManager.getRenderingGroup(this._skyRenderingGroup)._empty = false;\r\n renderingManager.getRenderingGroup(this._aerialPerspectiveRenderingGroup)._empty = false;\r\n renderingManager.getRenderingGroup(this._globeAtmosphereRenderingGroup)._empty = false;\r\n });\r\n\r\n // Draw compositors after the respective rendering group.\r\n this._onAfterRenderingGroupObserver = scene.onAfterRenderingGroupObservable.add((group) => {\r\n if (group.renderingManager !== scene.renderingManager) {\r\n return;\r\n }\r\n\r\n const groupId = group.renderingGroupId;\r\n\r\n if (this._skyRenderingGroup === groupId) {\r\n this._drawSkyCompositor();\r\n }\r\n\r\n if (this._aerialPerspectiveRenderingGroup === groupId) {\r\n this._drawAerialPerspectiveCompositor();\r\n }\r\n\r\n if (this._globeAtmosphereRenderingGroup === groupId) {\r\n this._drawGlobeAtmosphereCompositor();\r\n }\r\n });\r\n }\r\n\r\n // Ensure the atmosphere is disposed when the scene is disposed.\r\n scene.onDisposeObservable.addOnce(() => {\r\n this.dispose();\r\n });\r\n\r\n // Registers a material plugin which will allow common materials to sample the atmosphere environment maps e.g.,\r\n // sky view LUT for glossy reflections and diffuse sky illiminance LUT for irradiance.\r\n // It also handles aerial perspective application when Atmosphere is not provided with a depth texture.\r\n UnregisterMaterialPlugin(MaterialPlugin);\r\n RegisterMaterialPlugin(MaterialPlugin, (material) => {\r\n if (material.getClassName() === \"PBRMaterial\") {\r\n return new AtmospherePBRMaterialPlugin(material, this, this.depthTexture === null);\r\n }\r\n return null;\r\n });\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public dispose(): void {\r\n this._onBeforeCameraRenderObserver?.remove();\r\n this._onBeforeCameraRenderObserver = null;\r\n this._onBeforeDrawPhaseObserver?.remove();\r\n this._onBeforeDrawPhaseObserver = null;\r\n this._onAfterRenderingGroupObserver?.remove();\r\n this._onAfterRenderingGroupObserver = null;\r\n this._globeAtmosphereCompositorEffectWrapper?.dispose();\r\n this._globeAtmosphereCompositorEffectWrapper = null;\r\n this._skyCompositorEffectWrapper?.dispose();\r\n this._skyCompositorEffectWrapper = null;\r\n this._aerialPerspectiveCompositorEffectWrapper?.dispose();\r\n this._aerialPerspectiveCompositorEffectWrapper = null;\r\n this._skyViewLutRenderTarget?.dispose();\r\n this._skyViewLutRenderTarget = null;\r\n this._skyViewLutEffectWrapper?.dispose();\r\n this._skyViewLutEffectWrapper = null;\r\n this._skyViewLutEffectRenderer?.dispose();\r\n this._skyViewLutEffectRenderer = null;\r\n this._aerialPerspectiveLutRenderTarget?.dispose();\r\n this._aerialPerspectiveLutRenderTarget = null;\r\n this._aerialPerspectiveLutEffectWrapper?.dispose();\r\n this._aerialPerspectiveLutEffectWrapper = null;\r\n this._aerialPerspectiveLutEffectRenderer?.dispose();\r\n this._aerialPerspectiveLutEffectRenderer = null;\r\n this._multiScatteringEffectWrapper?.dispose();\r\n this._multiScatteringEffectWrapper = null;\r\n this._multiScatteringLutRenderTarget?.dispose();\r\n this._multiScatteringLutRenderTarget = null;\r\n this._transmittanceLut?.dispose();\r\n this._transmittanceLut = null;\r\n this._diffuseSkyIrradianceLut?.dispose();\r\n this._diffuseSkyIrradianceLut = null;\r\n this._atmosphereUbo?.dispose();\r\n this._atmosphereUbo = null;\r\n this._effectRenderer?.dispose();\r\n this._effectRenderer = null;\r\n this._atmosphereUniformBufferAsArray.length = 0;\r\n\r\n UnregisterMaterialPlugin(MaterialPlugin);\r\n }\r\n\r\n /**\r\n * True if the atmosphere is enabled.\r\n * @returns - True if the atmosphere is enabled.\r\n */\r\n public isEnabled() {\r\n return this._isEnabled;\r\n }\r\n\r\n /**\r\n * Sets the enabled state of the atmosphere.\r\n * @param enabled - True to enable the atmosphere, false to disable it.\r\n */\r\n public setEnabled(enabled: boolean) {\r\n this._isEnabled = enabled;\r\n }\r\n\r\n /**\r\n * The class name of the {@link Atmosphere}.\r\n * @returns - The class name of the atmosphere.\r\n */\r\n public getClassName(): string {\r\n return \"Atmosphere\";\r\n }\r\n\r\n /**\r\n * Gets the color of a light after being transmitted through the atmosphere to a point specified by its distance to the planet center and its geocentric normal.\r\n * NOTE, the result is always a linear space color.\r\n * @param directionToLight - The direction of the light.\r\n * @param pointRadius - The distance from the planet center to the point in kilometers.\r\n * @param pointGeocentricNormal - The geocentric normal at the point i.e., normalize(point - planet center).\r\n * @param result - The color to store the result in.\r\n * @returns The result color.\r\n */\r\n public getTransmittedColorToRef = <T extends IColor3Like>(directionToLight: IVector3Like, pointRadius: number, pointGeocentricNormal: IVector3Like, result: T): T =>\r\n this._transmittanceLut!.getTransmittedColorToRef(directionToLight, pointRadius, pointGeocentricNormal, result);\r\n\r\n /**\r\n * Gets the diffuse sky irradiance. Result is always in linear space.\r\n * @param directionToLight - The direction of the point to the light.\r\n * @param pointRadius - The distance from the planet center to the point in kilometers.\r\n * @param pointGeocentricNormal - The geocentric normal at the point: normalize(point - planet center).\r\n * @param lightIrradiance - The irradiance of the light.\r\n * @param result - The color to store the result in.\r\n * @returns The result color.\r\n */\r\n public getDiffuseSkyIrradianceToRef = <T extends IColor3Like>(\r\n directionToLight: IVector3Like,\r\n pointRadius: number,\r\n pointGeocentricNormal: IVector3Like,\r\n lightIrradiance: number,\r\n result: T\r\n ): T =>\r\n this._diffuseSkyIrradianceLut?.getDiffuseSkyIrradianceToRef(directionToLight, pointRadius, pointGeocentricNormal, lightIrradiance, result) ??\r\n ((result.r = 0), (result.g = 0), (result.b = 0), result);\r\n\r\n /**\r\n * Creates a new {@link EffectWrapper} for the multiple scattering LUT\r\n * @returns The newly created {@link EffectWrapper}.\r\n */\r\n private _createMultiScatteringEffectWrapper(): EffectWrapper {\r\n const engine = this._engine;\r\n const name = \"atmo-multiScattering\";\r\n const ubo = this.uniformBuffer;\r\n const useUbo = ubo.useUbo;\r\n\r\n const defines: string[] = [\"#define POSITION_VEC2\"];\r\n if (!this._groundAlbedo.equals(Color3.BlackReadOnly)) {\r\n defines.push(\"#define USE_GROUND_ALBEDO\");\r\n }\r\n\r\n return new EffectWrapper({\r\n engine,\r\n name,\r\n vertexShader: \"fullscreenTriangle\",\r\n fragmentShader: \"multiScattering\",\r\n attributeNames: [\"position\"],\r\n uniformNames: [\"depth\", ...(useUbo ? [] : this.uniformBuffer.getUniformNames())],\r\n uniformBuffers: useUbo ? [this.uniformBuffer.name] : [],\r\n samplerNames: [\"transmittanceLut\"],\r\n defines,\r\n useShaderStore: true,\r\n });\r\n }\r\n\r\n /**\r\n * Draws the multiple scattering LUT using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawMultiScatteringLut(): void {\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n DrawEffect(\r\n this._engine,\r\n this._effectRenderer!,\r\n this._multiScatteringEffectWrapper,\r\n this._multiScatteringLutRenderTarget,\r\n (effectRenderer, renderTarget, effect, engine) => {\r\n this.bindUniformBufferToEffect(effect);\r\n engine.bindFramebuffer(renderTarget!, undefined, undefined, undefined, true);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effectRenderer.draw();\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Draws the aerial perspective compositor using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawAerialPerspectiveCompositor(): void {\r\n // Only works if we have a depth texture.\r\n if (this.depthTexture === null) {\r\n return;\r\n }\r\n\r\n const isEnabled = this.isEnabled();\r\n if (!isEnabled) {\r\n return;\r\n }\r\n\r\n // Aerial perspective compositor only renders when inside the atmosphere.\r\n const isOutsideAtmosphere = this._cameraAtmosphereVariables.clampedCameraRadius > this._physicalProperties.atmosphereRadius;\r\n if (isOutsideAtmosphere) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n this._aerialPerspectiveCompositorEffectWrapper ??= CreateAerialPerspectiveCompositorEffectWrapper(\r\n engine,\r\n this.uniformBuffer,\r\n this._isAerialPerspectiveLutEnabled,\r\n this._isSkyViewLutEnabled,\r\n this._isLinearSpaceComposition,\r\n this._applyApproximateTransmittance,\r\n this._aerialPerspectiveIntensity,\r\n this._aerialPerspectiveRadianceBias\r\n );\r\n\r\n const skyViewLut = this._isSkyViewLutEnabled ? this.skyViewLutRenderTarget : null;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n const aerialPerspectiveLut = this._isAerialPerspectiveLutEnabled ? this.aerialPerspectiveLutRenderTarget : null;\r\n if (\r\n !this._aerialPerspectiveCompositorEffectWrapper.isReady() ||\r\n !(skyViewLut?.isReady() ?? true) ||\r\n !multiScatteringLut.isReady() ||\r\n !transmittanceLut.isReady() ||\r\n !(aerialPerspectiveLut?.isReady() ?? true) ||\r\n !this.depthTexture.isReady()\r\n ) {\r\n return;\r\n }\r\n\r\n DrawEffect(\r\n engine,\r\n this._effectRenderer!,\r\n this._aerialPerspectiveCompositorEffectWrapper,\r\n null, // No render target, it will render to the current buffer.\r\n (effectRenderer, _, effect) => {\r\n if (this.depthTexture === null) {\r\n throw new Error(\"Depth texture is required for aerial perspective compositor.\");\r\n }\r\n this.bindUniformBufferToEffect(effect);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n if (this._isSkyViewLutEnabled) {\r\n effect.setTexture(\"skyViewLut\", skyViewLut);\r\n }\r\n if (this._isAerialPerspectiveLutEnabled) {\r\n effect.setTexture(\"aerialPerspectiveLut\", aerialPerspectiveLut);\r\n }\r\n effect.setTexture(\"depthTexture\", this.depthTexture);\r\n effectRenderer.draw();\r\n },\r\n 1, // depth to use in the compositor.\r\n this.applyApproximateTransmittance ? Constants.ALPHA_PREMULTIPLIED_PORTERDUFF : Constants.ALPHA_ONEONE,\r\n true, // depthTest\r\n false, // depthWrite\r\n Constants.ALWAYS, // depthFunction\r\n false // restoreDefaultFramebuffer\r\n );\r\n }\r\n\r\n /**\r\n * Draws the sky compositor using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawSkyCompositor(): void {\r\n const isEnabled = this.isEnabled();\r\n if (!isEnabled) {\r\n return;\r\n }\r\n\r\n // The sky compositor only renders when inside the atmosphere.\r\n const isOutsideAtmosphere = this._cameraAtmosphereVariables.clampedCameraRadius > this._physicalProperties.atmosphereRadius;\r\n if (isOutsideAtmosphere) {\r\n return;\r\n }\r\n\r\n if (this.depthTexture !== null && !this.depthTexture.isReady()) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n this._skyCompositorEffectWrapper ??= CreateSkyCompositorEffectWrapper(\r\n engine,\r\n this.uniformBuffer,\r\n this._isSkyViewLutEnabled,\r\n this._isLinearSpaceComposition,\r\n this._applyApproximateTransmittance\r\n );\r\n\r\n const skyViewLut = this._isSkyViewLutEnabled ? this.skyViewLutRenderTarget : null;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n if (!this._skyCompositorEffectWrapper.isReady() || !(skyViewLut?.isReady() ?? true) || !multiScatteringLut.isReady() || !transmittanceLut.isReady()) {\r\n return;\r\n }\r\n\r\n DrawEffect(\r\n engine,\r\n this._effectRenderer!,\r\n this._skyCompositorEffectWrapper,\r\n null, // No render target, it will render to the current buffer.\r\n (effectRenderer, _, effect) => {\r\n this.bindUniformBufferToEffect(effect);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n if (this._isSkyViewLutEnabled) {\r\n effect.setTexture(\"skyViewLut\", skyViewLut);\r\n }\r\n effectRenderer.draw();\r\n },\r\n 1, // depth to use in the compositor.\r\n this._applyApproximateTransmittance ? Constants.ALPHA_PREMULTIPLIED_PORTERDUFF : Constants.ALPHA_ONEONE,\r\n true, // depthTest\r\n false, // depthWrite\r\n Constants.EQUAL, // depthFunction\r\n false // restoreDefaultFramebuffer\r\n );\r\n }\r\n\r\n /**\r\n * Draws the globe atmosphere compositor using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawGlobeAtmosphereCompositor(): void {\r\n const isEnabled = this.isEnabled();\r\n if (!isEnabled) {\r\n return;\r\n }\r\n\r\n // Globe atmosphere compositor only renders when outside the atmosphere.\r\n const isOutsideAtmosphere = this._cameraAtmosphereVariables.clampedCameraRadius > this._physicalProperties.atmosphereRadius;\r\n if (!isOutsideAtmosphere) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n this._globeAtmosphereCompositorEffectWrapper ??= CreateGlobeAtmosphereCompositorEffectWrapper(\r\n engine,\r\n this.uniformBuffer,\r\n this._isSkyViewLutEnabled,\r\n this._isLinearSpaceComposition,\r\n this._applyApproximateTransmittance,\r\n this._aerialPerspectiveIntensity,\r\n this._aerialPerspectiveRadianceBias,\r\n this.depthTexture !== null\r\n );\r\n\r\n const skyViewLut = this._isSkyViewLutEnabled ? this.skyViewLutRenderTarget : null;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n if (!this._globeAtmosphereCompositorEffectWrapper.isReady() || !(skyViewLut?.isReady() ?? true) || !multiScatteringLut.isReady() || !transmittanceLut.isReady()) {\r\n return;\r\n }\r\n\r\n if (this.depthTexture !== null && !this.depthTexture.isReady()) {\r\n return;\r\n }\r\n\r\n DrawEffect(\r\n engine,\r\n this._effectRenderer!,\r\n this._globeAtmosphereCompositorEffectWrapper,\r\n null, // No render target, it will render to the current buffer.\r\n (effectRenderer, _, effect) => {\r\n this.bindUniformBufferToEffect(effect);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n if (this._isSkyViewLutEnabled) {\r\n effect.setTexture(\"skyViewLut\", skyViewLut);\r\n }\r\n if (this.depthTexture !== null) {\r\n effect.setTexture(\"depthTexture\", this.depthTexture);\r\n }\r\n effectRenderer.draw();\r\n },\r\n 1, // depth to use in the compositor.\r\n this._applyApproximateTransmittance ? Constants.ALPHA_PREMULTIPLIED_PORTERDUFF : Constants.ALPHA_ONEONE,\r\n true, // depthTest\r\n false, // depthWrite\r\n Constants.ALWAYS, // depthFunction\r\n false // restoreDefaultFramebuffer\r\n );\r\n }\r\n\r\n private _disposeSkyCompositor(): void {\r\n this._skyCompositorEffectWrapper?.dispose();\r\n this._skyCompositorEffectWrapper = null;\r\n }\r\n\r\n private _disposeAerialPerspectiveCompositor(): void {\r\n this._aerialPerspectiveCompositorEffectWrapper?.dispose();\r\n this._aerialPerspectiveCompositorEffectWrapper = null;\r\n }\r\n\r\n private _disposeGlobeAtmosphereCompositor(): void {\r\n this._globeAtmosphereCompositorEffectWrapper?.dispose();\r\n this._globeAtmosphereCompositorEffectWrapper = null;\r\n }\r\n\r\n /**\r\n * Updates the camera variables that are specific to the atmosphere.\r\n * @param camera - The camera to update the variables for.\r\n */\r\n private _updatePerCameraVariables(camera: Camera): void {\r\n const light = this._lights[0];\r\n this._directionToLight.copyFrom(light.direction);\r\n this._directionToLight.scaleInPlace(-1);\r\n\r\n const properties = this._physicalProperties;\r\n const cameraAtmosphereVariables = this._cameraAtmosphereVariables;\r\n cameraAtmosphereVariables.update(\r\n camera,\r\n properties.planetRadius,\r\n properties.planetRadiusWithOffset,\r\n properties.atmosphereRadius,\r\n this._directionToLight,\r\n this.originHeight\r\n );\r\n\r\n this._transmittanceLut!.updateLightParameters(light, cameraAtmosphereVariables.clampedCameraRadius, cameraAtmosphereVariables.cameraGeocentricNormal);\r\n this._linearLightColor.copyFrom(light.diffuse);\r\n\r\n this.getDiffuseSkyIrradianceToRef(this._directionToLight, 0, cameraAtmosphereVariables.cameraGeocentricNormal, this.lights[0].intensity, this._tempSceneAmbient);\r\n if (!this.isLinearSpaceLight) {\r\n this._tempSceneAmbient.toGammaSpaceToRef(this._tempSceneAmbient);\r\n }\r\n this.scene.ambientColor = this._tempSceneAmbient;\r\n\r\n this.onAfterUpdateVariablesForCameraObservable.notifyObservers(camera);\r\n }\r\n\r\n /**\r\n * Renders the lookup tables, some of which can vary per-camera.\r\n * It is expected that updatePerCameraVariables was previously called.\r\n */\r\n private _renderLutsForCamera(): void {\r\n {\r\n this.onBeforeLightVariablesUpdateObservable.notifyObservers();\r\n\r\n const light = this.lights[0];\r\n if (!this.isLinearSpaceLight) {\r\n light.diffuse = light.diffuse.toGammaSpaceToRef(light.diffuse);\r\n light.specular = light.specular.toGammaSpaceToRef(light.specular);\r\n }\r\n const intensity = light.intensity;\r\n this._lightRadianceAtCamera.set(intensity * this._linearLightColor.r, intensity * this._linearLightColor.g, intensity * this._linearLightColor.b);\r\n }\r\n\r\n if (this.uniformBuffer.useUbo) {\r\n this._updateUniformBuffer();\r\n }\r\n\r\n // Render the LUTs.\r\n const isEnabled = this.isEnabled();\r\n {\r\n this.onBeforeRenderLutsForCameraObservable.notifyObservers();\r\n\r\n // After UBO update we can render the global LUTs which use some of these values on the GPU.\r\n // TODO: Could break out update and UBOs to global vs. per-camera.\r\n this.renderGlobalLuts();\r\n\r\n // If atmosphere is enabled, render the per-camera LUTs (sky view and aerial perspective).\r\n if (isEnabled && !this._transmittanceLut!.isDirty && this._hasRenderedMultiScatteringLut) {\r\n if (this._isSkyViewLutEnabled) {\r\n this._drawSkyViewLut();\r\n }\r\n\r\n // Only need to render aerial perspective LUT when inside the atmosphere.\r\n if (this._isAerialPerspectiveLutEnabled && this._cameraAtmosphereVariables.clampedCameraRadius <= this._physicalProperties.atmosphereRadius) {\r\n this._drawAerialPerspectiveLut();\r\n }\r\n }\r\n\r\n this.onAfterRenderLutsForCameraObservable.notifyObservers();\r\n }\r\n }\r\n\r\n /**\r\n * Renders the lookup tables that do not depend on a camera position.\r\n */\r\n public renderGlobalLuts(): void {\r\n const hasNewTransmittanceLut = this._transmittanceLut!.render();\r\n if (hasNewTransmittanceLut) {\r\n this._hasRenderedMultiScatteringLut = false;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n\r\n if (!this._transmittanceLut!.isDirty && !this._hasRenderedMultiScatteringLut) {\r\n this._multiScatteringEffectWrapper ??= this._createMultiScatteringEffectWrapper();\r\n if (this._multiScatteringEffectWrapper?.isReady() && this._multiScatteringLutRenderTarget?.isReady()) {\r\n this._drawMultiScatteringLut();\r\n this._hasRenderedMultiScatteringLut = true;\r\n }\r\n }\r\n\r\n if (!this._transmittanceLut!.isDirty && this._hasRenderedMultiScatteringLut) {\r\n this._diffuseSkyIrradianceLut?.render(); // Will only render if needed.\r\n }\r\n }\r\n\r\n /**\r\n * Binds the atmosphere's uniform buffer to an {@link Effect}.\r\n * @param effect - The {@link Effect} to bind the uniform buffer to.\r\n */\r\n public bindUniformBufferToEffect(effect: Effect): void {\r\n const uniformBuffer = this.uniformBuffer;\r\n const name = uniformBuffer.name;\r\n uniformBuffer.bindToEffect(effect, name);\r\n if (uniformBuffer.useUbo) {\r\n const engine = this.scene.getEngine();\r\n engine.bindUniformBufferBase(uniformBuffer.getBuffer()!, effect._uniformBuffersNames[name], name);\r\n } else {\r\n this._updateUniformBuffer();\r\n }\r\n }\r\n\r\n /**\r\n * Updates the atmosphere's uniform buffer.\r\n */\r\n private _updateUniformBuffer(): void {\r\n const physicalProperties = this._physicalProperties;\r\n const cameraAtmosphereVariables = this._cameraAtmosphereVariables;\r\n const ubo = this.uniformBuffer;\r\n\r\n ubo.updateVector3(\"peakRayleighScattering\", physicalProperties.rayleighScattering);\r\n ubo.updateFloat(\"planetRadius\", physicalProperties.planetRadius);\r\n ubo.updateVector3(\"peakMieScattering\", physicalProperties.mieScattering);\r\n ubo.updateFloat(\"atmosphereThickness\", physicalProperties.atmosphereThickness);\r\n ubo.updateVector3(\"peakMieAbsorption\", physicalProperties.mieAbsorption);\r\n ubo.updateFloat(\"planetRadiusSquared\", physicalProperties.planetRadiusSquared);\r\n ubo.updateVector3(\"peakMieExtinction\", physicalProperties.mieExtinction);\r\n ubo.updateFloat(\"atmosphereRadius\", physicalProperties.atmosphereRadius);\r\n ubo.updateVector3(\"peakOzoneAbsorption\", physicalProperties.ozoneAbsorption);\r\n ubo.updateFloat(\"atmosphereRadiusSquared\", physicalProperties.atmosphereRadiusSquared);\r\n ubo.updateFloat(\"horizonDistanceToAtmosphereEdge\", physicalProperties.horizonDistanceToAtmosphereEdge);\r\n ubo.updateFloat(\"horizonDistanceToAtmosphereEdgeSquared\", physicalProperties.horizonDistanceToAtmosphereEdgeSquared);\r\n ubo.updateFloat(\"planetRadiusWithOffset\", physicalProperties.planetRadiusWithOffset);\r\n ubo.updateFloat(\"planetRadiusOffset\", physicalProperties.planetRadiusOffset);\r\n ubo.updateFloat(\"aerialPerspectiveRadianceBias\", this._aerialPerspectiveRadianceBias);\r\n ubo.updateFloat(\"inverseAtmosphereThickness\", 1 / physicalProperties.atmosphereThickness);\r\n ubo.updateFloat(\"aerialPerspectiveTransmittanceScale\", this._aerialPerspectiveTransmittanceScale);\r\n ubo.updateMatrix(\"inverseViewProjectionWithoutTranslation\", cameraAtmosphereVariables.inverseViewProjectionMatrixWithoutTranslation);\r\n ubo.updateVector3(\"directionToLight\", this._directionToLight);\r\n ubo.updateFloat(\"multiScatteringIntensity\", this.multiScatteringIntensity);\r\n ubo.updateVector3(\"directionToLightRelativeToCameraGeocentricNormal\", cameraAtmosphereVariables.directionToLightRelativeToCameraGeocentricNormal);\r\n ubo.updateFloat(\"cameraRadius\", cameraAtmosphereVariables.cameraRadius);\r\n ubo.updateVector3(\"lightRadianceAtCamera\", this._lightRadianceAtCamera);\r\n ubo.updateFloat(\"diffuseSkyIrradianceDesaturationFactor\", this._diffuseSkyIrradianceDesaturationFactor);\r\n ubo.updateColor3(\"groundAlbedo\", this._groundAlbedo);\r\n ubo.updateFloat(\"aerialPerspectiveSaturation\", this._aerialPerspectiveSaturation);\r\n ubo.updateVector3(\"minMultiScattering\", this._minimumMultiScattering);\r\n ubo.updateFloat(\"diffuseSkyIrradianceIntensity\", this._diffuseSkyIrradianceIntensity);\r\n ubo.updateVector3(\"cameraPositionGlobal\", cameraAtmosphereVariables.cameraPositionGlobal);\r\n ubo.updateFloat(\"lightIntensity\", this.lights[0].intensity);\r\n ubo.updateVector3(\"clampedCameraPositionGlobal\", cameraAtmosphereVariables.clampedCameraPositionGlobal);\r\n ubo.updateFloat(\"aerialPerspectiveIntensity\", this._aerialPerspectiveIntensity);\r\n ubo.updateVector3(\"cameraGeocentricNormal\", cameraAtmosphereVariables.cameraGeocentricNormal);\r\n ubo.updateFloat(\"clampedCameraRadius\", cameraAtmosphereVariables.clampedCameraRadius);\r\n ubo.updateVector3(\"cameraForward\", cameraAtmosphereVariables.cameraForward);\r\n ubo.updateFloat(\"clampedCameraHeight\", cameraAtmosphereVariables.clampedCameraHeight);\r\n ubo.updateVector3(\"cameraPosition\", cameraAtmosphereVariables.cameraPosition);\r\n ubo.updateFloat(\"cosCameraHorizonAngleFromZenith\", cameraAtmosphereVariables.cosCameraHorizonAngleFromZenith);\r\n ubo.updateVector4(\"viewport\", cameraAtmosphereVariables.viewport);\r\n ubo.updateColor3(\"additionalDiffuseSkyIrradiance\", this._additionalDiffuseSkyIrradiance);\r\n ubo.updateFloat(\"cameraHeight\", cameraAtmosphereVariables.cameraHeight);\r\n ubo.updateFloat(\"cameraNearPlane\", cameraAtmosphereVariables.cameraNearPlane);\r\n ubo.updateFloat(\"originHeight\", this._originHeight);\r\n ubo.updateFloat(\"sinCameraAtmosphereHorizonAngleFromNadir\", cameraAtmosphereVariables.sinCameraAtmosphereHorizonAngleFromNadir);\r\n ubo.updateFloat(\"atmosphereExposure\", this._exposure);\r\n ubo.update();\r\n }\r\n\r\n /**\r\n * Draws the aerial perspective LUT using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawAerialPerspectiveLut(): void {\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget;\r\n DrawEffect(\r\n this._engine,\r\n this._effectRenderer!,\r\n this._aerialPerspectiveLutEffectWrapper,\r\n this._aerialPerspectiveLutRenderTarget,\r\n (effectRenderer, renderTarget, effect, engine) => {\r\n this.bindUniformBufferToEffect(effect);\r\n const layers = 32;\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n for (let layer = 0; layer < layers; layer++) {\r\n engine.bindFramebuffer(renderTarget!, undefined, undefined, undefined, true, undefined, layer);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setFloat(\"layerIdx\", layer);\r\n effectRenderer.draw();\r\n }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Draws the sky view LUT using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawSkyViewLut(): void {\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n DrawEffect(this._engine, this._effectRenderer!, this._skyViewLutEffectWrapper, this._skyViewLutRenderTarget, (effectRenderer, renderTarget, effect, engine) => {\r\n this.bindUniformBufferToEffect(effect);\r\n engine.bindFramebuffer(renderTarget!, undefined, undefined, undefined, true);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n effectRenderer.draw();\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Creates an {@link EffectWrapper} with the given parameters.\r\n * @param engine - The engine to use.\r\n * @param name - The name of the effect wrapper.\r\n * @param fragmentShader - The fragment shader source.\r\n * @param uniformNames - The uniform names to use.\r\n * @param samplerNames - The sampler names to use.\r\n * @param uniformBuffers - The uniform buffers to use.\r\n * @param defineNames - Array of define names to prepend with \"#define \".\r\n * @returns The effect wrapper.\r\n */\r\nconst CreateEffectWrapper = (\r\n engine: AbstractEngine,\r\n name: string,\r\n fragmentShader: string,\r\n uniformNames?: string[],\r\n samplerNames?: string[],\r\n uniformBuffers?: string[],\r\n defineNames?: string[]\r\n): EffectWrapper => {\r\n const defines = defineNames?.map((defineName) => `#define ${defineName}`) ?? [];\r\n\r\n return new EffectWrapper({\r\n engine,\r\n name,\r\n vertexShader: \"fullscreenTriangle\",\r\n fragmentShader,\r\n attributeNames: [\"position\"],\r\n uniformNames,\r\n uniformBuffers,\r\n samplerNames,\r\n defines,\r\n useShaderStore: true,\r\n });\r\n};\r\n\r\nconst CreateRenderTargetTexture = (\r\n name: string,\r\n size: number | { width: number; height: number; layers?: number },\r\n scene: Scene,\r\n options?: RenderTargetTextureOptions\r\n): RenderTargetTexture => {\r\n const rtOptions: RenderTargetTextureOptions = {\r\n generateMipMaps: false,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n gammaSpace: false,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n ...options,\r\n };\r\n const renderTarget = new RenderTargetTexture(name, size, scene, rtOptions);\r\n\r\n renderTarget.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n renderTarget.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n renderTarget.anisotropicFilteringLevel = 1;\r\n renderTarget.skipInitialClear = true;\r\n return renderTarget;\r\n};\r\n\r\n/**\r\n * Common setup and teardown for drawing LUTs or composition passes.\r\n * @param engine - The engine to use.\r\n * @param effectRenderer - The effect renderer to use.\r\n * @param effectWrapper - The effect wrapper to use.\r\n * @param renderTarget - The render target.\r\n * @param drawCallback - Callback function that performs the drawing.\r\n * @param depth - The depth value to set in the effect.\r\n * @param alphaMode - The alpha mode to set before drawing.\r\n * @param depthTest - Whether to enable depth testing.\r\n * @param depthWrite - Optional depth write state to set before drawing.\r\n * @param depthFunction - The depth function to set before drawing.\r\n * @param restoreDefaultFramebuffer - Whether to restore the default framebuffer after drawing.\r\n */\r\nconst DrawEffect = (\r\n engine: AbstractEngine,\r\n effectRenderer: EffectRenderer,\r\n effectWrapper: Nullable<EffectWrapper>,\r\n renderTarget: Nullable<RenderTargetTexture>,\r\n drawCallback: (effectRenderer: EffectRenderer, renderTarget: Nullable<RenderTargetWrapper>, effect: Effect, engine: AbstractEngine) => void,\r\n depth = 0,\r\n alphaMode = Constants.ALPHA_DISABLE,\r\n depthTest = true,\r\n depthWrite?: boolean,\r\n depthFunction = Constants.LEQUAL,\r\n restoreDefaultFramebuffer = true\r\n): void => {\r\n if ((renderTarget !== null && !renderTarget.isReady()) || !effectWrapper?.isReady()) {\r\n return;\r\n }\r\n\r\n // Set additional depth/stencil states before calling applyEffectWrapper.\r\n const currentDepthWrite = engine.getDepthWrite();\r\n if (depthWrite !== undefined) {\r\n engine.setDepthWrite(depthWrite);\r\n }\r\n const currentDepthFunction = engine.getDepthFunction();\r\n engine.setDepthFunction(depthFunction);\r\n\r\n // Likewise with the alpha mode, which can affect depth state too.\r\n const currentAlphaMode = engine.getAlphaMode();\r\n if (alphaMode !== Constants.ALPHA_DISABLE) {\r\n engine.setAlphaMode(alphaMode);\r\n }\r\n\r\n effectRenderer.saveStates();\r\n effectRenderer.setViewport();\r\n effectRenderer.applyEffectWrapper(effectWrapper, depthTest); // Note, stencil is false by default.\r\n\r\n const effect = effectWrapper.effect;\r\n\r\n effect.setFloat(\"depth\", depth);\r\n\r\n // Call the specific drawing logic.\r\n drawCallback(effectRenderer, renderTarget?.renderTarget!, effect, engine);\r\n\r\n // Restore state (order matters!)\r\n engine.setAlphaMode(currentAlphaMode);\r\n if (currentDepthWrite !== undefined) {\r\n engine.setDepthWrite(currentDepthWrite);\r\n }\r\n if (currentDepthFunction) {\r\n engine.setDepthFunction(currentDepthFunction);\r\n }\r\n effectRenderer.restoreStates();\r\n\r\n // And restore the default framebuffer.\r\n if (restoreDefaultFramebuffer) {\r\n engine.restoreDefaultFramebuffer();\r\n }\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the sky compositor.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @param isSkyViewLutEnabled - Whether the sky view LUT is enabled.\r\n * @param isLinearSpaceComposition - Whether composition is in linear space.\r\n * @param applyApproximateTransmittance - Whether to apply approximate transmittance.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateSkyCompositorEffectWrapper = (\r\n engine: AbstractEngine,\r\n uniformBuffer: UniformBuffer,\r\n isSkyViewLutEnabled: boolean,\r\n isLinearSpaceComposition: boolean,\r\n applyApproximateTransmittance: boolean\r\n): EffectWrapper => {\r\n const useUbo = uniformBuffer.useUbo;\r\n const defines = [\"COMPUTE_WORLD_RAY\"];\r\n if (isSkyViewLutEnabled) {\r\n defines.push(\"USE_SKY_VIEW_LUT\");\r\n }\r\n if (!isLinearSpaceComposition) {\r\n defines.push(\"OUTPUT_TO_SRGB\");\r\n }\r\n if (applyApproximateTransmittance) {\r\n defines.push(\"APPLY_TRANSMITTANCE_BLENDING\");\r\n }\r\n const textures = isSkyViewLutEnabled ? [\"skyViewLut\"] : [\"transmittanceLut\", \"multiScatteringLut\"];\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-skyCompositor\",\r\n \"compositeSky\",\r\n [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n textures,\r\n useUbo ? [uniformBuffer.name] : [],\r\n defines\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the aerial perspective LUT.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateAerialPerspectiveEffectWrapper = (engine: AbstractEngine, uniformBuffer: UniformBuffer): EffectWrapper =>\r\n CreateEffectWrapper(\r\n engine,\r\n \"atmo-aerialPerspective\",\r\n \"aerialPerspective\",\r\n [\"layerIdx\", \"depth\", ...(uniformBuffer.useUbo ? [] : uniformBuffer.getUniformNames())],\r\n [\"transmittanceLut\", \"multiScatteringLut\"],\r\n uniformBuffer.useUbo ? [uniformBuffer.name] : [],\r\n [\"COMPUTE_WORLD_RAY\"]\r\n );\r\n\r\n/**\r\n * Creates an EffectWrapper for the aerial perspective compositor.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer.\r\n * @param isAerialPerspectiveLutEnabled - Whether the aerial perspective LUT is enabled.\r\n * @param isSkyViewLutEnabled - Whether the sky view LUT is enabled.\r\n * @param isLinearSpaceComposition - Whether composition is in linear space.\r\n * @param applyApproximateTransmittance - Whether to apply approximate transmittance.\r\n * @param aerialPerspectiveIntensity - The aerial perspective intensity.\r\n * @param aerialPerspectiveRadianceBias - The aerial perspective radiance bias.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateAerialPerspectiveCompositorEffectWrapper = (\r\n engine: AbstractEngine,\r\n uniformBuffer: UniformBuffer,\r\n isAerialPerspectiveLutEnabled: boolean,\r\n isSkyViewLutEnabled: boolean,\r\n isLinearSpaceComposition: boolean,\r\n applyApproximateTransmittance: boolean,\r\n aerialPerspectiveIntensity: number,\r\n aerialPerspectiveRadianceBias: number\r\n): EffectWrapper => {\r\n const useUbo = uniformBuffer.useUbo;\r\n const defines = [\"COMPUTE_WORLD_RAY\"];\r\n if (isAerialPerspectiveLutEnabled) {\r\n defines.push(\"USE_AERIAL_PERSPECTIVE_LUT\");\r\n }\r\n if (isSkyViewLutEnabled) {\r\n defines.push(\"USE_SKY_VIEW_LUT\");\r\n }\r\n if (aerialPerspectiveIntensity !== 1) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_INTENSITY\");\r\n }\r\n if (!isLinearSpaceComposition) {\r\n defines.push(\"OUTPUT_TO_SRGB\");\r\n }\r\n if (applyApproximateTransmittance) {\r\n defines.push(\"APPLY_TRANSMITTANCE_BLENDING\");\r\n }\r\n if (aerialPerspectiveRadianceBias !== 0.0) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\");\r\n }\r\n\r\n const samplers = [\"transmittanceLut\", \"multiScatteringLut\", \"depthTexture\"];\r\n if (isSkyViewLutEnabled) {\r\n samplers.push(\"skyViewLut\");\r\n }\r\n if (isAerialPerspectiveLutEnabled) {\r\n samplers.push(\"aerialPerspectiveLut\");\r\n }\r\n\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-aerialPerspectiveCompositor\",\r\n \"compositeAerialPerspective\",\r\n [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n samplers,\r\n useUbo ? [uniformBuffer.name] : [],\r\n defines\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the globe atmosphere compositor.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @param isSkyViewLutEnabled - Whether the sky view LUT is enabled.\r\n * @param isLinearSpaceComposition - Whether composition is in linear space.\r\n * @param applyApproximateTransmittance - Whether to apply approximate transmittance.\r\n * @param aerialPerspectiveIntensity - The aerial perspective intensity.\r\n * @param aerialPerspectiveRadianceBias - The aerial perspective radiance bias.\r\n * @param hasDepthTexture - Whether a depth texture is available.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateGlobeAtmosphereCompositorEffectWrapper = (\r\n engine: AbstractEngine,\r\n uniformBuffer: UniformBuffer,\r\n isSkyViewLutEnabled: boolean,\r\n isLinearSpaceComposition: boolean,\r\n applyApproximateTransmittance: boolean,\r\n aerialPerspectiveIntensity: number,\r\n aerialPerspectiveRadianceBias: number,\r\n hasDepthTexture: boolean\r\n): EffectWrapper => {\r\n const useUbo = uniformBuffer.useUbo;\r\n const defines = [\"COMPUTE_WORLD_RAY\"];\r\n if (isSkyViewLutEnabled) {\r\n defines.push(\"USE_SKY_VIEW_LUT\");\r\n }\r\n if (aerialPerspectiveIntensity !== 1) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_INTENSITY\");\r\n }\r\n if (!isLinearSpaceComposition) {\r\n defines.push(\"OUTPUT_TO_SRGB\");\r\n }\r\n if (hasDepthTexture) {\r\n defines.push(\"HAS_DEPTH_TEXTURE\");\r\n }\r\n if (applyApproximateTransmittance) {\r\n defines.push(\"APPLY_TRANSMITTANCE_BLENDING\");\r\n }\r\n if (aerialPerspectiveRadianceBias !== 0.0) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\");\r\n }\r\n\r\n const samplers = [\"transmittanceLut\", \"multiScatteringLut\"];\r\n if (isSkyViewLutEnabled) {\r\n samplers.push(\"skyViewLut\");\r\n }\r\n if (hasDepthTexture) {\r\n samplers.push(\"depthTexture\");\r\n }\r\n\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-globeAtmosphereCompositor\",\r\n \"compositeGlobeAtmosphere\",\r\n [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n samplers,\r\n useUbo ? [uniformBuffer.name] : [],\r\n defines\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the sky view LUT.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateSkyViewEffectWrapper = (engine: AbstractEngine, uniformBuffer: UniformBuffer): EffectWrapper =>\r\n CreateEffectWrapper(\r\n engine,\r\n \"atmo-skyView\",\r\n \"skyView\",\r\n [\"depth\", ...(uniformBuffer.useUbo ? [] : uniformBuffer.getUniformNames())],\r\n [\"transmittanceLut\", \"multiScatteringLut\"],\r\n uniformBuffer.useUbo ? [uniformBuffer.name] : []\r\n );\r\n"]}
|
|
1
|
+
{"version":3,"file":"atmosphere.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/atmosphere.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// MIT License\r\n\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { AtmospherePBRMaterialPlugin } from \"./atmospherePBRMaterialPlugin\";\r\nimport { AtmospherePerCameraVariables } from \"./atmospherePerCameraVariables\";\r\nimport { AtmospherePhysicalProperties } from \"./atmospherePhysicalProperties\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { DeepImmutable, Nullable } from \"core/types\";\r\nimport { DiffuseSkyIrradianceLut } from \"./diffuseSkyIrradianceLut\";\r\nimport type { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport type { Effect } from \"core/Materials/effect\";\r\nimport { EffectRenderer, EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport type { IAtmosphereOptions } from \"./atmosphereOptions\";\r\nimport type { IColor3Like, IVector3Like } from \"core/Maths/math.like\";\r\nimport type { IDisposable, Scene } from \"core/scene\";\r\nimport { Observable, type Observer } from \"core/Misc/observable\";\r\nimport { RegisterMaterialPlugin, UnregisterMaterialPlugin } from \"core/Materials/materialPluginManager\";\r\nimport type { RenderingGroupInfo } from \"core/Rendering/renderingManager\";\r\nimport { RenderTargetTexture, type RenderTargetTextureOptions } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { TransmittanceLut } from \"./transmittanceLut\";\r\nimport { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport \"./Shaders/compositeAerialPerspective.fragment\";\r\nimport \"./Shaders/compositeSky.fragment\";\r\nimport \"./Shaders/compositeGlobeAtmosphere.fragment\";\r\nimport \"./Shaders/fullscreenTriangle.vertex\";\r\nimport \"./Shaders/multiScattering.fragment\";\r\nimport \"./Shaders/skyView.fragment\";\r\nimport \"./Shaders/aerialPerspective.fragment\";\r\nimport \"./Shaders/ShadersInclude/atmosphereFragmentDeclaration\";\r\nimport \"./Shaders/ShadersInclude/atmosphereFunctions\";\r\nimport \"./Shaders/ShadersInclude/atmosphereUboDeclaration\";\r\nimport \"./Shaders/ShadersInclude/atmosphereVertexDeclaration\";\r\nimport \"./Shaders/ShadersInclude/depthFunctions\";\r\n\r\nconst MaterialPlugin = \"atmo-pbr\";\r\n\r\n/**\r\n * Renders a physically based atmosphere.\r\n * Use {@link IsSupported} to check if the atmosphere is supported before creating an instance.\r\n * @experimental\r\n */\r\nexport class Atmosphere implements IDisposable {\r\n private readonly _directionToLight = Vector3.Zero();\r\n private readonly _tempSceneAmbient = new Color3();\r\n private readonly _engine: AbstractEngine;\r\n private _physicalProperties: AtmospherePhysicalProperties;\r\n private _transmittanceLut: Nullable<TransmittanceLut>;\r\n private _diffuseSkyIrradianceLut: Nullable<DiffuseSkyIrradianceLut>;\r\n private _isSkyViewLutEnabled: boolean;\r\n private _isAerialPerspectiveLutEnabled: boolean;\r\n private _aerialPerspectiveTransmittanceScale: number;\r\n private _aerialPerspectiveSaturation: number;\r\n private _aerialPerspectiveIntensity: number;\r\n private _aerialPerspectiveRadianceBias: number;\r\n private _diffuseSkyIrradianceDesaturationFactor: number;\r\n private _additionalDiffuseSkyIrradianceIntensity: number;\r\n private _additionalDiffuseSkyIrradianceColor: Color3;\r\n private _additionalDiffuseSkyIrradiance = new Color3();\r\n private _diffuseSkyIrradianceIntensity: number;\r\n private _multiScatteringIntensity: number;\r\n private _groundAlbedo: Color3;\r\n private _minimumMultiScatteringColor: Color3;\r\n private _minimumMultiScatteringIntensity: number;\r\n private _lights: DirectionalLight[];\r\n private _atmosphereUbo: Nullable<UniformBuffer> = null;\r\n private _minimumMultiScattering = new Vector3();\r\n private _cameraAtmosphereVariables = new AtmospherePerCameraVariables();\r\n private _isLinearSpaceComposition: boolean;\r\n private _isLinearSpaceLight: boolean;\r\n private _lightRadianceAtCamera = new Vector3();\r\n private _linearLightColor = new Color3();\r\n private _originHeight: number;\r\n private _applyApproximateTransmittance: boolean;\r\n private _exposure: number;\r\n private _atmosphereUniformBufferAsArray: UniformBuffer[] = [];\r\n private _effectRenderer: Nullable<EffectRenderer> = null;\r\n private _skyRenderingGroup: number;\r\n private _aerialPerspectiveRenderingGroup: number;\r\n private _globeAtmosphereRenderingGroup: number;\r\n private _isEnabled = true;\r\n\r\n private _hasRenderedMultiScatteringLut = false;\r\n private _multiScatteringEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _multiScatteringLutRenderTarget: Nullable<RenderTargetTexture> = null;\r\n\r\n private _aerialPerspectiveLutEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _aerialPerspectiveLutEffectRenderer: Nullable<EffectRenderer> = null;\r\n private _aerialPerspectiveLutRenderTarget: Nullable<RenderTargetTexture> = null;\r\n\r\n private _skyViewLutEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _skyViewLutEffectRenderer: Nullable<EffectRenderer> = null;\r\n private _skyViewLutRenderTarget: Nullable<RenderTargetTexture> = null;\r\n\r\n private _aerialPerspectiveCompositorEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _skyCompositorEffectWrapper: Nullable<EffectWrapper> = null;\r\n private _globeAtmosphereCompositorEffectWrapper: Nullable<EffectWrapper> = null;\r\n\r\n private _onBeforeCameraRenderObserver: Nullable<Observer<Camera>> = null;\r\n private _onBeforeDrawPhaseObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterRenderingGroupObserver: Nullable<Observer<RenderingGroupInfo>> = null;\r\n\r\n /**\r\n * Checks if the {@link Atmosphere} is supported.\r\n * @param engine - The engine to check.\r\n * @returns True if the atmosphere is supported, false otherwise.\r\n */\r\n public static IsSupported(engine: AbstractEngine): boolean {\r\n return !engine._badOS && !engine.isWebGPU && engine.version >= 2;\r\n }\r\n\r\n /**\r\n * Called after the atmosphere variables have been updated for the specified camera.\r\n */\r\n public readonly onAfterUpdateVariablesForCameraObservable = new Observable<Camera>();\r\n\r\n /**\r\n * Called immediately before the light variables are finalized.\r\n */\r\n public readonly onBeforeLightVariablesUpdateObservable = new Observable<void>();\r\n\r\n /**\r\n * Called before the LUTs are rendered for this camera. This happens after the per-camera UBO update.\r\n */\r\n public readonly onBeforeRenderLutsForCameraObservable = new Observable<void>();\r\n\r\n /**\r\n * Called after the LUTs were rendered.\r\n */\r\n public readonly onAfterRenderLutsForCameraObservable = new Observable<void>();\r\n\r\n /**\r\n * If provided, this is the depth texture used for composition passes.\r\n * Expects an infinite far plane on the camera (camera.maxZ = 0) and the non-linear depth accessible in red channel.\r\n * @internal\r\n */\r\n public readonly depthTexture: Nullable<BaseTexture> = null;\r\n\r\n /**\r\n * Controls the overall brightness of the atmosphere rendering.\r\n */\r\n public get exposure(): number {\r\n return this._exposure;\r\n }\r\n\r\n public set exposure(value: number) {\r\n this._exposure = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Affects the overall intensity of the multiple scattering.\r\n */\r\n public get multiScatteringIntensity(): number {\r\n return this._multiScatteringIntensity;\r\n }\r\n\r\n public set multiScatteringIntensity(value: number) {\r\n const newValue = Math.max(0.0, value);\r\n if (newValue !== this._multiScatteringIntensity) {\r\n this._multiScatteringIntensity = value;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Affects the multiply scattered light contribution in the atmosphere by describing the average light color reflected off the ground.\r\n */\r\n public get groundAlbedo(): DeepImmutable<IColor3Like> {\r\n return this._groundAlbedo;\r\n }\r\n\r\n public set groundAlbedo(value: DeepImmutable<IColor3Like>) {\r\n if (!this._groundAlbedo.equals(value)) {\r\n this._groundAlbedo.copyFrom(value);\r\n this._multiScatteringEffectWrapper?.dispose();\r\n this._multiScatteringEffectWrapper = null;\r\n this._hasRenderedMultiScatteringLut = false;\r\n }\r\n }\r\n\r\n /**\r\n * Can be used to clamp the multiple scattering to a minimum value.\r\n */\r\n public get minimumMultiScatteringColor(): DeepImmutable<IColor3Like> {\r\n return this._minimumMultiScatteringColor;\r\n }\r\n\r\n public set minimumMultiScatteringColor(value: DeepImmutable<IColor3Like>) {\r\n if (!this._minimumMultiScatteringColor.equals(value)) {\r\n const minimumScatteringColor = this._minimumMultiScatteringColor.copyFrom(value);\r\n this._minimumMultiScattering.x = minimumScatteringColor.r * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.y = minimumScatteringColor.g * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.z = minimumScatteringColor.b * this._minimumMultiScatteringIntensity;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * This is an additional scaling factor applied to the {@link minimumMultiScatteringColor}.\r\n */\r\n public get minimumMultiScatteringIntensity(): number {\r\n return this._minimumMultiScatteringIntensity;\r\n }\r\n\r\n public set minimumMultiScatteringIntensity(value: number) {\r\n const newValue = Math.max(0.0, value);\r\n if (newValue !== this._minimumMultiScatteringIntensity) {\r\n this._minimumMultiScatteringIntensity = value;\r\n this._minimumMultiScattering.x = this._minimumMultiScatteringColor.r * value;\r\n this._minimumMultiScattering.y = this._minimumMultiScatteringColor.g * value;\r\n this._minimumMultiScattering.z = this._minimumMultiScatteringColor.b * value;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Can be used to force the diffuse irradiance towards a gray color.\r\n */\r\n public get diffuseSkyIrradianceDesaturationFactor(): number {\r\n return this._diffuseSkyIrradianceDesaturationFactor;\r\n }\r\n\r\n public set diffuseSkyIrradianceDesaturationFactor(value: number) {\r\n const newValue = Math.max(value, 0.0);\r\n if (newValue !== this._diffuseSkyIrradianceDesaturationFactor) {\r\n this._diffuseSkyIrradianceDesaturationFactor = newValue;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * This is an additional amount of irradiance added to the diffuse irradiance.\r\n */\r\n public get additionalDiffuseSkyIrradianceIntensity(): number {\r\n return this._additionalDiffuseSkyIrradianceIntensity;\r\n }\r\n\r\n public set additionalDiffuseSkyIrradianceIntensity(value: number) {\r\n value = Math.max(0.0, value);\r\n if (value !== this._additionalDiffuseSkyIrradianceIntensity) {\r\n this._additionalDiffuseSkyIrradianceIntensity = value;\r\n this._additionalDiffuseSkyIrradianceColor.scaleToRef(value, this._additionalDiffuseSkyIrradiance);\r\n }\r\n }\r\n\r\n /**\r\n * This is the color for the additional amount of irradiance added to the diffuse irradiance.\r\n */\r\n public get additionalDiffuseSkyIrradianceColor(): DeepImmutable<IColor3Like> {\r\n return this._additionalDiffuseSkyIrradianceColor;\r\n }\r\n\r\n public set additionalDiffuseSkyIrradianceColor(value: DeepImmutable<IColor3Like>) {\r\n if (!this._additionalDiffuseSkyIrradianceColor.equals(value)) {\r\n this._additionalDiffuseSkyIrradianceColor.copyFrom(value).scaleToRef(this._additionalDiffuseSkyIrradianceIntensity, this._additionalDiffuseSkyIrradiance);\r\n }\r\n }\r\n\r\n /**\r\n * The final additional diffuse irradiance, taking into account the intensity and color.\r\n */\r\n public get additionalDiffuseSkyIrradiance(): DeepImmutable<IColor3Like> {\r\n return this._additionalDiffuseSkyIrradiance;\r\n }\r\n\r\n /**\r\n * The intensity of the diffuse irradiance.\r\n */\r\n public get diffuseSkyIrradianceIntensity(): number {\r\n return this._diffuseSkyIrradianceIntensity;\r\n }\r\n\r\n public set diffuseSkyIrradianceIntensity(value: number) {\r\n this._diffuseSkyIrradianceIntensity = Math.max(value, 0.0);\r\n }\r\n\r\n /**\r\n * True if the sky view LUT should be used for compositing the sky instead of a per-pixel ray march.\r\n */\r\n public get isSkyViewLutEnabled(): boolean {\r\n return this._isSkyViewLutEnabled;\r\n }\r\n\r\n public set isSkyViewLutEnabled(value: boolean) {\r\n this._isSkyViewLutEnabled = value;\r\n this._disposeSkyCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n\r\n /**\r\n * Gets the sky view LUT render target or null if not enabled.\r\n * @returns The render target.\r\n */\r\n public get skyViewLutRenderTarget(): Nullable<RenderTargetTexture> {\r\n if (!this._isSkyViewLutEnabled) {\r\n return null;\r\n }\r\n\r\n if (this._skyViewLutRenderTarget !== null) {\r\n return this._skyViewLutRenderTarget;\r\n }\r\n\r\n const renderTarget = (this._skyViewLutRenderTarget = CreateRenderTargetTexture(\"atmo-skyView\", { width: 128, height: 128 }, this.scene));\r\n renderTarget.coordinatesMode = Constants.TEXTURE_EQUIRECTANGULAR_MODE;\r\n\r\n this._skyViewLutEffectWrapper = CreateSkyViewEffectWrapper(this._engine, this.uniformBuffer);\r\n\r\n return renderTarget;\r\n }\r\n /**\r\n * True if the aerial perspective LUT should be used.\r\n * If false, full ray marching would be used instead.\r\n */\r\n public get isAerialPerspectiveLutEnabled(): boolean {\r\n return this._isAerialPerspectiveLutEnabled;\r\n }\r\n\r\n public set isAerialPerspectiveLutEnabled(value: boolean) {\r\n this._isAerialPerspectiveLutEnabled = value;\r\n this._disposeAerialPerspectiveCompositor();\r\n }\r\n\r\n /**\r\n * Gets the aerial perspective LUT render target or null if not enabled.\r\n * @returns The render target.\r\n */\r\n public get aerialPerspectiveLutRenderTarget(): Nullable<RenderTargetTexture> {\r\n if (!this._isAerialPerspectiveLutEnabled) {\r\n return null;\r\n }\r\n\r\n if (this._aerialPerspectiveLutRenderTarget !== null) {\r\n return this._aerialPerspectiveLutRenderTarget;\r\n }\r\n\r\n const scene = this.scene;\r\n const name = \"atmo-aerialPerspective\";\r\n const renderTarget = (this._aerialPerspectiveLutRenderTarget = CreateRenderTargetTexture(name, { width: 16, height: 64, layers: 32 }, scene, {}));\r\n this._aerialPerspectiveLutEffectWrapper = CreateAerialPerspectiveEffectWrapper(this._engine, this.uniformBuffer);\r\n\r\n return renderTarget;\r\n }\r\n\r\n /**\r\n * The intensity of the aerial perspective.\r\n */\r\n public get aerialPerspectiveIntensity(): number {\r\n return this._aerialPerspectiveIntensity;\r\n }\r\n\r\n public set aerialPerspectiveIntensity(value: number) {\r\n value = Math.max(0.001, value);\r\n if (value !== this._aerialPerspectiveIntensity) {\r\n // Define only needs to change if the value is changing between 1 and not 1.\r\n const hasDefineChanged = (value === 1) !== (this._aerialPerspectiveIntensity === 1);\r\n this._aerialPerspectiveIntensity = value;\r\n if (hasDefineChanged) {\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * The amount of light transmitted into aerial perspective.\r\n * A scale of 1 is physically correct.\r\n */\r\n public get aerialPerspectiveTransmittanceScale(): number {\r\n return this._aerialPerspectiveTransmittanceScale;\r\n }\r\n\r\n public set aerialPerspectiveTransmittanceScale(value: number) {\r\n value = Math.max(0, value);\r\n if (value !== this._aerialPerspectiveTransmittanceScale) {\r\n this._aerialPerspectiveTransmittanceScale = value;\r\n }\r\n }\r\n\r\n /**\r\n * The amount of saturation applied to the aerial perspective.\r\n * Reducing to zero desaturates the aerial perspective completely.\r\n * A value of 1 has no effect.\r\n */\r\n public get aerialPerspectiveSaturation(): number {\r\n return this._aerialPerspectiveSaturation;\r\n }\r\n\r\n public set aerialPerspectiveSaturation(value: number) {\r\n value = Math.max(0.0, value);\r\n if (value !== this._aerialPerspectiveSaturation) {\r\n this._aerialPerspectiveSaturation = value;\r\n }\r\n }\r\n\r\n /**\r\n * A radiance bias applied to aerial perspective.\r\n */\r\n public get aerialPerspectiveRadianceBias(): number {\r\n return this._aerialPerspectiveRadianceBias;\r\n }\r\n\r\n public set aerialPerspectiveRadianceBias(value: number) {\r\n if (value !== this._aerialPerspectiveRadianceBias) {\r\n // Define only needs to change if the value is changing between 0 and not 0.\r\n const hasDefineChanged = (value === 0) !== (this._aerialPerspectiveRadianceBias === 0);\r\n this._aerialPerspectiveRadianceBias = value;\r\n if (hasDefineChanged) {\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * True if the composition should be in linear space (e.g. for HDR rendering).\r\n * Typically linear space is expected when ImageProcessing is enabled via PostProcesses.\r\n * False for non-linear output.\r\n */\r\n public get isLinearSpaceComposition(): boolean {\r\n return this._isLinearSpaceComposition;\r\n }\r\n\r\n public set isLinearSpaceComposition(value: boolean) {\r\n if (value !== this._isLinearSpaceComposition) {\r\n this._isLinearSpaceComposition = value;\r\n // Note, LUTs will remain in linear space. Up to compositors to apply gamma if needed.\r\n this._disposeSkyCompositor();\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n\r\n /**\r\n * True if the {@link light} value should be specified in linear space.\r\n * If using PBRMaterials, light value is expected to be linear.\r\n */\r\n public get isLinearSpaceLight(): boolean {\r\n return this._isLinearSpaceLight;\r\n }\r\n\r\n public set isLinearSpaceLight(value: boolean) {\r\n this._isLinearSpaceLight = value;\r\n }\r\n\r\n /**\r\n * The lookup table for transmittance.\r\n */\r\n public get transmittanceLut(): Nullable<TransmittanceLut> {\r\n return this._transmittanceLut;\r\n }\r\n\r\n /**\r\n * Gets the multiple scattering LUT render target.\r\n * @returns The render target.\r\n */\r\n public get multiScatteringLutRenderTarget(): Nullable<RenderTargetTexture> {\r\n return this._multiScatteringLutRenderTarget;\r\n }\r\n\r\n /**\r\n * The lookup table for diffuse sky irradiance, or null if not enabled.\r\n */\r\n public get diffuseSkyIrradianceLut(): Nullable<DiffuseSkyIrradianceLut> {\r\n return this._diffuseSkyIrradianceLut;\r\n }\r\n\r\n /**\r\n * The properties used to describe the size and optical parameters of the atmosphere.\r\n */\r\n public get physicalProperties(): AtmospherePhysicalProperties {\r\n return this._physicalProperties;\r\n }\r\n\r\n /**\r\n * The height in kilometers of the scene's origin.\r\n */\r\n public get originHeight(): number {\r\n return this._originHeight;\r\n }\r\n\r\n public set originHeight(value: number) {\r\n this._originHeight = value;\r\n }\r\n\r\n /**\r\n * When atmospheric scattering is applied to surfaces, if this value is set to true,\r\n * a grayscale approximation of the transmittance is used to dim surfaces.\r\n *\r\n * When set to false, the atmospheric composition does not dim the surfaces behind it.\r\n * It is up to the client application to apply transmittance manually.\r\n */\r\n public get applyApproximateTransmittance(): boolean {\r\n return this._applyApproximateTransmittance;\r\n }\r\n\r\n public set applyApproximateTransmittance(value: boolean) {\r\n if (this._applyApproximateTransmittance !== value) {\r\n this._applyApproximateTransmittance = value;\r\n this._disposeSkyCompositor();\r\n this._disposeAerialPerspectiveCompositor();\r\n this._disposeGlobeAtmosphereCompositor();\r\n }\r\n }\r\n\r\n /**\r\n * The directional lights in the scene which represent the suns illuminating the atmosphere.\r\n * Each frame, the color and intensity of the lights are updated based on the camera position and the light's direction.\r\n */\r\n public get lights(): ReadonlyArray<DirectionalLight> {\r\n return this._lights;\r\n }\r\n\r\n /**\r\n * The rendering group ID for the sky compositor.\r\n * The sky will only be rendered for this group.\r\n */\r\n public get skyRenderingGroup(): number {\r\n return this._skyRenderingGroup;\r\n }\r\n\r\n public set skyRenderingGroup(value: number) {\r\n this._skyRenderingGroup = value;\r\n this.scene.renderingManager.getRenderingGroup(value);\r\n }\r\n\r\n /**\r\n * The rendering group ID for the aerial perspective compositor.\r\n * Aerial perspective will only be rendered for this group.\r\n */\r\n public get aerialPerspectiveRenderingGroup(): number {\r\n return this._aerialPerspectiveRenderingGroup;\r\n }\r\n\r\n public set aerialPerspectiveRenderingGroup(value: number) {\r\n this._aerialPerspectiveRenderingGroup = value;\r\n this.scene.renderingManager.getRenderingGroup(value);\r\n }\r\n\r\n /**\r\n * The rendering group ID for the globe atmosphere compositor.\r\n * The globe atmosphere will only be rendered for this group.\r\n */\r\n public get globeAtmosphereRenderingGroup(): number {\r\n return this._globeAtmosphereRenderingGroup;\r\n }\r\n\r\n public set globeAtmosphereRenderingGroup(value: number) {\r\n this._globeAtmosphereRenderingGroup = value;\r\n this.scene.renderingManager.getRenderingGroup(value);\r\n }\r\n\r\n /**\r\n * Gets the uniform buffer used to store the atmosphere's physical properties.\r\n */\r\n public get uniformBuffer(): UniformBuffer {\r\n if (this._atmosphereUbo === null) {\r\n const atmosphereUbo = (this._atmosphereUbo = new UniformBuffer(this._engine, undefined, true, \"Atmosphere\"));\r\n atmosphereUbo.addUniform(\"peakRayleighScattering\", 3);\r\n atmosphereUbo.addUniform(\"planetRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakMieScattering\", 3);\r\n atmosphereUbo.addUniform(\"atmosphereThickness\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakMieAbsorption\", 3);\r\n atmosphereUbo.addUniform(\"planetRadiusSquared\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakMieExtinction\", 3);\r\n atmosphereUbo.addUniform(\"atmosphereRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"peakOzoneAbsorption\", 3);\r\n atmosphereUbo.addUniform(\"atmosphereRadiusSquared\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"horizonDistanceToAtmosphereEdge\", 1);\r\n atmosphereUbo.addUniform(\"horizonDistanceToAtmosphereEdgeSquared\", 1);\r\n atmosphereUbo.addUniform(\"planetRadiusWithOffset\", 1);\r\n atmosphereUbo.addUniform(\"planetRadiusOffset\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"atmosphereExposure\", 1);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveRadianceBias\", 1);\r\n atmosphereUbo.addUniform(\"inverseAtmosphereThickness\", 1);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveTransmittanceScale\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"inverseViewProjectionWithoutTranslation\", 16);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"directionToLight\", 3);\r\n atmosphereUbo.addUniform(\"multiScatteringIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"directionToLightRelativeToCameraGeocentricNormal\", 3);\r\n atmosphereUbo.addUniform(\"cameraRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"lightRadianceAtCamera\", 3);\r\n atmosphereUbo.addUniform(\"diffuseSkyIrradianceDesaturationFactor\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"groundAlbedo\", 3);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveSaturation\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"minMultiScattering\", 3);\r\n atmosphereUbo.addUniform(\"diffuseSkyIrradianceIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraPositionGlobal\", 3);\r\n atmosphereUbo.addUniform(\"lightIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"clampedCameraPositionGlobal\", 3);\r\n atmosphereUbo.addUniform(\"aerialPerspectiveIntensity\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraGeocentricNormal\", 3);\r\n atmosphereUbo.addUniform(\"clampedCameraRadius\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraForward\", 3);\r\n atmosphereUbo.addUniform(\"clampedCameraHeight\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraPosition\", 3);\r\n atmosphereUbo.addUniform(\"cosCameraHorizonAngleFromZenith\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"viewport\", 4);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"additionalDiffuseSkyIrradiance\", 3);\r\n atmosphereUbo.addUniform(\"cameraHeight\", 1);\r\n // 16-byte boundary\r\n atmosphereUbo.addUniform(\"cameraNearPlane\", 1);\r\n atmosphereUbo.addUniform(\"originHeight\", 1);\r\n atmosphereUbo.addUniform(\"sinCameraAtmosphereHorizonAngleFromNadir\", 1);\r\n atmosphereUbo.create();\r\n }\r\n return this._atmosphereUbo;\r\n }\r\n\r\n /**\r\n * Gets the camera-related variables for this atmosphere. Updated each frame.\r\n */\r\n public get cameraAtmosphereVariables(): AtmospherePerCameraVariables {\r\n return this._cameraAtmosphereVariables;\r\n }\r\n\r\n // These fields and properties are used to interop with the inspector and not meant to be part of the API.\r\n\r\n private _peakRayleighScatteringMmInternal = new Vector3();\r\n private _peakRayleighScatteringKm = new Vector3();\r\n private _peakMieScatteringMmInternal = new Vector3();\r\n private _peakMieScatteringKm = new Vector3();\r\n private _peakMieAbsorptionMmInternal = new Vector3();\r\n private _peakMieAbsorptionKm = new Vector3();\r\n private _peakOzoneAbsorptionMmInternal = new Vector3();\r\n private _peakOzoneAbsorptionKm = new Vector3();\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _planetRadius(): number {\r\n return this._physicalProperties.planetRadius;\r\n }\r\n private set _planetRadius(value: number) {\r\n this._physicalProperties.planetRadius = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _planetRadiusOffset(): number {\r\n return this._physicalProperties.planetRadiusOffset;\r\n }\r\n private set _planetRadiusOffset(value: number) {\r\n this._physicalProperties.planetRadiusOffset = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _atmosphereThickness(): number {\r\n return this._physicalProperties.atmosphereThickness;\r\n }\r\n private set _atmosphereThickness(value: number) {\r\n this._physicalProperties.atmosphereThickness = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _rayleighScatteringScale(): number {\r\n return this._physicalProperties.rayleighScatteringScale;\r\n }\r\n private set _rayleighScatteringScale(value: number) {\r\n this._physicalProperties.rayleighScatteringScale = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _peakRayleighScatteringMm(): Vector3 {\r\n this._physicalProperties.peakRayleighScattering.scaleToRef(1000.0, this._peakRayleighScatteringMmInternal);\r\n return this._peakRayleighScatteringMmInternal;\r\n }\r\n private set _peakRayleighScatteringMm(value: Vector3) {\r\n this._peakRayleighScatteringMmInternal.copyFrom(value);\r\n this._peakRayleighScatteringMmInternal.scaleToRef(0.001, this._peakRayleighScatteringKm);\r\n this._physicalProperties.peakRayleighScattering = this._peakRayleighScatteringKm;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _mieScatteringScale(): number {\r\n return this._physicalProperties.mieScatteringScale;\r\n }\r\n private set _mieScatteringScale(value: number) {\r\n this._physicalProperties.mieScatteringScale = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _peakMieScatteringMm(): Vector3 {\r\n this._physicalProperties.peakMieScattering.scaleToRef(1000.0, this._peakMieScatteringMmInternal);\r\n return this._peakMieScatteringMmInternal;\r\n }\r\n private set _peakMieScatteringMm(value: Vector3) {\r\n this._peakMieScatteringMmInternal.copyFrom(value);\r\n this._peakMieScatteringMmInternal.scaleToRef(0.001, this._peakMieScatteringKm);\r\n this._physicalProperties.peakMieScattering = this._peakMieScatteringKm;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _mieAbsorptionScale(): number {\r\n return this._physicalProperties.mieAbsorptionScale;\r\n }\r\n private set _mieAbsorptionScale(value: number) {\r\n this._physicalProperties.mieAbsorptionScale = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _peakMieAbsorptionMm(): Vector3 {\r\n this._physicalProperties.peakMieAbsorption.scaleToRef(1000.0, this._peakMieAbsorptionMmInternal);\r\n return this._peakMieAbsorptionMmInternal;\r\n }\r\n private set _peakMieAbsorptionMm(value: Vector3) {\r\n this._peakMieAbsorptionMmInternal.copyFrom(value);\r\n this._peakMieAbsorptionMmInternal.scaleToRef(0.001, this._peakMieAbsorptionKm);\r\n this._physicalProperties.peakMieAbsorption = this._peakMieAbsorptionKm;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _ozoneAbsorptionScale(): number {\r\n return this._physicalProperties.ozoneAbsorptionScale;\r\n }\r\n private set _ozoneAbsorptionScale(value: number) {\r\n this._physicalProperties.ozoneAbsorptionScale = value;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n private get _peakOzoneAbsorptionMm(): Vector3 {\r\n this._physicalProperties.peakOzoneAbsorption.scaleToRef(1000.0, this._peakOzoneAbsorptionMmInternal);\r\n return this._peakOzoneAbsorptionMmInternal;\r\n }\r\n private set _peakOzoneAbsorptionMm(value: Vector3) {\r\n this._peakOzoneAbsorptionMmInternal.copyFrom(value);\r\n this._peakOzoneAbsorptionMmInternal.scaleToRef(0.001, this._peakOzoneAbsorptionKm);\r\n this._physicalProperties.peakOzoneAbsorption = this._peakOzoneAbsorptionKm;\r\n }\r\n\r\n /**\r\n * Constructs the {@link Atmosphere}.\r\n * @param name - The name of this instance.\r\n * @param scene - The scene to which the atmosphere will be added.\r\n * @param lights - The light sources that illuminate the atmosphere. Currently only supports one light, and that light should be the first light in the scene.\r\n * @param options - The options used to create the atmosphere.\r\n */\r\n public constructor(\r\n public readonly name: string,\r\n public readonly scene: Scene,\r\n lights: DirectionalLight[],\r\n options?: IAtmosphereOptions\r\n ) {\r\n const engine = (this._engine = scene.getEngine());\r\n if (engine.isWebGPU) {\r\n throw new Error(\"Atmosphere is not supported on WebGPU.\");\r\n }\r\n if (engine.version < 2) {\r\n throw new Error(`Atmosphere is not supported on WebGL ${engine.version}.`);\r\n }\r\n\r\n this._physicalProperties = options?.physicalProperties ?? new AtmospherePhysicalProperties();\r\n this._physicalProperties.onChangedObservable.add(() => {\r\n this._transmittanceLut?.markDirty();\r\n });\r\n\r\n if (lights.length !== 1) {\r\n throw new Error(\"Atmosphere only supports one light source currently.\");\r\n }\r\n this._lights = lights;\r\n\r\n this.depthTexture = options?.depthTexture ?? null;\r\n this._exposure = options?.exposure ?? 1.0;\r\n this._isLinearSpaceLight = options?.isLinearSpaceLight ?? false;\r\n this._isLinearSpaceComposition = options?.isLinearSpaceComposition ?? false;\r\n this._applyApproximateTransmittance = options?.applyApproximateTransmittance ?? true;\r\n this._aerialPerspectiveRadianceBias = options?.aerialPerspectiveRadianceBias ?? 0.0;\r\n this._aerialPerspectiveTransmittanceScale = options?.aerialPerspectiveTransmittanceScale ?? 1.0;\r\n this._aerialPerspectiveSaturation = options?.aerialPerspectiveSaturation ?? 1.0;\r\n this._aerialPerspectiveIntensity = options?.aerialPerspectiveIntensity ?? 1.0;\r\n this._diffuseSkyIrradianceDesaturationFactor = options?.diffuseSkyIrradianceDesaturationFactor ?? 0.5;\r\n this._diffuseSkyIrradianceIntensity = options?.diffuseSkyIrradianceIntensity ?? 1.0;\r\n this._additionalDiffuseSkyIrradianceIntensity = options?.additionalDiffuseSkyIrradianceIntensity ?? 0.01;\r\n this._multiScatteringIntensity = options?.multiScatteringIntensity ?? 1.0;\r\n this._minimumMultiScatteringIntensity = options?.minimumMultiScatteringIntensity ?? 0.000618;\r\n this._isSkyViewLutEnabled = options?.isSkyViewLutEnabled ?? true;\r\n this._isAerialPerspectiveLutEnabled = options?.isAerialPerspectiveLutEnabled ?? true;\r\n this._originHeight = options?.originHeight ?? 0;\r\n this._additionalDiffuseSkyIrradianceColor = options?.additionalDiffuseSkyIrradianceColor\r\n ? new Color3().copyFrom(options.additionalDiffuseSkyIrradianceColor)\r\n : new Color3(163 / 255.0, 199 / 255.0, 1.0);\r\n this._groundAlbedo = options?.groundAlbedo ? new Color3().copyFrom(options.groundAlbedo) : new Color3().set(124.0 / 255.0, 165.0 / 255.0, 1.0);\r\n const minimumMultiScatteringColor = (this._minimumMultiScatteringColor = options?.minimumMultiScatteringColor\r\n ? new Color3().copyFrom(options.minimumMultiScatteringColor)\r\n : new Color3(30.0 / 255.0, 40.0 / 255.0, 77.0 / 255.0));\r\n\r\n this._skyRenderingGroup = options?.skyRenderingGroup ?? 0;\r\n this._aerialPerspectiveRenderingGroup = options?.aerialPerspectiveRenderingGroup ?? 0;\r\n this._globeAtmosphereRenderingGroup = options?.globeAtmosphereRenderingGroup ?? 0;\r\n\r\n this._additionalDiffuseSkyIrradianceColor.scaleToRef(this._additionalDiffuseSkyIrradianceIntensity, this._additionalDiffuseSkyIrradiance);\r\n this._minimumMultiScattering.x = minimumMultiScatteringColor.r * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.y = minimumMultiScatteringColor.g * this._minimumMultiScatteringIntensity;\r\n this._minimumMultiScattering.z = minimumMultiScatteringColor.b * this._minimumMultiScatteringIntensity;\r\n\r\n this._effectRenderer = new EffectRenderer(engine, {\r\n // Full screen triangle.\r\n indices: [0, 2, 1],\r\n positions: [-1, -1, -1, 3, 3, -1],\r\n });\r\n\r\n this._transmittanceLut = new TransmittanceLut(this);\r\n this._multiScatteringLutRenderTarget = CreateRenderTargetTexture(\"atmo-multiScattering\", { width: 32, height: 32 }, scene);\r\n if (options?.isDiffuseSkyIrradianceLutEnabled ?? true) {\r\n this._diffuseSkyIrradianceLut = new DiffuseSkyIrradianceLut(this);\r\n }\r\n if (this._isSkyViewLutEnabled) {\r\n this.skyViewLutRenderTarget!;\r\n }\r\n if (this._isAerialPerspectiveLutEnabled) {\r\n this.aerialPerspectiveLutRenderTarget!;\r\n }\r\n\r\n // Before rendering, make sure the per-camera variables have been updated.\r\n this._onBeforeCameraRenderObserver = scene.onBeforeCameraRenderObservable.add((x) => {\r\n this._updatePerCameraVariables(x);\r\n this._renderLutsForCamera();\r\n });\r\n\r\n {\r\n const renderingManager = scene.renderingManager;\r\n if (this._skyRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._skyRenderingGroup);\r\n }\r\n if (this._aerialPerspectiveRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._aerialPerspectiveRenderingGroup);\r\n }\r\n if (this._globeAtmosphereRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._globeAtmosphereRenderingGroup);\r\n }\r\n\r\n // Mark all rendering groups as being \"not empty\" before rendering the corresponding targets.\r\n // This ensures onAfterRenderTargetsRenderObservable is called for empty groups,\r\n // which allows the atmosphere to be rendered even when the groups are otherwise empty e.g.,\r\n // a scene with only the atmosphere in it, and no other Meshes.\r\n this._onBeforeDrawPhaseObserver = scene.onBeforeDrawPhaseObservable.add(() => {\r\n if (this._skyRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._skyRenderingGroup)._empty = false;\r\n }\r\n if (this._aerialPerspectiveRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._aerialPerspectiveRenderingGroup)._empty = false;\r\n }\r\n if (this._globeAtmosphereRenderingGroup >= 0) {\r\n renderingManager.getRenderingGroup(this._globeAtmosphereRenderingGroup)._empty = false;\r\n }\r\n });\r\n\r\n // Draw compositors after the respective rendering group.\r\n this._onAfterRenderingGroupObserver = scene.onAfterRenderingGroupObservable.add((group) => {\r\n if (group.renderingManager !== scene.renderingManager) {\r\n return;\r\n }\r\n\r\n const groupId = group.renderingGroupId;\r\n\r\n if (this._skyRenderingGroup === groupId) {\r\n this.drawSkyCompositor();\r\n }\r\n\r\n if (this._aerialPerspectiveRenderingGroup === groupId) {\r\n this.drawAerialPerspectiveCompositor();\r\n }\r\n\r\n if (this._globeAtmosphereRenderingGroup === groupId) {\r\n this.drawGlobeAtmosphereCompositor();\r\n }\r\n });\r\n }\r\n\r\n // Ensure the atmosphere is disposed when the scene is disposed.\r\n scene.onDisposeObservable.addOnce(() => {\r\n this.dispose();\r\n });\r\n\r\n // Registers a material plugin which will allow common materials to sample the atmosphere environment maps e.g.,\r\n // sky view LUT for glossy reflections and diffuse sky illiminance LUT for irradiance.\r\n // It also handles aerial perspective application when Atmosphere is not provided with a depth texture.\r\n UnregisterMaterialPlugin(MaterialPlugin);\r\n RegisterMaterialPlugin(MaterialPlugin, (material) => {\r\n if (material.getClassName() === \"PBRMaterial\") {\r\n return new AtmospherePBRMaterialPlugin(material, this, this.depthTexture === null);\r\n }\r\n return null;\r\n });\r\n }\r\n\r\n /**\r\n * @override\r\n */\r\n public dispose(): void {\r\n this._onBeforeCameraRenderObserver?.remove();\r\n this._onBeforeCameraRenderObserver = null;\r\n this._onBeforeDrawPhaseObserver?.remove();\r\n this._onBeforeDrawPhaseObserver = null;\r\n this._onAfterRenderingGroupObserver?.remove();\r\n this._onAfterRenderingGroupObserver = null;\r\n this._globeAtmosphereCompositorEffectWrapper?.dispose();\r\n this._globeAtmosphereCompositorEffectWrapper = null;\r\n this._skyCompositorEffectWrapper?.dispose();\r\n this._skyCompositorEffectWrapper = null;\r\n this._aerialPerspectiveCompositorEffectWrapper?.dispose();\r\n this._aerialPerspectiveCompositorEffectWrapper = null;\r\n this._skyViewLutRenderTarget?.dispose();\r\n this._skyViewLutRenderTarget = null;\r\n this._skyViewLutEffectWrapper?.dispose();\r\n this._skyViewLutEffectWrapper = null;\r\n this._skyViewLutEffectRenderer?.dispose();\r\n this._skyViewLutEffectRenderer = null;\r\n this._aerialPerspectiveLutRenderTarget?.dispose();\r\n this._aerialPerspectiveLutRenderTarget = null;\r\n this._aerialPerspectiveLutEffectWrapper?.dispose();\r\n this._aerialPerspectiveLutEffectWrapper = null;\r\n this._aerialPerspectiveLutEffectRenderer?.dispose();\r\n this._aerialPerspectiveLutEffectRenderer = null;\r\n this._multiScatteringEffectWrapper?.dispose();\r\n this._multiScatteringEffectWrapper = null;\r\n this._multiScatteringLutRenderTarget?.dispose();\r\n this._multiScatteringLutRenderTarget = null;\r\n this._transmittanceLut?.dispose();\r\n this._transmittanceLut = null;\r\n this._diffuseSkyIrradianceLut?.dispose();\r\n this._diffuseSkyIrradianceLut = null;\r\n this._atmosphereUbo?.dispose();\r\n this._atmosphereUbo = null;\r\n this._effectRenderer?.dispose();\r\n this._effectRenderer = null;\r\n this._atmosphereUniformBufferAsArray.length = 0;\r\n\r\n UnregisterMaterialPlugin(MaterialPlugin);\r\n }\r\n\r\n /**\r\n * True if the atmosphere is enabled.\r\n * @returns - True if the atmosphere is enabled.\r\n */\r\n public isEnabled() {\r\n return this._isEnabled;\r\n }\r\n\r\n /**\r\n * Sets the enabled state of the atmosphere.\r\n * @param enabled - True to enable the atmosphere, false to disable it.\r\n */\r\n public setEnabled(enabled: boolean) {\r\n this._isEnabled = enabled;\r\n }\r\n\r\n /**\r\n * The class name of the {@link Atmosphere}.\r\n * @returns - The class name of the atmosphere.\r\n */\r\n public getClassName(): string {\r\n return \"Atmosphere\";\r\n }\r\n\r\n /**\r\n * Gets the color of a light after being transmitted through the atmosphere to a point specified by its distance to the planet center and its geocentric normal.\r\n * NOTE, the result is always a linear space color.\r\n * @param directionToLight - The direction of the light.\r\n * @param pointRadius - The distance from the planet center to the point in kilometers.\r\n * @param pointGeocentricNormal - The geocentric normal at the point i.e., normalize(point - planet center).\r\n * @param result - The color to store the result in.\r\n * @returns The result color.\r\n */\r\n public getTransmittedColorToRef = <T extends IColor3Like>(directionToLight: IVector3Like, pointRadius: number, pointGeocentricNormal: IVector3Like, result: T): T =>\r\n this._transmittanceLut!.getTransmittedColorToRef(directionToLight, pointRadius, pointGeocentricNormal, result);\r\n\r\n /**\r\n * Gets the diffuse sky irradiance. Result is always in linear space.\r\n * @param directionToLight - The direction of the point to the light.\r\n * @param pointRadius - The distance from the planet center to the point in kilometers.\r\n * @param pointGeocentricNormal - The geocentric normal at the point: normalize(point - planet center).\r\n * @param lightIrradiance - The irradiance of the light.\r\n * @param result - The color to store the result in.\r\n * @returns The result color.\r\n */\r\n public getDiffuseSkyIrradianceToRef = <T extends IColor3Like>(\r\n directionToLight: IVector3Like,\r\n pointRadius: number,\r\n pointGeocentricNormal: IVector3Like,\r\n lightIrradiance: number,\r\n result: T\r\n ): T =>\r\n this._diffuseSkyIrradianceLut?.getDiffuseSkyIrradianceToRef(directionToLight, pointRadius, pointGeocentricNormal, lightIrradiance, result) ??\r\n ((result.r = 0), (result.g = 0), (result.b = 0), result);\r\n\r\n /**\r\n * Creates a new {@link EffectWrapper} for the multiple scattering LUT\r\n * @returns The newly created {@link EffectWrapper}.\r\n */\r\n private _createMultiScatteringEffectWrapper(): EffectWrapper {\r\n const engine = this._engine;\r\n const name = \"atmo-multiScattering\";\r\n const ubo = this.uniformBuffer;\r\n const useUbo = ubo.useUbo;\r\n\r\n const defines: string[] = [\"#define POSITION_VEC2\"];\r\n if (!this._groundAlbedo.equals(Color3.BlackReadOnly)) {\r\n defines.push(\"#define USE_GROUND_ALBEDO\");\r\n }\r\n\r\n return new EffectWrapper({\r\n engine,\r\n name,\r\n vertexShader: \"fullscreenTriangle\",\r\n fragmentShader: \"multiScattering\",\r\n attributeNames: [\"position\"],\r\n uniformNames: [\"depth\", ...(useUbo ? [] : this.uniformBuffer.getUniformNames())],\r\n uniformBuffers: useUbo ? [this.uniformBuffer.name] : [],\r\n samplerNames: [\"transmittanceLut\"],\r\n defines,\r\n useShaderStore: true,\r\n });\r\n }\r\n\r\n /**\r\n * Draws the multiple scattering LUT using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawMultiScatteringLut(): void {\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n DrawEffect(\r\n this._engine,\r\n this._effectRenderer!,\r\n this._multiScatteringEffectWrapper,\r\n this._multiScatteringLutRenderTarget,\r\n (effectRenderer, renderTarget, effect, engine) => {\r\n this.bindUniformBufferToEffect(effect);\r\n engine.bindFramebuffer(renderTarget!, undefined, undefined, undefined, true);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effectRenderer.draw();\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Draws the aerial perspective compositor using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n public drawAerialPerspectiveCompositor(): void {\r\n // Only works if we have a depth texture.\r\n if (this.depthTexture === null) {\r\n return;\r\n }\r\n\r\n const isEnabled = this.isEnabled();\r\n if (!isEnabled) {\r\n return;\r\n }\r\n\r\n // Aerial perspective compositor only renders when inside the atmosphere.\r\n const isOutsideAtmosphere = this._cameraAtmosphereVariables.clampedCameraRadius > this._physicalProperties.atmosphereRadius;\r\n if (isOutsideAtmosphere) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n this._aerialPerspectiveCompositorEffectWrapper ??= CreateAerialPerspectiveCompositorEffectWrapper(\r\n engine,\r\n this.uniformBuffer,\r\n this._isAerialPerspectiveLutEnabled,\r\n this._isSkyViewLutEnabled,\r\n this._isLinearSpaceComposition,\r\n this._applyApproximateTransmittance,\r\n this._aerialPerspectiveIntensity,\r\n this._aerialPerspectiveRadianceBias\r\n );\r\n\r\n const skyViewLut = this._isSkyViewLutEnabled ? this.skyViewLutRenderTarget : null;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n const aerialPerspectiveLut = this._isAerialPerspectiveLutEnabled ? this.aerialPerspectiveLutRenderTarget : null;\r\n if (\r\n !this._aerialPerspectiveCompositorEffectWrapper.isReady() ||\r\n !(skyViewLut?.isReady() ?? true) ||\r\n !multiScatteringLut.isReady() ||\r\n !transmittanceLut.isReady() ||\r\n !(aerialPerspectiveLut?.isReady() ?? true) ||\r\n !this.depthTexture.isReady()\r\n ) {\r\n return;\r\n }\r\n\r\n DrawEffect(\r\n engine,\r\n this._effectRenderer!,\r\n this._aerialPerspectiveCompositorEffectWrapper,\r\n null, // No render target, it will render to the current buffer.\r\n (effectRenderer, _, effect) => {\r\n if (this.depthTexture === null) {\r\n throw new Error(\"Depth texture is required for aerial perspective compositor.\");\r\n }\r\n this.bindUniformBufferToEffect(effect);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n if (this._isSkyViewLutEnabled) {\r\n effect.setTexture(\"skyViewLut\", skyViewLut);\r\n }\r\n if (this._isAerialPerspectiveLutEnabled) {\r\n effect.setTexture(\"aerialPerspectiveLut\", aerialPerspectiveLut);\r\n }\r\n effect.setTexture(\"depthTexture\", this.depthTexture);\r\n effectRenderer.draw();\r\n },\r\n 1, // depth to use in the compositor.\r\n this.applyApproximateTransmittance ? Constants.ALPHA_PREMULTIPLIED_PORTERDUFF : Constants.ALPHA_ONEONE,\r\n true, // depthTest\r\n false, // depthWrite\r\n Constants.ALWAYS, // depthFunction\r\n false // restoreDefaultFramebuffer\r\n );\r\n }\r\n\r\n /**\r\n * Draws the sky compositor using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n public drawSkyCompositor(): void {\r\n const isEnabled = this.isEnabled();\r\n if (!isEnabled) {\r\n return;\r\n }\r\n\r\n // The sky compositor only renders when inside the atmosphere.\r\n const isOutsideAtmosphere = this._cameraAtmosphereVariables.clampedCameraRadius > this._physicalProperties.atmosphereRadius;\r\n if (isOutsideAtmosphere) {\r\n return;\r\n }\r\n\r\n if (this.depthTexture !== null && !this.depthTexture.isReady()) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n this._skyCompositorEffectWrapper ??= CreateSkyCompositorEffectWrapper(\r\n engine,\r\n this.uniformBuffer,\r\n this._isSkyViewLutEnabled,\r\n this._isLinearSpaceComposition,\r\n this._applyApproximateTransmittance\r\n );\r\n\r\n const skyViewLut = this._isSkyViewLutEnabled ? this.skyViewLutRenderTarget : null;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n if (!this._skyCompositorEffectWrapper.isReady() || !(skyViewLut?.isReady() ?? true) || !multiScatteringLut.isReady() || !transmittanceLut.isReady()) {\r\n return;\r\n }\r\n\r\n DrawEffect(\r\n engine,\r\n this._effectRenderer!,\r\n this._skyCompositorEffectWrapper,\r\n null, // No render target, it will render to the current buffer.\r\n (effectRenderer, _, effect) => {\r\n this.bindUniformBufferToEffect(effect);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n if (this._isSkyViewLutEnabled) {\r\n effect.setTexture(\"skyViewLut\", skyViewLut);\r\n }\r\n effectRenderer.draw();\r\n },\r\n 1, // depth to use in the compositor.\r\n this._applyApproximateTransmittance ? Constants.ALPHA_PREMULTIPLIED_PORTERDUFF : Constants.ALPHA_ONEONE,\r\n true, // depthTest\r\n false, // depthWrite\r\n Constants.EQUAL, // depthFunction\r\n false // restoreDefaultFramebuffer\r\n );\r\n }\r\n\r\n /**\r\n * Draws the globe atmosphere compositor using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n public drawGlobeAtmosphereCompositor(): void {\r\n const isEnabled = this.isEnabled();\r\n if (!isEnabled) {\r\n return;\r\n }\r\n\r\n // Globe atmosphere compositor only renders when outside the atmosphere.\r\n const isOutsideAtmosphere = this._cameraAtmosphereVariables.clampedCameraRadius > this._physicalProperties.atmosphereRadius;\r\n if (!isOutsideAtmosphere) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n this._globeAtmosphereCompositorEffectWrapper ??= CreateGlobeAtmosphereCompositorEffectWrapper(\r\n engine,\r\n this.uniformBuffer,\r\n this._isSkyViewLutEnabled,\r\n this._isLinearSpaceComposition,\r\n this._applyApproximateTransmittance,\r\n this._aerialPerspectiveIntensity,\r\n this._aerialPerspectiveRadianceBias,\r\n this.depthTexture !== null\r\n );\r\n\r\n const skyViewLut = this._isSkyViewLutEnabled ? this.skyViewLutRenderTarget : null;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n if (!this._globeAtmosphereCompositorEffectWrapper.isReady() || !(skyViewLut?.isReady() ?? true) || !multiScatteringLut.isReady() || !transmittanceLut.isReady()) {\r\n return;\r\n }\r\n\r\n if (this.depthTexture !== null && !this.depthTexture.isReady()) {\r\n return;\r\n }\r\n\r\n DrawEffect(\r\n engine,\r\n this._effectRenderer!,\r\n this._globeAtmosphereCompositorEffectWrapper,\r\n null, // No render target, it will render to the current buffer.\r\n (effectRenderer, _, effect) => {\r\n this.bindUniformBufferToEffect(effect);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n if (this._isSkyViewLutEnabled) {\r\n effect.setTexture(\"skyViewLut\", skyViewLut);\r\n }\r\n if (this.depthTexture !== null) {\r\n effect.setTexture(\"depthTexture\", this.depthTexture);\r\n }\r\n effectRenderer.draw();\r\n },\r\n 1, // depth to use in the compositor.\r\n this._applyApproximateTransmittance ? Constants.ALPHA_PREMULTIPLIED_PORTERDUFF : Constants.ALPHA_ONEONE,\r\n true, // depthTest\r\n false, // depthWrite\r\n Constants.ALWAYS, // depthFunction\r\n false // restoreDefaultFramebuffer\r\n );\r\n }\r\n\r\n private _disposeSkyCompositor(): void {\r\n this._skyCompositorEffectWrapper?.dispose();\r\n this._skyCompositorEffectWrapper = null;\r\n }\r\n\r\n private _disposeAerialPerspectiveCompositor(): void {\r\n this._aerialPerspectiveCompositorEffectWrapper?.dispose();\r\n this._aerialPerspectiveCompositorEffectWrapper = null;\r\n }\r\n\r\n private _disposeGlobeAtmosphereCompositor(): void {\r\n this._globeAtmosphereCompositorEffectWrapper?.dispose();\r\n this._globeAtmosphereCompositorEffectWrapper = null;\r\n }\r\n\r\n /**\r\n * Updates the camera variables that are specific to the atmosphere.\r\n * @param camera - The camera to update the variables for.\r\n */\r\n private _updatePerCameraVariables(camera: Camera): void {\r\n const light = this._lights[0];\r\n this._directionToLight.copyFrom(light.direction);\r\n this._directionToLight.scaleInPlace(-1);\r\n\r\n const properties = this._physicalProperties;\r\n const cameraAtmosphereVariables = this._cameraAtmosphereVariables;\r\n cameraAtmosphereVariables.update(\r\n camera,\r\n properties.planetRadius,\r\n properties.planetRadiusWithOffset,\r\n properties.atmosphereRadius,\r\n this._directionToLight,\r\n this.originHeight\r\n );\r\n\r\n this._transmittanceLut!.updateLightParameters(light, cameraAtmosphereVariables.clampedCameraRadius, cameraAtmosphereVariables.cameraGeocentricNormal);\r\n this._linearLightColor.copyFrom(light.diffuse);\r\n\r\n this.getDiffuseSkyIrradianceToRef(this._directionToLight, 0, cameraAtmosphereVariables.cameraGeocentricNormal, this.lights[0].intensity, this._tempSceneAmbient);\r\n if (!this.isLinearSpaceLight) {\r\n this._tempSceneAmbient.toGammaSpaceToRef(this._tempSceneAmbient);\r\n }\r\n this.scene.ambientColor = this._tempSceneAmbient;\r\n\r\n this.onAfterUpdateVariablesForCameraObservable.notifyObservers(camera);\r\n }\r\n\r\n /**\r\n * Renders the lookup tables, some of which can vary per-camera.\r\n * It is expected that updatePerCameraVariables was previously called.\r\n */\r\n private _renderLutsForCamera(): void {\r\n {\r\n this.onBeforeLightVariablesUpdateObservable.notifyObservers();\r\n\r\n const light = this.lights[0];\r\n if (!this.isLinearSpaceLight) {\r\n light.diffuse = light.diffuse.toGammaSpaceToRef(light.diffuse);\r\n light.specular = light.specular.toGammaSpaceToRef(light.specular);\r\n }\r\n const intensity = light.intensity;\r\n this._lightRadianceAtCamera.set(intensity * this._linearLightColor.r, intensity * this._linearLightColor.g, intensity * this._linearLightColor.b);\r\n }\r\n\r\n if (this.uniformBuffer.useUbo) {\r\n this.updateUniformBuffer();\r\n }\r\n\r\n // Render the LUTs.\r\n const isEnabled = this.isEnabled();\r\n {\r\n this.onBeforeRenderLutsForCameraObservable.notifyObservers();\r\n\r\n // After UBO update we can render the global LUTs which use some of these values on the GPU.\r\n // TODO: Could break out update and UBOs to global vs. per-camera.\r\n this.renderGlobalLuts();\r\n\r\n // If atmosphere is enabled, render the per-camera LUTs (sky view and aerial perspective).\r\n if (isEnabled && !this._transmittanceLut!.isDirty && this._hasRenderedMultiScatteringLut) {\r\n if (this._isSkyViewLutEnabled) {\r\n this._drawSkyViewLut();\r\n }\r\n\r\n // Only need to render aerial perspective LUT when inside the atmosphere.\r\n if (this._isAerialPerspectiveLutEnabled && this._cameraAtmosphereVariables.clampedCameraRadius <= this._physicalProperties.atmosphereRadius) {\r\n this._drawAerialPerspectiveLut();\r\n }\r\n }\r\n\r\n this.onAfterRenderLutsForCameraObservable.notifyObservers();\r\n }\r\n }\r\n\r\n /**\r\n * Renders the lookup tables that do not depend on a camera position.\r\n */\r\n public renderGlobalLuts(): void {\r\n const hasNewTransmittanceLut = this._transmittanceLut!.render();\r\n if (hasNewTransmittanceLut) {\r\n this._hasRenderedMultiScatteringLut = false;\r\n this._diffuseSkyIrradianceLut?.markDirty();\r\n }\r\n\r\n if (!this._transmittanceLut!.isDirty && !this._hasRenderedMultiScatteringLut) {\r\n this._multiScatteringEffectWrapper ??= this._createMultiScatteringEffectWrapper();\r\n if (this._multiScatteringEffectWrapper?.isReady() && this._multiScatteringLutRenderTarget?.isReady()) {\r\n this._drawMultiScatteringLut();\r\n this._hasRenderedMultiScatteringLut = true;\r\n }\r\n }\r\n\r\n if (!this._transmittanceLut!.isDirty && this._hasRenderedMultiScatteringLut) {\r\n this._diffuseSkyIrradianceLut?.render(); // Will only render if needed.\r\n }\r\n }\r\n\r\n /**\r\n * Binds the atmosphere's uniform buffer to an {@link Effect}.\r\n * @param effect - The {@link Effect} to bind the uniform buffer to.\r\n */\r\n public bindUniformBufferToEffect(effect: Effect): void {\r\n const uniformBuffer = this.uniformBuffer;\r\n const name = uniformBuffer.name;\r\n uniformBuffer.bindToEffect(effect, name);\r\n if (uniformBuffer.useUbo) {\r\n uniformBuffer.bindUniformBuffer();\r\n } else {\r\n this.updateUniformBuffer();\r\n }\r\n }\r\n\r\n /**\r\n * Updates the atmosphere's uniform buffer.\r\n */\r\n public updateUniformBuffer(): void {\r\n const physicalProperties = this._physicalProperties;\r\n const cameraAtmosphereVariables = this._cameraAtmosphereVariables;\r\n const ubo = this.uniformBuffer;\r\n\r\n ubo.updateVector3(\"peakRayleighScattering\", physicalProperties.rayleighScattering);\r\n ubo.updateFloat(\"planetRadius\", physicalProperties.planetRadius);\r\n ubo.updateVector3(\"peakMieScattering\", physicalProperties.mieScattering);\r\n ubo.updateFloat(\"atmosphereThickness\", physicalProperties.atmosphereThickness);\r\n ubo.updateVector3(\"peakMieAbsorption\", physicalProperties.mieAbsorption);\r\n ubo.updateFloat(\"planetRadiusSquared\", physicalProperties.planetRadiusSquared);\r\n ubo.updateVector3(\"peakMieExtinction\", physicalProperties.mieExtinction);\r\n ubo.updateFloat(\"atmosphereRadius\", physicalProperties.atmosphereRadius);\r\n ubo.updateVector3(\"peakOzoneAbsorption\", physicalProperties.ozoneAbsorption);\r\n ubo.updateFloat(\"atmosphereRadiusSquared\", physicalProperties.atmosphereRadiusSquared);\r\n ubo.updateFloat(\"horizonDistanceToAtmosphereEdge\", physicalProperties.horizonDistanceToAtmosphereEdge);\r\n ubo.updateFloat(\"horizonDistanceToAtmosphereEdgeSquared\", physicalProperties.horizonDistanceToAtmosphereEdgeSquared);\r\n ubo.updateFloat(\"planetRadiusWithOffset\", physicalProperties.planetRadiusWithOffset);\r\n ubo.updateFloat(\"planetRadiusOffset\", physicalProperties.planetRadiusOffset);\r\n ubo.updateFloat(\"aerialPerspectiveRadianceBias\", this._aerialPerspectiveRadianceBias);\r\n ubo.updateFloat(\"inverseAtmosphereThickness\", 1 / physicalProperties.atmosphereThickness);\r\n ubo.updateFloat(\"aerialPerspectiveTransmittanceScale\", this._aerialPerspectiveTransmittanceScale);\r\n ubo.updateMatrix(\"inverseViewProjectionWithoutTranslation\", cameraAtmosphereVariables.inverseViewProjectionMatrixWithoutTranslation);\r\n ubo.updateVector3(\"directionToLight\", this._directionToLight);\r\n ubo.updateFloat(\"multiScatteringIntensity\", this.multiScatteringIntensity);\r\n ubo.updateVector3(\"directionToLightRelativeToCameraGeocentricNormal\", cameraAtmosphereVariables.directionToLightRelativeToCameraGeocentricNormal);\r\n ubo.updateFloat(\"cameraRadius\", cameraAtmosphereVariables.cameraRadius);\r\n ubo.updateVector3(\"lightRadianceAtCamera\", this._lightRadianceAtCamera);\r\n ubo.updateFloat(\"diffuseSkyIrradianceDesaturationFactor\", this._diffuseSkyIrradianceDesaturationFactor);\r\n ubo.updateColor3(\"groundAlbedo\", this._groundAlbedo);\r\n ubo.updateFloat(\"aerialPerspectiveSaturation\", this._aerialPerspectiveSaturation);\r\n ubo.updateVector3(\"minMultiScattering\", this._minimumMultiScattering);\r\n ubo.updateFloat(\"diffuseSkyIrradianceIntensity\", this._diffuseSkyIrradianceIntensity);\r\n ubo.updateVector3(\"cameraPositionGlobal\", cameraAtmosphereVariables.cameraPositionGlobal);\r\n ubo.updateFloat(\"lightIntensity\", this.lights[0].intensity);\r\n ubo.updateVector3(\"clampedCameraPositionGlobal\", cameraAtmosphereVariables.clampedCameraPositionGlobal);\r\n ubo.updateFloat(\"aerialPerspectiveIntensity\", this._aerialPerspectiveIntensity);\r\n ubo.updateVector3(\"cameraGeocentricNormal\", cameraAtmosphereVariables.cameraGeocentricNormal);\r\n ubo.updateFloat(\"clampedCameraRadius\", cameraAtmosphereVariables.clampedCameraRadius);\r\n ubo.updateVector3(\"cameraForward\", cameraAtmosphereVariables.cameraForward);\r\n ubo.updateFloat(\"clampedCameraHeight\", cameraAtmosphereVariables.clampedCameraHeight);\r\n ubo.updateVector3(\"cameraPosition\", cameraAtmosphereVariables.cameraPosition);\r\n ubo.updateFloat(\"cosCameraHorizonAngleFromZenith\", cameraAtmosphereVariables.cosCameraHorizonAngleFromZenith);\r\n ubo.updateVector4(\"viewport\", cameraAtmosphereVariables.viewport);\r\n ubo.updateColor3(\"additionalDiffuseSkyIrradiance\", this._additionalDiffuseSkyIrradiance);\r\n ubo.updateFloat(\"cameraHeight\", cameraAtmosphereVariables.cameraHeight);\r\n ubo.updateFloat(\"cameraNearPlane\", cameraAtmosphereVariables.cameraNearPlane);\r\n ubo.updateFloat(\"originHeight\", this._originHeight);\r\n ubo.updateFloat(\"sinCameraAtmosphereHorizonAngleFromNadir\", cameraAtmosphereVariables.sinCameraAtmosphereHorizonAngleFromNadir);\r\n ubo.updateFloat(\"atmosphereExposure\", this._exposure);\r\n ubo.update();\r\n }\r\n\r\n /**\r\n * Draws the aerial perspective LUT using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawAerialPerspectiveLut(): void {\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget;\r\n DrawEffect(\r\n this._engine,\r\n this._effectRenderer!,\r\n this._aerialPerspectiveLutEffectWrapper,\r\n this._aerialPerspectiveLutRenderTarget,\r\n (effectRenderer, renderTarget, effect, engine) => {\r\n this.bindUniformBufferToEffect(effect);\r\n const layers = 32;\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n for (let layer = 0; layer < layers; layer++) {\r\n engine.bindFramebuffer(renderTarget!, undefined, undefined, undefined, true, undefined, layer);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setFloat(\"layerIdx\", layer);\r\n effectRenderer.draw();\r\n }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Draws the sky view LUT using {@link EffectWrapper} and {@link EffectRenderer}.\r\n */\r\n private _drawSkyViewLut(): void {\r\n const transmittanceLut = this._transmittanceLut!.renderTarget;\r\n const multiScatteringLut = this._multiScatteringLutRenderTarget!;\r\n DrawEffect(this._engine, this._effectRenderer!, this._skyViewLutEffectWrapper, this._skyViewLutRenderTarget, (effectRenderer, renderTarget, effect, engine) => {\r\n this.bindUniformBufferToEffect(effect);\r\n engine.bindFramebuffer(renderTarget!, undefined, undefined, undefined, true);\r\n effectRenderer.bindBuffers(effect);\r\n effect.setTexture(\"transmittanceLut\", transmittanceLut);\r\n effect.setTexture(\"multiScatteringLut\", multiScatteringLut);\r\n effectRenderer.draw();\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Creates an {@link EffectWrapper} with the given parameters.\r\n * @param engine - The engine to use.\r\n * @param name - The name of the effect wrapper.\r\n * @param fragmentShader - The fragment shader source.\r\n * @param uniformNames - The uniform names to use.\r\n * @param samplerNames - The sampler names to use.\r\n * @param uniformBuffers - The uniform buffers to use.\r\n * @param defineNames - Array of define names to prepend with \"#define \".\r\n * @returns The effect wrapper.\r\n */\r\nconst CreateEffectWrapper = (\r\n engine: AbstractEngine,\r\n name: string,\r\n fragmentShader: string,\r\n uniformNames?: string[],\r\n samplerNames?: string[],\r\n uniformBuffers?: string[],\r\n defineNames?: string[]\r\n): EffectWrapper => {\r\n const defines = defineNames?.map((defineName) => `#define ${defineName}`) ?? [];\r\n\r\n return new EffectWrapper({\r\n engine,\r\n name,\r\n vertexShader: \"fullscreenTriangle\",\r\n fragmentShader,\r\n attributeNames: [\"position\"],\r\n uniformNames,\r\n uniformBuffers,\r\n samplerNames,\r\n defines,\r\n useShaderStore: true,\r\n });\r\n};\r\n\r\nconst CreateRenderTargetTexture = (\r\n name: string,\r\n size: number | { width: number; height: number; layers?: number },\r\n scene: Scene,\r\n options?: RenderTargetTextureOptions\r\n): RenderTargetTexture => {\r\n const rtOptions: RenderTargetTextureOptions = {\r\n generateMipMaps: false,\r\n generateDepthBuffer: false,\r\n generateStencilBuffer: false,\r\n gammaSpace: false,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n ...options,\r\n };\r\n const renderTarget = new RenderTargetTexture(name, size, scene, rtOptions);\r\n\r\n renderTarget.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n renderTarget.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n renderTarget.anisotropicFilteringLevel = 1;\r\n renderTarget.skipInitialClear = true;\r\n return renderTarget;\r\n};\r\n\r\n/**\r\n * Common setup and teardown for drawing LUTs or composition passes.\r\n * @param engine - The engine to use.\r\n * @param effectRenderer - The effect renderer to use.\r\n * @param effectWrapper - The effect wrapper to use.\r\n * @param renderTarget - The render target.\r\n * @param drawCallback - Callback function that performs the drawing.\r\n * @param depth - The depth value to set in the effect.\r\n * @param alphaMode - The alpha mode to set before drawing.\r\n * @param depthTest - Whether to enable depth testing.\r\n * @param depthWrite - Optional depth write state to set before drawing.\r\n * @param depthFunction - The depth function to set before drawing.\r\n * @param restoreDefaultFramebuffer - Whether to restore the default framebuffer after drawing.\r\n */\r\nconst DrawEffect = (\r\n engine: AbstractEngine,\r\n effectRenderer: EffectRenderer,\r\n effectWrapper: Nullable<EffectWrapper>,\r\n renderTarget: Nullable<RenderTargetTexture>,\r\n drawCallback: (effectRenderer: EffectRenderer, renderTarget: Nullable<RenderTargetWrapper>, effect: Effect, engine: AbstractEngine) => void,\r\n depth = 0,\r\n alphaMode = Constants.ALPHA_DISABLE,\r\n depthTest = true,\r\n depthWrite?: boolean,\r\n depthFunction = Constants.LEQUAL,\r\n restoreDefaultFramebuffer = true\r\n): void => {\r\n if ((renderTarget !== null && !renderTarget.isReady()) || !effectWrapper?.isReady()) {\r\n return;\r\n }\r\n\r\n // Set additional depth/stencil states before calling applyEffectWrapper.\r\n const currentDepthWrite = engine.getDepthWrite();\r\n if (depthWrite !== undefined) {\r\n engine.setDepthWrite(depthWrite);\r\n }\r\n const currentDepthFunction = engine.getDepthFunction();\r\n engine.setDepthFunction(depthFunction);\r\n\r\n // Likewise with the alpha mode, which can affect depth state too.\r\n const currentAlphaMode = engine.getAlphaMode();\r\n if (alphaMode !== Constants.ALPHA_DISABLE) {\r\n engine.setAlphaMode(alphaMode);\r\n }\r\n\r\n effectRenderer.saveStates();\r\n effectRenderer.setViewport();\r\n effectRenderer.applyEffectWrapper(effectWrapper, depthTest); // Note, stencil is false by default.\r\n\r\n const effect = effectWrapper.effect;\r\n\r\n effect.setFloat(\"depth\", depth);\r\n\r\n // Call the specific drawing logic.\r\n drawCallback(effectRenderer, renderTarget?.renderTarget!, effect, engine);\r\n\r\n // Restore state (order matters!)\r\n engine.setAlphaMode(currentAlphaMode);\r\n if (currentDepthWrite !== undefined) {\r\n engine.setDepthWrite(currentDepthWrite);\r\n }\r\n if (currentDepthFunction) {\r\n engine.setDepthFunction(currentDepthFunction);\r\n }\r\n effectRenderer.restoreStates();\r\n\r\n // And restore the default framebuffer.\r\n if (restoreDefaultFramebuffer) {\r\n engine.restoreDefaultFramebuffer();\r\n }\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the sky compositor.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @param isSkyViewLutEnabled - Whether the sky view LUT is enabled.\r\n * @param isLinearSpaceComposition - Whether composition is in linear space.\r\n * @param applyApproximateTransmittance - Whether to apply approximate transmittance.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateSkyCompositorEffectWrapper = (\r\n engine: AbstractEngine,\r\n uniformBuffer: UniformBuffer,\r\n isSkyViewLutEnabled: boolean,\r\n isLinearSpaceComposition: boolean,\r\n applyApproximateTransmittance: boolean\r\n): EffectWrapper => {\r\n const useUbo = uniformBuffer.useUbo;\r\n const defines = [\"COMPUTE_WORLD_RAY\"];\r\n if (isSkyViewLutEnabled) {\r\n defines.push(\"USE_SKY_VIEW_LUT\");\r\n }\r\n if (!isLinearSpaceComposition) {\r\n defines.push(\"OUTPUT_TO_SRGB\");\r\n }\r\n if (applyApproximateTransmittance) {\r\n defines.push(\"APPLY_TRANSMITTANCE_BLENDING\");\r\n }\r\n const textures = isSkyViewLutEnabled ? [\"skyViewLut\"] : [\"transmittanceLut\", \"multiScatteringLut\"];\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-skyCompositor\",\r\n \"compositeSky\",\r\n [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n textures,\r\n useUbo ? [uniformBuffer.name] : [],\r\n defines\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the aerial perspective LUT.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateAerialPerspectiveEffectWrapper = (engine: AbstractEngine, uniformBuffer: UniformBuffer): EffectWrapper =>\r\n CreateEffectWrapper(\r\n engine,\r\n \"atmo-aerialPerspective\",\r\n \"aerialPerspective\",\r\n [\"layerIdx\", \"depth\", ...(uniformBuffer.useUbo ? [] : uniformBuffer.getUniformNames())],\r\n [\"transmittanceLut\", \"multiScatteringLut\"],\r\n uniformBuffer.useUbo ? [uniformBuffer.name] : [],\r\n [\"COMPUTE_WORLD_RAY\"]\r\n );\r\n\r\n/**\r\n * Creates an EffectWrapper for the aerial perspective compositor.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer.\r\n * @param isAerialPerspectiveLutEnabled - Whether the aerial perspective LUT is enabled.\r\n * @param isSkyViewLutEnabled - Whether the sky view LUT is enabled.\r\n * @param isLinearSpaceComposition - Whether composition is in linear space.\r\n * @param applyApproximateTransmittance - Whether to apply approximate transmittance.\r\n * @param aerialPerspectiveIntensity - The aerial perspective intensity.\r\n * @param aerialPerspectiveRadianceBias - The aerial perspective radiance bias.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateAerialPerspectiveCompositorEffectWrapper = (\r\n engine: AbstractEngine,\r\n uniformBuffer: UniformBuffer,\r\n isAerialPerspectiveLutEnabled: boolean,\r\n isSkyViewLutEnabled: boolean,\r\n isLinearSpaceComposition: boolean,\r\n applyApproximateTransmittance: boolean,\r\n aerialPerspectiveIntensity: number,\r\n aerialPerspectiveRadianceBias: number\r\n): EffectWrapper => {\r\n const useUbo = uniformBuffer.useUbo;\r\n const defines = [\"COMPUTE_WORLD_RAY\"];\r\n if (isAerialPerspectiveLutEnabled) {\r\n defines.push(\"USE_AERIAL_PERSPECTIVE_LUT\");\r\n }\r\n if (isSkyViewLutEnabled) {\r\n defines.push(\"USE_SKY_VIEW_LUT\");\r\n }\r\n if (aerialPerspectiveIntensity !== 1) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_INTENSITY\");\r\n }\r\n if (!isLinearSpaceComposition) {\r\n defines.push(\"OUTPUT_TO_SRGB\");\r\n }\r\n if (applyApproximateTransmittance) {\r\n defines.push(\"APPLY_TRANSMITTANCE_BLENDING\");\r\n }\r\n if (aerialPerspectiveRadianceBias !== 0.0) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\");\r\n }\r\n\r\n const samplers = [\"transmittanceLut\", \"multiScatteringLut\", \"depthTexture\"];\r\n if (isSkyViewLutEnabled) {\r\n samplers.push(\"skyViewLut\");\r\n }\r\n if (isAerialPerspectiveLutEnabled) {\r\n samplers.push(\"aerialPerspectiveLut\");\r\n }\r\n\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-aerialPerspectiveCompositor\",\r\n \"compositeAerialPerspective\",\r\n [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n samplers,\r\n useUbo ? [uniformBuffer.name] : [],\r\n defines\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the globe atmosphere compositor.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @param isSkyViewLutEnabled - Whether the sky view LUT is enabled.\r\n * @param isLinearSpaceComposition - Whether composition is in linear space.\r\n * @param applyApproximateTransmittance - Whether to apply approximate transmittance.\r\n * @param aerialPerspectiveIntensity - The aerial perspective intensity.\r\n * @param aerialPerspectiveRadianceBias - The aerial perspective radiance bias.\r\n * @param hasDepthTexture - Whether a depth texture is available.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateGlobeAtmosphereCompositorEffectWrapper = (\r\n engine: AbstractEngine,\r\n uniformBuffer: UniformBuffer,\r\n isSkyViewLutEnabled: boolean,\r\n isLinearSpaceComposition: boolean,\r\n applyApproximateTransmittance: boolean,\r\n aerialPerspectiveIntensity: number,\r\n aerialPerspectiveRadianceBias: number,\r\n hasDepthTexture: boolean\r\n): EffectWrapper => {\r\n const useUbo = uniformBuffer.useUbo;\r\n const defines = [\"COMPUTE_WORLD_RAY\"];\r\n if (isSkyViewLutEnabled) {\r\n defines.push(\"USE_SKY_VIEW_LUT\");\r\n }\r\n if (aerialPerspectiveIntensity !== 1) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_INTENSITY\");\r\n }\r\n if (!isLinearSpaceComposition) {\r\n defines.push(\"OUTPUT_TO_SRGB\");\r\n }\r\n if (hasDepthTexture) {\r\n defines.push(\"HAS_DEPTH_TEXTURE\");\r\n }\r\n if (applyApproximateTransmittance) {\r\n defines.push(\"APPLY_TRANSMITTANCE_BLENDING\");\r\n }\r\n if (aerialPerspectiveRadianceBias !== 0.0) {\r\n defines.push(\"APPLY_AERIAL_PERSPECTIVE_RADIANCE_BIAS\");\r\n }\r\n\r\n const samplers = [\"transmittanceLut\", \"multiScatteringLut\"];\r\n if (isSkyViewLutEnabled) {\r\n samplers.push(\"skyViewLut\");\r\n }\r\n if (hasDepthTexture) {\r\n samplers.push(\"depthTexture\");\r\n }\r\n\r\n return CreateEffectWrapper(\r\n engine,\r\n \"atmo-globeAtmosphereCompositor\",\r\n \"compositeGlobeAtmosphere\",\r\n [\"depth\", ...(useUbo ? [] : uniformBuffer.getUniformNames())],\r\n samplers,\r\n useUbo ? [uniformBuffer.name] : [],\r\n defines\r\n );\r\n};\r\n\r\n/**\r\n * Creates an EffectWrapper for the sky view LUT.\r\n * @param engine - The engine to use.\r\n * @param uniformBuffer - The uniform buffer to use.\r\n * @returns The created EffectWrapper.\r\n */\r\nconst CreateSkyViewEffectWrapper = (engine: AbstractEngine, uniformBuffer: UniformBuffer): EffectWrapper =>\r\n CreateEffectWrapper(\r\n engine,\r\n \"atmo-skyView\",\r\n \"skyView\",\r\n [\"depth\", ...(uniformBuffer.useUbo ? [] : uniformBuffer.getUniformNames())],\r\n [\"transmittanceLut\", \"multiScatteringLut\"],\r\n uniformBuffer.useUbo ? [uniformBuffer.name] : []\r\n );\r\n"]}
|
package/atmosphere/sampling.d.ts
CHANGED
|
@@ -12,4 +12,4 @@ import type { IColor4Like } from "@babylonjs/core/Maths/math.like.js";
|
|
|
12
12
|
* @param normalizeFunc - The function to normalize the texel values. Default is to divide by 255.
|
|
13
13
|
* @returns The result color.
|
|
14
14
|
*/
|
|
15
|
-
export declare
|
|
15
|
+
export declare function Sample2DRgbaToRef<T extends IColor4Like>(u: number, v: number, widthPx: number, heightPx: number, data: Uint8Array | Uint16Array | Float32Array, result: T, normalizeFunc?: (value: number) => number): T;
|
package/atmosphere/sampling.js
CHANGED
|
@@ -26,7 +26,14 @@ const TmpColor4 = MakeTempColor4Like();
|
|
|
26
26
|
* @param normalizeFunc - The function to normalize the texel values. Default is to divide by 255.
|
|
27
27
|
* @returns The result color.
|
|
28
28
|
*/
|
|
29
|
-
export
|
|
29
|
+
export function Sample2DRgbaToRef(u, v, widthPx, heightPx, data, result, normalizeFunc = (value) => value / 255.0) {
|
|
30
|
+
if (widthPx <= 0 || heightPx <= 0) {
|
|
31
|
+
throw new Error("Sample2DRgbaToRef: widthPx and heightPx must be positive.");
|
|
32
|
+
}
|
|
33
|
+
const expectedLength = widthPx * heightPx * 4;
|
|
34
|
+
if (data.length < expectedLength) {
|
|
35
|
+
throw new Error(`Sample2DRgbaToRef: data length (${data.length}) is less than required (${expectedLength}).`);
|
|
36
|
+
}
|
|
30
37
|
// Default to clamping behavior, but could support others.
|
|
31
38
|
u = Clamp(u);
|
|
32
39
|
v = Clamp(v);
|
|
@@ -57,7 +64,7 @@ export const Sample2DRgbaToRef = (u, v, widthPx, heightPx, data, result, normali
|
|
|
57
64
|
result.b = lowerLeftColor.b * w0 + lowerRightColor.b * w1 + upperLeftColor.b * w2 + upperRightColor.b * w3;
|
|
58
65
|
result.a = lowerLeftColor.a * w0 + lowerRightColor.a * w1 + upperLeftColor.a * w2 + upperRightColor.a * w3;
|
|
59
66
|
return result;
|
|
60
|
-
}
|
|
67
|
+
}
|
|
61
68
|
/**
|
|
62
69
|
* Fetches a texel from a 2D texture and stores the result in the given color.
|
|
63
70
|
* @param x - The x coordinate in texels.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/sampling.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,cAAc;AAEd,OAAO,EAAE,KAAK,EAAE,uDAAyC;AAGzD,MAAM,kBAAkB,GAAG,GAAgB,EAAE;IACzC,OAAO;QACH,CAAC,EAAE,MAAM,CAAC,GAAG;QACb,CAAC,EAAE,MAAM,CAAC,GAAG;QACb,CAAC,EAAE,MAAM,CAAC,GAAG;QACb,CAAC,EAAE,MAAM,CAAC,GAAG;KAChB,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;AACvC,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;AACvC,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;AACvC,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;AAEvC;;;;;;;;;;;;GAYG;AACH,MAAM,
|
|
1
|
+
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../../../../dev/addons/src/atmosphere/sampling.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// MIT License\r\n\r\nimport { Clamp } from \"core/Maths/math.scalar.functions\";\r\nimport type { IColor4Like } from \"core/Maths/math.like\";\r\n\r\nconst MakeTempColor4Like = (): IColor4Like => {\r\n return {\r\n r: Number.NaN,\r\n g: Number.NaN,\r\n b: Number.NaN,\r\n a: Number.NaN,\r\n };\r\n};\r\n\r\nconst TmpColor1 = MakeTempColor4Like();\r\nconst TmpColor2 = MakeTempColor4Like();\r\nconst TmpColor3 = MakeTempColor4Like();\r\nconst TmpColor4 = MakeTempColor4Like();\r\n\r\n/**\r\n * Samples the texture data at the given uv coordinate using bilinear interpolation.\r\n * Note this will not match GPU sampling behavior exactly.\r\n * Currently assumes clamping behavior.\r\n * @param u - The u coordinate to sample.\r\n * @param v - The v coordinate to sample.\r\n * @param widthPx - The width of the texture in texels.\r\n * @param heightPx - The height of the texture in texels.\r\n * @param data - The texture data to sample.\r\n * @param result - The color to store the sample.\r\n * @param normalizeFunc - The function to normalize the texel values. Default is to divide by 255.\r\n * @returns The result color.\r\n */\r\nexport function Sample2DRgbaToRef<T extends IColor4Like>(\r\n u: number,\r\n v: number,\r\n widthPx: number,\r\n heightPx: number,\r\n data: Uint8Array | Uint16Array | Float32Array,\r\n result: T,\r\n normalizeFunc = (value: number) => value / 255.0\r\n): T {\r\n if (widthPx <= 0 || heightPx <= 0) {\r\n throw new Error(\"Sample2DRgbaToRef: widthPx and heightPx must be positive.\");\r\n }\r\n\r\n const expectedLength = widthPx * heightPx * 4;\r\n if (data.length < expectedLength) {\r\n throw new Error(`Sample2DRgbaToRef: data length (${data.length}) is less than required (${expectedLength}).`);\r\n }\r\n\r\n // Default to clamping behavior, but could support others.\r\n u = Clamp(u);\r\n v = Clamp(v);\r\n\r\n // Compute 4 nearest neighbor texels.\r\n const fractionalTexelX = Math.max(u * widthPx - 0.5, 0);\r\n const fractionalTexelY = Math.max(v * heightPx - 0.5, 0);\r\n const xLeft = Math.floor(fractionalTexelX);\r\n const xRight = Math.min(xLeft + 1, widthPx - 1);\r\n const yBottom = Math.floor(fractionalTexelY);\r\n const yTop = Math.min(yBottom + 1, heightPx - 1);\r\n\r\n // Sample nearest neighbor texels.\r\n const lowerLeftColor = TexelFetch2DRgbaToRef(xLeft, yBottom, widthPx, heightPx, data, TmpColor1, normalizeFunc);\r\n const upperLeftColor = TexelFetch2DRgbaToRef(xLeft, yTop, widthPx, heightPx, data, TmpColor2, normalizeFunc);\r\n const lowerRightColor = TexelFetch2DRgbaToRef(xRight, yBottom, widthPx, heightPx, data, TmpColor3, normalizeFunc);\r\n const upperRightColor = TexelFetch2DRgbaToRef(xRight, yTop, widthPx, heightPx, data, TmpColor4, normalizeFunc);\r\n\r\n // Compute weights.\r\n const tX = fractionalTexelX - xLeft;\r\n const tY = fractionalTexelY - yBottom;\r\n const oneMinusTX = 1.0 - tX;\r\n const oneMinusTY = 1.0 - tY;\r\n const w0 = oneMinusTX * oneMinusTY;\r\n const w1 = tX * oneMinusTY;\r\n const w2 = oneMinusTX * tY;\r\n const w3 = tX * tY;\r\n\r\n // Compute the result.\r\n result.r = lowerLeftColor.r * w0 + lowerRightColor.r * w1 + upperLeftColor.r * w2 + upperRightColor.r * w3;\r\n result.g = lowerLeftColor.g * w0 + lowerRightColor.g * w1 + upperLeftColor.g * w2 + upperRightColor.g * w3;\r\n result.b = lowerLeftColor.b * w0 + lowerRightColor.b * w1 + upperLeftColor.b * w2 + upperRightColor.b * w3;\r\n result.a = lowerLeftColor.a * w0 + lowerRightColor.a * w1 + upperLeftColor.a * w2 + upperRightColor.a * w3;\r\n return result;\r\n}\r\n\r\n/**\r\n * Fetches a texel from a 2D texture and stores the result in the given color.\r\n * @param x - The x coordinate in texels.\r\n * @param y - The y coordinate in texels.\r\n * @param width - The width of the texture in texels.\r\n * @param height - The height of the texture in texels.\r\n * @param data - The texture data to sample from.\r\n * @param result - The color to store the sampled color in.\r\n * @param normalizeFunc - The function to normalize the texel values. Default is to divide by 255.\r\n * @returns The result color.\r\n */\r\nconst TexelFetch2DRgbaToRef = <T extends IColor4Like>(\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n data: Uint8Array | Uint16Array | Float32Array,\r\n result: T,\r\n normalizeFunc = (value: number) => value / 255.0\r\n): T => {\r\n const clampedTexelX = Clamp(x, 0, width - 1);\r\n const clampedTexelY = Clamp(y, 0, height - 1);\r\n const index = 4 * (clampedTexelY * width + clampedTexelX);\r\n result.r = normalizeFunc(data[index]);\r\n result.g = normalizeFunc(data[index + 1]);\r\n result.b = normalizeFunc(data[index + 2]);\r\n result.a = normalizeFunc(data[index + 3]);\r\n return result;\r\n};\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// MIT License
|
|
3
|
+
import { Sample2DRgbaToRef } from "../../sampling.js";
|
|
4
|
+
const Black = { r: 0, g: 0, b: 0, a: 1.0 };
|
|
5
|
+
const DarkGrey = { r: 0.25, g: 0.25, b: 0.25, a: 1.0 };
|
|
6
|
+
const Grey = { r: 0.5, g: 0.5, b: 0.5, a: 1.0 };
|
|
7
|
+
const White = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
|
|
8
|
+
const Red = { r: 1.0, g: 0.0, b: 0.0, a: 1.0 };
|
|
9
|
+
const Green = { r: 0.0, g: 1.0, b: 0.0, a: 1.0 };
|
|
10
|
+
const Blue = { r: 0.0, g: 0.0, b: 1.0, a: 1.0 };
|
|
11
|
+
expect.extend({
|
|
12
|
+
toBeApproxColor4Like(received, expected) {
|
|
13
|
+
const isEqual = Math.abs(received.r - expected.r) < 0.0001 &&
|
|
14
|
+
Math.abs(received.g - expected.g) < 0.0001 &&
|
|
15
|
+
Math.abs(received.b - expected.b) < 0.0001 &&
|
|
16
|
+
Math.abs(received.a - expected.a) < 0.0001;
|
|
17
|
+
return {
|
|
18
|
+
message: () => `expected ${JSON.stringify(received)} to be close to ${JSON.stringify(expected)}`,
|
|
19
|
+
pass: isEqual,
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
describe("textureSampler", () => {
|
|
24
|
+
test("testVertical2x2", () => {
|
|
25
|
+
const testData2x2 = new Float32Array([Black, Black, White, White].flatMap((x) => [x.r, x.g, x.b, x.a]));
|
|
26
|
+
const result = { r: 0, g: 0, b: 0, a: 0 };
|
|
27
|
+
Sample2DRgbaToRef(0.0, 0.0, 2, 2, testData2x2, result, (value) => value);
|
|
28
|
+
expect(result).toBeApproxColor4Like(Black);
|
|
29
|
+
Sample2DRgbaToRef(1.0, 0.25, 2, 2, testData2x2, result, (value) => value);
|
|
30
|
+
expect(result).toBeApproxColor4Like(Black);
|
|
31
|
+
Sample2DRgbaToRef(1.0, 0.375, 2, 2, testData2x2, result, (value) => value);
|
|
32
|
+
expect(result).toBeApproxColor4Like(DarkGrey);
|
|
33
|
+
Sample2DRgbaToRef(1.0, 0.5, 2, 2, testData2x2, result, (value) => value);
|
|
34
|
+
expect(result).toBeApproxColor4Like(Grey);
|
|
35
|
+
Sample2DRgbaToRef(0.5, 0.5, 2, 2, testData2x2, result, (value) => value);
|
|
36
|
+
expect(result).toBeApproxColor4Like(Grey);
|
|
37
|
+
Sample2DRgbaToRef(1.0, 1.0, 2, 2, testData2x2, result, (value) => value);
|
|
38
|
+
expect(result).toBeApproxColor4Like(White);
|
|
39
|
+
});
|
|
40
|
+
test("testVertical3x3", () => {
|
|
41
|
+
const testData2x2 = new Float32Array([Black, Black, White, White, White, White, White, White, White].flatMap((x) => [x.r, x.g, x.b, x.a]));
|
|
42
|
+
const result = { r: 0, g: 0, b: 0, a: 0 };
|
|
43
|
+
Sample2DRgbaToRef(0.33333333333, 0.33333333333, 3, 3, testData2x2, result, (value) => value);
|
|
44
|
+
expect(result).toBeApproxColor4Like(Grey);
|
|
45
|
+
});
|
|
46
|
+
test("testHorizontal2x2", () => {
|
|
47
|
+
const testData2x2 = new Float32Array([Black, White, Black, White].flatMap((x) => [x.r, x.g, x.b, x.a]));
|
|
48
|
+
const result = { r: 0, g: 0, b: 0, a: 0 };
|
|
49
|
+
Sample2DRgbaToRef(0.0, 0.0, 2, 2, testData2x2, result, (value) => value);
|
|
50
|
+
expect(result).toBeApproxColor4Like(Black);
|
|
51
|
+
Sample2DRgbaToRef(0.5, 1.0, 2, 2, testData2x2, result, (value) => value);
|
|
52
|
+
expect(result).toBeApproxColor4Like(Grey);
|
|
53
|
+
Sample2DRgbaToRef(0.5, 0.5, 2, 2, testData2x2, result, (value) => value);
|
|
54
|
+
expect(result).toBeApproxColor4Like(Grey);
|
|
55
|
+
Sample2DRgbaToRef(1.0, 1.0, 2, 2, testData2x2, result, (value) => value);
|
|
56
|
+
expect(result).toBeApproxColor4Like(White);
|
|
57
|
+
});
|
|
58
|
+
test("testDistinct2x2", () => {
|
|
59
|
+
const data = new Float32Array([Red, Green, Blue, White].flatMap((x) => [x.r, x.g, x.b, x.a]));
|
|
60
|
+
const result = { r: 0, g: 0, b: 0, a: 0 };
|
|
61
|
+
Sample2DRgbaToRef(0.25, 0.25, 2, 2, data, result, (v) => v);
|
|
62
|
+
expect(result).toBeApproxColor4Like({ r: 1.0, g: 0.0, b: 0.0, a: 1 });
|
|
63
|
+
Sample2DRgbaToRef(0.25, 0.75, 2, 2, data, result, (v) => v);
|
|
64
|
+
expect(result).toBeApproxColor4Like({ r: 0.0, g: 0.0, b: 1.0, a: 1 });
|
|
65
|
+
Sample2DRgbaToRef(0.75, 0.25, 2, 2, data, result, (v) => v);
|
|
66
|
+
expect(result).toBeApproxColor4Like({ r: 0.0, g: 1.0, b: 0.0, a: 1 });
|
|
67
|
+
Sample2DRgbaToRef(0.75, 0.75, 2, 2, data, result, (v) => v);
|
|
68
|
+
expect(result).toBeApproxColor4Like({ r: 1.0, g: 1.0, b: 1.0, a: 1 });
|
|
69
|
+
Sample2DRgbaToRef(0.5, 0.5, 2, 2, data, result, (v) => v);
|
|
70
|
+
expect(result).toBeApproxColor4Like({ r: 0.5, g: 0.5, b: 0.5, a: 1 });
|
|
71
|
+
Sample2DRgbaToRef(0.5, 0.0, 2, 2, data, result, (v) => v);
|
|
72
|
+
expect(result).toBeApproxColor4Like({ r: 0.5, g: 0.5, b: 0.0, a: 1 });
|
|
73
|
+
Sample2DRgbaToRef(0.0, 0.5, 2, 2, data, result, (v) => v);
|
|
74
|
+
expect(result).toBeApproxColor4Like({ r: 0.5, g: 0.0, b: 0.5, a: 1 });
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=sampling.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampling.test.js","sourceRoot":"","sources":["../../../../../../dev/addons/src/atmosphere/test/unit/sampling.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\r\n// MIT License\r\n\r\nimport { Sample2DRgbaToRef } from \"../../sampling\";\r\nimport type { IColor4Like } from \"core/Maths/math.like\";\r\n\r\nconst Black = { r: 0, g: 0, b: 0, a: 1.0 };\r\nconst DarkGrey = { r: 0.25, g: 0.25, b: 0.25, a: 1.0 };\r\nconst Grey = { r: 0.5, g: 0.5, b: 0.5, a: 1.0 };\r\nconst White = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };\r\nconst Red = { r: 1.0, g: 0.0, b: 0.0, a: 1.0 };\r\nconst Green = { r: 0.0, g: 1.0, b: 0.0, a: 1.0 };\r\nconst Blue = { r: 0.0, g: 0.0, b: 1.0, a: 1.0 };\r\n\r\nexpect.extend({\r\n toBeApproxColor4Like(received: IColor4Like, expected: IColor4Like) {\r\n const isEqual =\r\n Math.abs(received.r - expected.r) < 0.0001 &&\r\n Math.abs(received.g - expected.g) < 0.0001 &&\r\n Math.abs(received.b - expected.b) < 0.0001 &&\r\n Math.abs(received.a - expected.a) < 0.0001;\r\n return {\r\n message: () => `expected ${JSON.stringify(received)} to be close to ${JSON.stringify(expected)}`,\r\n pass: isEqual,\r\n };\r\n },\r\n});\r\n\r\ndescribe(\"textureSampler\", () => {\r\n test(\"testVertical2x2\", () => {\r\n const testData2x2 = new Float32Array([Black, Black, White, White].flatMap((x) => [x.r, x.g, x.b, x.a]));\r\n\r\n const result = { r: 0, g: 0, b: 0, a: 0 };\r\n Sample2DRgbaToRef(0.0, 0.0, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Black);\r\n\r\n Sample2DRgbaToRef(1.0, 0.25, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Black);\r\n\r\n Sample2DRgbaToRef(1.0, 0.375, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(DarkGrey);\r\n\r\n Sample2DRgbaToRef(1.0, 0.5, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Grey);\r\n\r\n Sample2DRgbaToRef(0.5, 0.5, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Grey);\r\n\r\n Sample2DRgbaToRef(1.0, 1.0, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(White);\r\n });\r\n test(\"testVertical3x3\", () => {\r\n const testData2x2 = new Float32Array([Black, Black, White, White, White, White, White, White, White].flatMap((x) => [x.r, x.g, x.b, x.a]));\r\n\r\n const result = { r: 0, g: 0, b: 0, a: 0 };\r\n Sample2DRgbaToRef(0.33333333333, 0.33333333333, 3, 3, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Grey);\r\n });\r\n test(\"testHorizontal2x2\", () => {\r\n const testData2x2 = new Float32Array([Black, White, Black, White].flatMap((x) => [x.r, x.g, x.b, x.a]));\r\n\r\n const result = { r: 0, g: 0, b: 0, a: 0 };\r\n Sample2DRgbaToRef(0.0, 0.0, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Black);\r\n\r\n Sample2DRgbaToRef(0.5, 1.0, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Grey);\r\n\r\n Sample2DRgbaToRef(0.5, 0.5, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(Grey);\r\n\r\n Sample2DRgbaToRef(1.0, 1.0, 2, 2, testData2x2, result, (value) => value);\r\n (expect(result) as any).toBeApproxColor4Like(White);\r\n });\r\n test(\"testDistinct2x2\", () => {\r\n const data = new Float32Array([Red, Green, Blue, White].flatMap((x) => [x.r, x.g, x.b, x.a]));\r\n\r\n const result = { r: 0, g: 0, b: 0, a: 0 };\r\n Sample2DRgbaToRef(0.25, 0.25, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 1.0, g: 0.0, b: 0.0, a: 1 });\r\n\r\n Sample2DRgbaToRef(0.25, 0.75, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 0.0, g: 0.0, b: 1.0, a: 1 });\r\n\r\n Sample2DRgbaToRef(0.75, 0.25, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 0.0, g: 1.0, b: 0.0, a: 1 });\r\n\r\n Sample2DRgbaToRef(0.75, 0.75, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 1.0, g: 1.0, b: 1.0, a: 1 });\r\n\r\n Sample2DRgbaToRef(0.5, 0.5, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 0.5, g: 0.5, b: 0.5, a: 1 });\r\n\r\n Sample2DRgbaToRef(0.5, 0.0, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 0.5, g: 0.5, b: 0.0, a: 1 });\r\n\r\n Sample2DRgbaToRef(0.0, 0.5, 2, 2, data, result, (v) => v);\r\n (expect(result) as any).toBeApproxColor4Like({ r: 0.5, g: 0.0, b: 0.5, a: 1 });\r\n });\r\n});\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@babylonjs/addons",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.27.1",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"module": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"postcompile": "build-tools -c add-js-to-es6"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@babylonjs/core": "^8.
|
|
21
|
+
"@babylonjs/core": "^8.27.1",
|
|
22
22
|
"@dev/addons": "^1.0.0",
|
|
23
23
|
"@dev/build-tools": "^1.0.0"
|
|
24
24
|
},
|