DefaultMaterial.glsl.js 12 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. All material copyright ESRI, All Rights Reserved, unless otherwise specified.
  3. See https://js.arcgis.com/4.25/esri/copyright.txt for details.
  4. */
  5. import{isSome as e}from"../core/maybe.js";import{I as r}from"./mat4f64.js";import{ForwardLinearDepth as o}from"../views/3d/webgl-engine/core/shaderLibrary/ForwardLinearDepth.glsl.js";import{Offset as a}from"../views/3d/webgl-engine/core/shaderLibrary/Offset.glsl.js";import{ShaderOutput as i}from"../views/3d/webgl-engine/core/shaderLibrary/ShaderOutput.js";import{SliceDraw as l}from"../views/3d/webgl-engine/core/shaderLibrary/Slice.glsl.js";import{Transform as s}from"../views/3d/webgl-engine/core/shaderLibrary/Transform.glsl.js";import{InstancedDoublePrecision as t}from"../views/3d/webgl-engine/core/shaderLibrary/attributes/InstancedDoublePrecision.glsl.js";import{NormalAttribute as n,NormalAttributeType as d}from"../views/3d/webgl-engine/core/shaderLibrary/attributes/NormalAttribute.glsl.js";import{PositionAttribute as c}from"../views/3d/webgl-engine/core/shaderLibrary/attributes/PositionAttribute.glsl.js";import{SymbolColor as m}from"../views/3d/webgl-engine/core/shaderLibrary/attributes/SymbolColor.glsl.js";import{TextureCoordinateAttribute as g}from"../views/3d/webgl-engine/core/shaderLibrary/attributes/TextureCoordinateAttribute.glsl.js";import{VertexColor as u}from"../views/3d/webgl-engine/core/shaderLibrary/attributes/VertexColor.glsl.js";import{VertexNormal as p}from"../views/3d/webgl-engine/core/shaderLibrary/attributes/VertexNormal.glsl.js";import{VerticalOffset as v}from"../views/3d/webgl-engine/core/shaderLibrary/attributes/VerticalOffset.glsl.js";import{DefaultMaterialAuxiliaryPasses as h}from"../views/3d/webgl-engine/core/shaderLibrary/default/DefaultMaterialAuxiliaryPasses.glsl.js";import{ComputeNormalTexture as b}from"../views/3d/webgl-engine/core/shaderLibrary/shading/ComputeNormalTexture.glsl.js";import{EvaluateAmbientOcclusion as f}from"../views/3d/webgl-engine/core/shaderLibrary/shading/EvaluateAmbientOcclusion.glsl.js";import{EvaluateSceneLighting as w,addAmbientBoostFactor as x,addLightingGlobalFactor as y}from"../views/3d/webgl-engine/core/shaderLibrary/shading/EvaluateSceneLighting.glsl.js";import{addMainLightIntensity as C}from"../views/3d/webgl-engine/core/shaderLibrary/shading/MainLighting.glsl.js";import{multipassTerrainTest as T}from"../views/3d/webgl-engine/core/shaderLibrary/shading/MultipassTerrainTest.glsl.js";import{Normals as j}from"../views/3d/webgl-engine/core/shaderLibrary/shading/Normals.glsl.js";import{PhysicallyBasedRendering as L}from"../views/3d/webgl-engine/core/shaderLibrary/shading/PhysicallyBasedRendering.glsl.js";import{PhysicallyBasedRenderingParameters as M,PBRMode as O}from"../views/3d/webgl-engine/core/shaderLibrary/shading/PhysicallyBasedRenderingParameters.glsl.js";import{ReadShadowMapPass as P,ReadShadowMapDraw as $}from"../views/3d/webgl-engine/core/shaderLibrary/shading/ReadShadowMap.glsl.js";import{colorTextureUV as A,normalTextureUV as N,emissiveTextureUV as S,occlusionTextureUV as E,metallicRoughnessTextureUV as V}from"../views/3d/webgl-engine/core/shaderLibrary/shading/TextureTransformUV.glsl.js";import{VisualVariables as _}from"../views/3d/webgl-engine/core/shaderLibrary/shading/VisualVariables.glsl.js";import{symbolAlphaCutoff as D}from"../views/3d/webgl-engine/core/shaderLibrary/util/AlphaCutoff.js";import{DiscardOrAdjustAlphaPass as F}from"../views/3d/webgl-engine/core/shaderLibrary/util/AlphaDiscard.glsl.js";import{MixExternalColor as U}from"../views/3d/webgl-engine/core/shaderLibrary/util/MixExternalColor.glsl.js";import{addProjViewLocalOrigin as B,addCameraPosition as I}from"../views/3d/webgl-engine/core/shaderLibrary/util/View.glsl.js";import{Float3PassUniform as R}from"../views/3d/webgl-engine/core/shaderModules/Float3PassUniform.js";import{Float4PassUniform as z}from"../views/3d/webgl-engine/core/shaderModules/Float4PassUniform.js";import{FloatPassUniform as W}from"../views/3d/webgl-engine/core/shaderModules/FloatPassUniform.js";import{glsl as G}from"../views/3d/webgl-engine/core/shaderModules/interfaces.js";import{Matrix4PassUniform as k}from"../views/3d/webgl-engine/core/shaderModules/Matrix4PassUniform.js";import{ShaderBuilder as q}from"../views/3d/webgl-engine/core/shaderModules/ShaderBuilder.js";import{Texture2DPassUniform as H}from"../views/3d/webgl-engine/core/shaderModules/Texture2DPassUniform.js";import{TransparencyPassType as J}from"../views/3d/webgl-engine/lib/TransparencyPassType.js";import{VertexAttribute as K}from"../views/3d/webgl-engine/lib/VertexAttribute.js";function Q(Q){const X=new q,{vertex:Y,fragment:Z,varyings:ee}=X;return B(Y,Q),X.include(c),ee.add("vpos","vec3"),X.include(_,Q),X.include(t,Q),X.include(v,Q),Q.hasColorTextureTransform&&X.include(A),Q.output!==i.Color&&Q.output!==i.Alpha||(Q.hasNormalTextureTransform&&X.include(N),Q.hasEmissionTextureTransform&&X.include(S),Q.hasOcclusionTextureTransform&&X.include(E),Q.hasMetallicRoughnessTextureTransform&&X.include(V),I(Y,Q),X.include(n,Q),X.include(s,Q),Q.normalType===d.Attribute&&Q.offsetBackfaces&&X.include(a),X.include(b,Q),X.include(p,Q),Q.instancedColor&&X.attributes.add(K.INSTANCECOLOR,"vec4"),ee.add("localvpos","vec3"),X.include(g,Q),X.include(o,Q),X.include(m,Q),X.include(u,Q),Y.uniforms.add(new z("externalColor",(e=>e.externalColor))),ee.add("vcolorExt","vec4"),Q.hasMultipassTerrain&&ee.add("depth","float"),Q.hasModelTransformation&&Y.uniforms.add(new k("model",(o=>e(o.modelTransformation)?o.modelTransformation:r))),Y.code.add(G`
  6. void main(void) {
  7. forwardNormalizedVertexColor();
  8. vcolorExt = externalColor;
  9. ${Q.instancedColor?"vcolorExt *= instanceColor;":""}
  10. vcolorExt *= vvColor();
  11. vcolorExt *= getSymbolColor();
  12. forwardColorMixMode();
  13. if (vcolorExt.a < ${G.float(D)}) {
  14. gl_Position = vec4(1e38, 1e38, 1e38, 1.0);
  15. } else {
  16. vpos = calculateVPos();
  17. localvpos = vpos - view[3].xyz;
  18. vpos = subtractOrigin(vpos);
  19. ${Q.normalType===d.Attribute?G`vNormalWorld = dpNormal(vvLocalNormal(normalModel()));`:""}
  20. vpos = addVerticalOffset(vpos, localOrigin);
  21. ${Q.hasVertexTangents?"vTangent = dpTransformVertexTangent(tangent);":""}
  22. gl_Position = transformPosition(proj, view, ${Q.hasModelTransformation?"model,":""} vpos);
  23. ${Q.normalType===d.Attribute&&Q.offsetBackfaces?"gl_Position = offsetBackfacingClipPosition(gl_Position, vpos, vNormalWorld, cameraPosition);":""}
  24. }
  25. ${Q.hasMultipassTerrain?"depth = (view * vec4(vpos, 1.0)).z;":""}
  26. forwardLinearDepth();
  27. forwardTextureCoordinates();
  28. ${Q.hasColorTextureTransform?G`forwardColorUV();`:""}
  29. ${Q.hasNormalTextureTransform?G`forwardNormalUV();`:""}
  30. ${Q.hasEmissionTextureTransform?G`forwardEmissiveUV();`:""}
  31. ${Q.hasOcclusionTextureTransform?G`forwardOcclusionUV();`:""}
  32. ${Q.hasMetallicRoughnessTextureTransform?G`forwardMetallicRoughnessUV();`:""}
  33. }
  34. `)),Q.output===i.Alpha&&(X.include(l,Q),X.include(F,Q),X.include(T,Q),Z.uniforms.add([new W("opacity",(e=>e.opacity)),new W("layerOpacity",(e=>e.layerOpacity))]),Q.hasColorTexture&&Z.uniforms.add(new H("tex",(e=>e.texture))),Z.include(U),Z.code.add(G`
  35. void main() {
  36. discardBySlice(vpos);
  37. ${Q.hasMultipassTerrain?"terrainDepthTest(gl_FragCoord, depth);":""}
  38. ${Q.hasColorTexture?G`
  39. vec4 texColor = texture2D(tex, ${Q.hasColorTextureTransform?G`colorUV`:G`vuv0`});
  40. ${Q.textureAlphaPremultiplied?"texColor.rgb /= texColor.a;":""}
  41. discardOrAdjustAlpha(texColor);`:G`vec4 texColor = vec4(1.0);`}
  42. ${Q.hasVertexColors?G`float opacity_ = layerOpacity * mixExternalOpacity(vColor.a * opacity, texColor.a, vcolorExt.a, int(colorMixMode));`:G`float opacity_ = layerOpacity * mixExternalOpacity(opacity, texColor.a, vcolorExt.a, int(colorMixMode));`}
  43. gl_FragColor = vec4(opacity_);
  44. }
  45. `)),Q.output===i.Color&&(X.include(l,Q),X.include(w,Q),X.include(f,Q),X.include(F,Q),X.include(Q.instancedDoublePrecision?P:$,Q),X.include(T,Q),I(Z,Q),Z.uniforms.add([Y.uniforms.get("localOrigin"),new R("ambient",(e=>e.ambient)),new R("diffuse",(e=>e.diffuse)),new W("opacity",(e=>e.opacity)),new W("layerOpacity",(e=>e.layerOpacity))]),Q.hasColorTexture&&Z.uniforms.add(new H("tex",(e=>e.texture))),X.include(M,Q),X.include(L,Q),Z.include(U),X.include(j,Q),x(Z),y(Z),C(Z),Z.code.add(G`
  46. void main() {
  47. discardBySlice(vpos);
  48. ${Q.hasMultipassTerrain?"terrainDepthTest(gl_FragCoord, depth);":""}
  49. ${Q.hasColorTexture?G`
  50. vec4 texColor = texture2D(tex, ${Q.hasColorTextureTransform?G`colorUV`:G`vuv0`});
  51. ${Q.textureAlphaPremultiplied?"texColor.rgb /= texColor.a;":""}
  52. discardOrAdjustAlpha(texColor);`:G`vec4 texColor = vec4(1.0);`}
  53. shadingParams.viewDirection = normalize(vpos - cameraPosition);
  54. ${Q.normalType===d.ScreenDerivative?G`
  55. vec3 normal = screenDerivativeNormal(localvpos);`:G`
  56. shadingParams.normalView = vNormalWorld;
  57. vec3 normal = shadingNormal(shadingParams);`}
  58. ${Q.pbrMode===O.Normal?"applyPBRFactors();":""}
  59. float ssao = evaluateAmbientOcclusionInverse();
  60. ssao *= getBakedOcclusion();
  61. vec3 posWorld = vpos + localOrigin;
  62. float additionalAmbientScale = additionalDirectedAmbientLight(posWorld);
  63. float shadow = ${Q.receiveShadows?"readShadowMap(vpos, linearDepth)":Q.spherical?"lightingGlobalFactor * (1.0 - additionalAmbientScale)":"0.0"};
  64. vec3 matColor = max(ambient, diffuse);
  65. ${Q.hasVertexColors?G`
  66. vec3 albedo = mixExternalColor(vColor.rgb * matColor, texColor.rgb, vcolorExt.rgb, int(colorMixMode));
  67. float opacity_ = layerOpacity * mixExternalOpacity(vColor.a * opacity, texColor.a, vcolorExt.a, int(colorMixMode));`:G`
  68. vec3 albedo = mixExternalColor(matColor, texColor.rgb, vcolorExt.rgb, int(colorMixMode));
  69. float opacity_ = layerOpacity * mixExternalOpacity(opacity, texColor.a, vcolorExt.a, int(colorMixMode));`}
  70. ${Q.hasNormalTexture?G`
  71. mat3 tangentSpace = ${Q.hasVertexTangents?"computeTangentSpace(normal);":"computeTangentSpace(normal, vpos, vuv0);"}
  72. vec3 shadingNormal = computeTextureNormal(tangentSpace, vuv0);`:G`vec3 shadingNormal = normal;`}
  73. vec3 normalGround = ${Q.spherical?G`normalize(posWorld);`:G`vec3(0.0, 0.0, 1.0);`}
  74. ${Q.snowCover?G`
  75. float snow = smoothstep(0.5, 0.55, dot(normal, normalGround));
  76. albedo = mix(albedo, vec3(1), snow);
  77. shadingNormal = mix(shadingNormal, normal, snow);
  78. ssao = mix(ssao, 1.0, snow);`:""}
  79. vec3 additionalLight = ssao * mainLightIntensity * additionalAmbientScale * ambientBoostFactor * lightingGlobalFactor;
  80. ${Q.pbrMode===O.Normal||Q.pbrMode===O.Schematic?G`
  81. float additionalAmbientIrradiance = additionalAmbientIrradianceFactor * mainLightIntensity[2];
  82. ${Q.snowCover?G`
  83. mrr = mix(mrr, vec3(0.0, 1.0, 0.04), snow);
  84. emission = mix(emission, vec3(0.0), snow);`:""}
  85. vec3 shadedColor = evaluateSceneLightingPBR(shadingNormal, albedo, shadow, 1.0 - ssao, additionalLight, shadingParams.viewDirection, normalGround, mrr, emission, additionalAmbientIrradiance);`:G`vec3 shadedColor = evaluateSceneLighting(shadingNormal, albedo, shadow, 1.0 - ssao, additionalLight);`}
  86. gl_FragColor = highlightSlice(vec4(shadedColor, opacity_), vpos);
  87. ${Q.transparencyPassType===J.Color?G`gl_FragColor = premultiplyAlpha(gl_FragColor);`:""}
  88. }
  89. `)),X.include(h,Q),X}const X=Object.freeze(Object.defineProperty({__proto__:null,build:Q},Symbol.toStringTag,{value:"Module"}));export{X as D,Q as b};