UNPKG

@arcgis/core

Version:

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

95 lines (94 loc) • 9 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import{colorGamma as i}from"../../../../../../colorUtils.js";import{neverReached as n}from"../../../../../../core/compilerUtils.js";import{EvaluateAmbientLighting as e}from"./EvaluateAmbientLighting.glsl.js";import{EvaluateAmbientOcclusion as o}from"./EvaluateAmbientOcclusion.glsl.js";import{addMainLightDirection as t,addMainLightIntensity as a,applyShading as r}from"./MainLighting.glsl.js";import{PhysicallyBasedRendering as l}from"./PhysicallyBasedRendering.glsl.js";import{PBRMode as c}from"./PhysicallyBasedRenderingParameters.glsl.js";import{PiUtils as d}from"./PiUtils.glsl.js";import{BooleanBindUniform as s}from"../../shaderModules/BooleanBindUniform.js";import{FloatBindUniform as m}from"../../shaderModules/FloatBindUniform.js";import{glsl as g}from"../../shaderModules/glsl.js";import{ambientBoost as h}from"../../../lighting/SceneLighting.js";function u(i){i.constants.add("ambientBoostFactor","float",h)}function p(i){i.uniforms.add(new m("lightingGlobalFactor",(i=>i.lighting.globalFactor)))}function v(h,v){const f=h.fragment;switch(h.include(o,v),v.pbrMode!==c.Disabled&&h.include(l,v),h.include(e,v),h.include(d),f.code.add(g` const float GAMMA_SRGB = ${g.float(i)}; const float INV_GAMMA_SRGB = 0.4761904; ${v.pbrMode===c.Disabled?"":"const vec3 GROUND_REFLECTANCE = vec3(0.2);"} `),u(f),p(f),t(f),f.code.add(g` float additionalDirectedAmbientLight(vec3 vPosWorld) { float vndl = dot(${v.spherical?g`normalize(vPosWorld)`:g`vec3(0.0, 0.0, 1.0)`}, mainLightDirection); return smoothstep(0.0, 1.0, clamp(vndl * 2.5, 0.0, 1.0)); } `),a(f),f.code.add(g`vec3 evaluateAdditionalLighting(float ambientOcclusion, vec3 vPosWorld) { float additionalAmbientScale = additionalDirectedAmbientLight(vPosWorld); return (1.0 - ambientOcclusion) * additionalAmbientScale * ambientBoostFactor * lightingGlobalFactor * mainLightIntensity; }`),v.pbrMode){case c.Disabled:case c.WaterOnIntegratedMesh:case c.Water:h.include(r),f.code.add(g`vec3 evaluateSceneLighting(vec3 normalWorld, vec3 albedo, float shadow, float ssao, vec3 additionalLight) { vec3 mainLighting = applyShading(normalWorld, shadow); vec3 ambientLighting = calculateAmbientIrradiance(normalWorld, ssao); vec3 albedoLinear = pow(albedo, vec3(GAMMA_SRGB)); vec3 totalLight = mainLighting + ambientLighting + additionalLight; totalLight = min(totalLight, vec3(PI)); vec3 outColor = vec3((albedoLinear / PI) * totalLight); return pow(outColor, vec3(INV_GAMMA_SRGB)); }`);break;case c.Normal:case c.Schematic:f.code.add(g`const float fillLightIntensity = 0.25; const float horizonLightDiffusion = 0.4; const float additionalAmbientIrradianceFactor = 0.02; vec3 evaluateSceneLightingPBR(vec3 normal, vec3 albedo, float shadow, float ssao, vec3 additionalLight, vec3 viewDir, vec3 normalGround, vec3 mrr, vec4 _emission, float additionalAmbientIrradiance) { vec3 viewDirection = -viewDir; vec3 h = normalize(viewDirection + mainLightDirection); PBRShadingInfo inputs; inputs.NdotV = clamp(abs(dot(normal, viewDirection)), 0.001, 1.0); inputs.NdotNG = clamp(dot(normal, normalGround), -1.0, 1.0); vec3 reflectedView = normalize(reflect(viewDirection, normal)); inputs.RdotNG = clamp(dot(reflectedView, normalGround), -1.0, 1.0); inputs.albedoLinear = pow(albedo, vec3(GAMMA_SRGB)); inputs.ssao = ssao; inputs.metalness = mrr[0]; inputs.roughness = clamp(mrr[1] * mrr[1], 0.001, 0.99);`),f.code.add(g`inputs.f0 = (0.16 * mrr[2] * mrr[2]) * (1.0 - inputs.metalness) + inputs.albedoLinear * inputs.metalness; inputs.f90 = vec3(clamp(dot(inputs.f0, vec3(50.0 * 0.33)), 0.0, 1.0)); inputs.diffuseColor = inputs.albedoLinear * (vec3(1.0) - inputs.f0) * (1.0 - inputs.metalness);`),v.useFillLights?f.uniforms.add(new s("hasFillLights",(i=>i.enableFillLights))):f.constants.add("hasFillLights","bool",!1),f.code.add(g`vec3 ambientDir = vec3(5.0 * normalGround[1] - normalGround[0] * normalGround[2], - 5.0 * normalGround[0] - normalGround[2] * normalGround[1], normalGround[1] * normalGround[1] + normalGround[0] * normalGround[0]); ambientDir = ambientDir != vec3(0.0) ? normalize(ambientDir) : normalize(vec3(5.0, -1.0, 0.0)); inputs.NdotAmbDir = hasFillLights ? abs(dot(normal, ambientDir)) : 1.0; float NdotL = clamp(dot(normal, mainLightDirection), 0.001, 1.0); vec3 mainLightIrradianceComponent = NdotL * (1.0 - shadow) * mainLightIntensity; vec3 fillLightsIrradianceComponent = inputs.NdotAmbDir * mainLightIntensity * fillLightIntensity; vec3 ambientLightIrradianceComponent = calculateAmbientIrradiance(normal, ssao) + additionalLight; inputs.skyIrradianceToSurface = ambientLightIrradianceComponent + mainLightIrradianceComponent + fillLightsIrradianceComponent ; inputs.groundIrradianceToSurface = GROUND_REFLECTANCE * ambientLightIrradianceComponent + mainLightIrradianceComponent + fillLightsIrradianceComponent ;`),f.uniforms.add(new m("lightingSpecularStrength",(i=>i.lighting.mainLight.specularStrength)),new m("lightingEnvironmentStrength",(i=>i.lighting.mainLight.environmentStrength))).code.add(g`vec3 horizonRingDir = inputs.RdotNG * normalGround - reflectedView; vec3 horizonRingH = normalize(viewDirection + horizonRingDir); inputs.NdotH_Horizon = dot(normal, horizonRingH); float NdotH = clamp(dot(normal, h), 0.0, 1.0); vec3 mainLightRadianceComponent = lightingSpecularStrength * normalDistribution(NdotH, inputs.roughness) * mainLightIntensity * (1.0 - shadow); vec3 horizonLightRadianceComponent = lightingEnvironmentStrength * normalDistribution(inputs.NdotH_Horizon, min(inputs.roughness + horizonLightDiffusion, 1.0)) * mainLightIntensity * fillLightIntensity; vec3 ambientLightRadianceComponent = lightingEnvironmentStrength * calculateAmbientRadiance(ssao) + additionalLight; float normalDirectionModifier = mix(1., min(mix(0.1, 2.0, (inputs.NdotNG + 1.) * 0.5), 1.0), clamp(inputs.roughness * 5.0, 0.0 , 1.0)); inputs.skyRadianceToSurface = (ambientLightRadianceComponent + horizonLightRadianceComponent) * normalDirectionModifier + mainLightRadianceComponent; inputs.groundRadianceToSurface = 0.5 * GROUND_REFLECTANCE * (ambientLightRadianceComponent + horizonLightRadianceComponent) * normalDirectionModifier + mainLightRadianceComponent; inputs.averageAmbientRadiance = ambientLightIrradianceComponent[1] * (1.0 + GROUND_REFLECTANCE[1]);`),f.code.add(g` vec3 reflectedColorComponent = evaluateEnvironmentIllumination(inputs); vec3 additionalMaterialReflectanceComponent = inputs.albedoLinear * additionalAmbientIrradiance; vec3 emissionComponent = _emission.rgb == vec3(0.0) ? _emission.rgb : pow(_emission.rgb, vec3(GAMMA_SRGB)); vec3 outColorLinear = reflectedColorComponent + additionalMaterialReflectanceComponent + emissionComponent; ${v.pbrMode!==c.Schematic||v.hasColorTexture?g`vec3 outColor = pow(blackLevelSoftCompression(outColorLinear, inputs), vec3(INV_GAMMA_SRGB));`:g`vec3 outColor = pow(max(vec3(0.0), outColorLinear - 0.005 * inputs.averageAmbientRadiance), vec3(INV_GAMMA_SRGB));`} return outColor; } `);break;case c.Simplified:case c.TerrainWithWater:t(f),a(f),f.code.add(g`const float roughnessTerrain = 0.5; const float specularityTerrain = 0.5; const vec3 fresnelReflectionTerrain = vec3(0.04); vec3 evaluatePBRSimplifiedLighting(vec3 n, vec3 c, float shadow, float ssao, vec3 al, vec3 vd, vec3 nup) { vec3 viewDirection = -vd; vec3 h = normalize(viewDirection + mainLightDirection); float NdotL = clamp(dot(n, mainLightDirection), 0.001, 1.0); float NdotV = clamp(abs(dot(n, viewDirection)), 0.001, 1.0); float NdotH = clamp(dot(n, h), 0.0, 1.0); float NdotNG = clamp(dot(n, nup), -1.0, 1.0); vec3 albedoLinear = pow(c, vec3(GAMMA_SRGB)); float lightness = 0.3 * albedoLinear[0] + 0.5 * albedoLinear[1] + 0.2 * albedoLinear[2]; vec3 f0 = (0.85 * lightness + 0.15) * fresnelReflectionTerrain; vec3 f90 = vec3(clamp(dot(f0, vec3(50.0 * 0.33)), 0.0, 1.0)); vec3 mainLightIrradianceComponent = (1. - shadow) * NdotL * mainLightIntensity; vec3 ambientLightIrradianceComponent = calculateAmbientIrradiance(n, ssao) + al; vec3 ambientSky = ambientLightIrradianceComponent + mainLightIrradianceComponent; vec3 indirectDiffuse = ((1.0 - NdotNG) * mainLightIrradianceComponent + (1.0 + NdotNG ) * ambientSky) * 0.5; vec3 outDiffColor = albedoLinear * (1.0 - f0) * indirectDiffuse / PI; vec3 mainLightRadianceComponent = normalDistribution(NdotH, roughnessTerrain) * mainLightIntensity; vec2 dfg = prefilteredDFGAnalytical(roughnessTerrain, NdotV); vec3 specularColor = f0 * dfg.x + f90 * dfg.y; vec3 specularComponent = specularityTerrain * specularColor * mainLightRadianceComponent; vec3 outColorLinear = outDiffColor + specularComponent; vec3 outColor = pow(outColorLinear, vec3(INV_GAMMA_SRGB)); return outColor; }`);break;default:n(v.pbrMode);case c.COUNT:}}export{v as EvaluateSceneLighting,u as addAmbientBoostFactor,p as addLightingGlobalFactor};