UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

47 lines (40 loc) 2.75 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{betaRayleigh as e,betaCombined as t,betaMie as a}from"./atmosphereUtils.js";import{ChapmanApproximation as i}from"./ChapmanApproximation.glsl.js";import{Float3BindUniform as l}from"../webgl-engine/core/shaderModules/Float3BindUniform.js";import{If as r,glsl as s}from"../webgl-engine/core/shaderModules/glsl.js";function o(o,p){o.include(i),o.constants.add("betaRayleigh","vec3",e),o.constants.add("betaCombined","vec3",t),o.constants.add("betaMie","float",a),o.constants.add("steps","int",6),o.uniforms.add(new l("cameraPosition",e=>e.camera.eye)).code.add(s` vec3 raymarchAtmosphere(vec3 rayDir, vec3 lightDir, float terrainDepth) { vec4 ray = planetIntersect(rayDir); if(ray.x == 1.0) { return vec3(0); } ${r(p,"if (terrainDepth != -1.0) { ray.w = terrainDepth; }")} vec3 samplePoint = cameraPosition + rayDir * ray.w; float multiplier = ray.y == 1.0 ? -1.0 : 1.0; vec3 scattering = vec3(0); float scaleFract = (length(samplePoint) - radii[0]) / scaleHeight; float lastOpticalDepth = getOpticalDepth(samplePoint, rayDir, scaleFract); float stepSize = (ray.w - ray.z) / float(steps); for (int i = 0; i < steps; i++) { samplePoint -= stepSize * rayDir; scaleFract = (length(samplePoint) - radii[0]) / scaleHeight; float opticalDepth = multiplier * getOpticalDepth(samplePoint, rayDir * multiplier, scaleFract); if (i > 0) { scattering *= exp(-(mix(betaCombined, betaRayleigh, 0.5) + betaMie) * max(0.0, (opticalDepth - lastOpticalDepth))); ${r(!p,"scattering *= mix(2.5, 1.0, clamp((length(cameraPosition) - radii[0]) / 50e3, 0.0, 1.0))")}; } if (dot(normalize(samplePoint), lightDir) > -0.3) { float scale = exp(-scaleFract); float lightDepth = getOpticalDepth(samplePoint, lightDir, scaleFract); scattering += scale * exp(-(betaCombined + betaMie) * lightDepth); ${r(!p,"scattering += scale * exp(-(0.25 * betaCombined ) * lightDepth);")} } lastOpticalDepth = opticalDepth; } float mu = dot(rayDir, lightDir); float mumu = 1.0 + mu * mu; float phaseRayleigh = 0.0596831 * mumu; ${r(p,"return 3.0 * scattering * stepSize * phaseRayleigh * betaRayleigh;",s` const float g = 0.8; const float gg = g * g; float phaseMie = 0.1193662 * ((1.0 - gg) * mumu) / (pow(1.0 + gg - 2.0 * mu * g, 1.5) * (2.0 + gg)); phaseMie = clamp(phaseMie, 0.0, 128.0); return 3.0 * scattering * stepSize * (phaseRayleigh * betaRayleigh + 0.025 * phaseMie * betaMie);`)} }`)}export{o as ChapmanRaymarching};