UNPKG

@doegis/core

Version:

DOE GIS API

67 lines (65 loc) 5.91 kB
import{FoamColor as e}from"./FoamRendering.glsl.js";import{Gamma as o}from"./Gamma.glsl.js";import{PhysicallyBasedRenderingWater as r}from"./PhysicallyBasedRendering.glsl.js";import{ScreenSpaceReflections as t}from"./ScreenSpaceReflections.glsl.js";import{CloudsParallaxShading as i}from"../util/CloudsParallaxShading.glsl.js";import{FloatPassUniform as a}from"../../shaderModules/FloatPassUniform.js";import{glsl as l}from"../../shaderModules/interfaces.js";import{Matrix4PassUniform as n}from"../../shaderModules/Matrix4PassUniform.js";import{Texture2DPassUniform as d}from"../../shaderModules/Texture2DPassUniform.js";function c(c,s){c.include(r,s),c.include(o),c.include(e),s.hasCloudsReflections&&c.include(i,s),s.hasScreenSpaceReflections&&c.include(t,s);const f=c.fragment;f.constants.add("fresnelSky","vec3",[.02,1,15]).add("fresnelMaterial","vec2",[.02,.1]).add("roughness","float",.015).add("foamIntensityExternal","float",1.7).add("ssrIntensity","float",.65).add("ssrHeightFadeStart","float",3e5).add("ssrHeightFadeEnd","float",5e5).add("waterDiffusion","float",.92).add("waterSeaColorMod","float",.8).add("correctionViewingPowerFactor","float",.4).add("skyZenitColor","vec3",[.52,.68,.9]).add("skyColor","vec3",[.67,.79,.9]).add("cloudFresnelModifier","vec2",[1.2,.01]),f.code.add(l`PBRShadingWater shadingInfo; vec3 getSkyGradientColor(in float cosTheta, in vec3 horizon, in vec3 zenit) { float exponent = pow((1.0 - cosTheta), fresnelSky[2]); return mix(zenit, horizon, exponent); }`),f.uniforms.add([new a("lightingSpecularStrength",((e,o)=>o.lighting.mainLight.specularStrength)),new a("lightingEnvironmentStrength",((e,o)=>o.lighting.mainLight.environmentStrength))]),f.code.add(l`vec3 getSeaColor(in vec3 n, in vec3 v, in vec3 l, vec3 color, in vec3 lightIntensity, in vec3 localUp, in float shadow, float foamIntensity, vec3 viewPosition, vec3 position) { float reflectionHit = 0.0; float reflectionHitDiffused = 0.0; vec3 seaWaterColor = linearizeGamma(color); vec3 h = normalize(l + v); shadingInfo.NdotL = clamp(dot(n, l), 0.0, 1.0); shadingInfo.NdotV = clamp(dot(n, v), 0.001, 1.0); shadingInfo.VdotN = clamp(dot(v, n), 0.001, 1.0); shadingInfo.NdotH = clamp(dot(n, h), 0.0, 1.0); shadingInfo.VdotH = clamp(dot(v, h), 0.0, 1.0); shadingInfo.LdotH = clamp(dot(l, h), 0.0, 1.0); float upDotV = max(dot(localUp,v), 0.0); vec3 skyHorizon = linearizeGamma(skyColor); vec3 skyZenit = linearizeGamma(skyZenitColor); vec3 skyColor = getSkyGradientColor(upDotV, skyHorizon, skyZenit ); float upDotL = max(dot(localUp,l),0.0); float daytimeMod = 0.1 + upDotL * 0.9; skyColor *= daytimeMod; float shadowModifier = clamp(shadow, 0.8, 1.0); vec3 fresnelModifier = fresnelReflection(shadingInfo.VdotN, vec3(fresnelSky[0]), fresnelSky[1]); vec3 reflSky = lightingEnvironmentStrength * fresnelModifier * skyColor * shadowModifier; vec3 reflSea = seaWaterColor * mix(skyColor, upDotL * lightIntensity * LIGHT_NORMALIZATION, 2.0 / 3.0) * shadowModifier; vec3 specular = vec3(0.0); if(upDotV > 0.0 && upDotL > 0.0) { vec3 specularSun = brdfSpecularWater(shadingInfo, roughness, vec3(fresnelMaterial[0]), fresnelMaterial[1]); vec3 incidentLight = lightIntensity * LIGHT_NORMALIZATION * shadow; specular = lightingSpecularStrength * shadingInfo.NdotL * incidentLight * specularSun; } vec3 foam = vec3(0.0); if(upDotV > 0.0) { foam = foamIntensity2FoamColor(foamIntensityExternal, foamIntensity, skyZenitColor, daytimeMod); } float correctionViewingFactor = pow(max(dot(v, localUp), 0.0), correctionViewingPowerFactor); vec3 normalCorrectedClouds = mix(localUp, n, correctionViewingFactor); vec3 reflectedWorld = normalize(reflect(-v, normalCorrectedClouds));`),s.hasCloudsReflections&&f.code.add(l`vec4 cloudsColor = renderClouds(reflectedWorld, position); cloudsColor.a = 1.0 - cloudsColor.a; cloudsColor = pow(cloudsColor, vec4(GAMMA)); cloudsColor *= clamp(fresnelModifier.y*cloudFresnelModifier[0] - cloudFresnelModifier[1], 0.0, 1.0) * clamp((1.0 - totalFadeInOut), 0.0, 1.0);`),s.hasScreenSpaceReflections?(f.uniforms.add([new n("view",((e,o)=>o.ssr.camera.viewMatrix)),new d("lastFrameColorTexture",((e,o)=>o.ssr.lastFrameColorTexture)),new a("fadeFactor",((e,o)=>o.ssr.fadeFactor))]),f.code.add(l`vec3 viewDir = normalize(viewPosition); vec4 viewNormalVectorCoordinate = view *vec4(n, 0.0); vec3 viewNormal = normalize(viewNormalVectorCoordinate.xyz); vec4 viewUp = view * vec4(localUp, 0.0); vec3 viewNormalCorrectedSSR = mix(viewUp.xyz, viewNormal, correctionViewingFactor); vec3 reflected = normalize(reflect(viewDir, viewNormalCorrectedSSR)); vec3 hitCoordinate = screenSpaceIntersection(reflected, viewPosition, viewDir, viewUp.xyz); vec3 reflectedColor = vec3(0.0); if (hitCoordinate.z > 0.0) { vec2 reprojectedCoordinate = reprojectionCoordinate(hitCoordinate); vec2 dCoords = smoothstep(0.3, 0.6, abs(vec2(0.5, 0.5) - hitCoordinate.xy)); float heightMod = smoothstep(ssrHeightFadeEnd, ssrHeightFadeStart, -viewPosition.z); reflectionHit = clamp(1.0 - (1.3 * dCoords.y), 0.0, 1.0) * heightMod * fadeFactor; reflectionHitDiffused = waterDiffusion * reflectionHit; reflectedColor = linearizeGamma(texture2D(lastFrameColorTexture, reprojectedCoordinate).xyz) * reflectionHitDiffused * fresnelModifier.y * ssrIntensity; } float seaColorMod = mix(waterSeaColorMod, waterSeaColorMod * 0.5, reflectionHitDiffused); vec3 waterRenderedColor = tonemapACES((1.0 - reflectionHitDiffused) * reflSky + reflectedColor + reflSea * seaColorMod + specular + foam);`)):f.code.add(l`vec3 waterRenderedColor = tonemapACES(reflSky + reflSea * waterSeaColorMod + specular + foam);`),s.hasCloudsReflections?s.hasScreenSpaceReflections?f.code.add(l`return waterRenderedColor * (1.0 - (1.0 - reflectionHit) * cloudsColor.a) + (1.0 - reflectionHit) * cloudsColor.xyz; }`):f.code.add(l`return waterRenderedColor * (1.0 - cloudsColor.a) + cloudsColor.xyz; }`):f.code.add(l`return waterRenderedColor; }`)}export{c as Water};