DefaultMaterial.glsl.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. All material copyright ESRI, All Rights Reserved, unless otherwise specified.
  3. See https://js.arcgis.com/4.24/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/ShaderOutputOptions.js";import{SliceDraw as t}from"../views/3d/webgl-engine/core/shaderLibrary/Slice.glsl.js";import{Transform as l}from"../views/3d/webgl-engine/core/shaderLibrary/Transform.glsl.js";import{InstancedDoublePrecision as s}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 p}from"../views/3d/webgl-engine/core/shaderLibrary/attributes/VertexColor.glsl.js";import{VertexNormal as v}from"../views/3d/webgl-engine/core/shaderLibrary/attributes/VertexNormal.glsl.js";import{VerticalOffset as u}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}from"../views/3d/webgl-engine/core/shaderLibrary/shading/EvaluateSceneLighting.glsl.js";import{multipassTerrainTest as x}from"../views/3d/webgl-engine/core/shaderLibrary/shading/MultipassTerrainTest.glsl.js";import{Normals as y}from"../views/3d/webgl-engine/core/shaderLibrary/shading/Normals.glsl.js";import{PhysicallyBasedRendering as C}from"../views/3d/webgl-engine/core/shaderLibrary/shading/PhysicallyBasedRendering.glsl.js";import{PhysicallyBasedRenderingParameters as j,PBRMode as M}from"../views/3d/webgl-engine/core/shaderLibrary/shading/PhysicallyBasedRenderingParameters.glsl.js";import{ReadShadowMapPass as L,ReadShadowMapDraw as T}from"../views/3d/webgl-engine/core/shaderLibrary/shading/ReadShadowMap.glsl.js";import{VisualVariables as P}from"../views/3d/webgl-engine/core/shaderLibrary/shading/VisualVariables.glsl.js";import{symbolAlphaCutoff as O}from"../views/3d/webgl-engine/core/shaderLibrary/util/AlphaCutoff.js";import{DiscardOrAdjustAlphaPass as A}from"../views/3d/webgl-engine/core/shaderLibrary/util/AlphaDiscard.glsl.js";import{HeaderComment as S}from"../views/3d/webgl-engine/core/shaderLibrary/util/HeaderComment.glsl.js";import{MixExternalColor as $}from"../views/3d/webgl-engine/core/shaderLibrary/util/MixExternalColor.glsl.js";import{addProjViewLocalOrigin as N,addCameraPosition as E}from"../views/3d/webgl-engine/core/shaderLibrary/util/View.glsl.js";import{Float3PassUniform as D}from"../views/3d/webgl-engine/core/shaderModules/Float3PassUniform.js";import{Float4PassUniform as _}from"../views/3d/webgl-engine/core/shaderModules/Float4PassUniform.js";import{FloatPassUniform as F}from"../views/3d/webgl-engine/core/shaderModules/FloatPassUniform.js";import{glsl as V}from"../views/3d/webgl-engine/core/shaderModules/interfaces.js";import{Matrix4PassUniform as B}from"../views/3d/webgl-engine/core/shaderModules/Matrix4PassUniform.js";import{ShaderBuilder as I}from"../views/3d/webgl-engine/core/shaderModules/ShaderBuilder.js";import{Texture2DPassUniform as z}from"../views/3d/webgl-engine/core/shaderModules/Texture2DPassUniform.js";import{TransparencyPassType as G}from"../views/3d/webgl-engine/lib/basicInterfaces.js";import{VertexAttribute as R}from"../views/3d/webgl-engine/lib/VertexAttribute.js";import{ambientBoost as U}from"../views/3d/webgl-engine/lighting/SceneLighting.js";function k(k){const W=new I,H=W.vertex.code,q=W.fragment.code;W.include(S,{name:"Default Material Shader",output:k.output});const J=N(W,k);return W.include(c),W.varyings.add("vpos","vec3"),W.include(P,k),W.include(s,k),W.include(u,k),k.output!==i.Color&&k.output!==i.Alpha||(E(W.vertex,k),W.include(n,k),W.include(l,{linearDepth:!1,hasModelTransformation:k.hasModelTransformation}),k.normalType===d.Attribute&&k.offsetBackfaces&&W.include(a),W.include(b,k),W.include(v,k),k.instancedColor&&W.attributes.add(R.INSTANCECOLOR,"vec4"),W.varyings.add("localvpos","vec3"),W.include(g,k),W.include(o,k),W.include(m,k),W.include(p,k),W.vertex.uniforms.add(new _("externalColor",(e=>e.externalColor))),W.varyings.add("vcolorExt","vec4"),k.hasMultipassTerrain&&W.varyings.add("depth","float"),k.hasModelTransformation&&W.vertex.uniforms.add(new B("model",(o=>e(o.modelTransformation)?o.modelTransformation:r))),H.add(V`
  6. void main(void) {
  7. forwardNormalizedVertexColor();
  8. vcolorExt = externalColor;
  9. ${k.instancedColor?"vcolorExt *= instanceColor;":""}
  10. vcolorExt *= vvColor();
  11. vcolorExt *= getSymbolColor();
  12. forwardColorMixMode();
  13. if (vcolorExt.a < ${V.float(O)}) {
  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. ${k.normalType===d.Attribute?V`vNormalWorld = dpNormal(vvLocalNormal(normalModel()));`:""}
  20. vpos = addVerticalOffset(vpos, localOrigin);
  21. ${k.hasVertexTangents?"vTangent = dpTransformVertexTangent(tangent);":""}
  22. gl_Position = transformPosition(proj, view, ${k.hasModelTransformation?"model,":""} vpos);
  23. ${k.normalType===d.Attribute&&k.offsetBackfaces?"gl_Position = offsetBackfacingClipPosition(gl_Position, vpos, vNormalWorld, cameraPosition);":""}
  24. }
  25. ${k.hasMultipassTerrain?"depth = (view * vec4(vpos, 1.0)).z;":""}
  26. forwardLinearDepth();
  27. forwardTextureCoordinates();
  28. }
  29. `)),k.output===i.Alpha&&(W.include(t,k),W.include(A,k),W.include(x,k),W.fragment.uniforms.add([new F("opacity",(e=>e.opacity)),new F("layerOpacity",(e=>e.layerOpacity))]),k.hasColorTexture&&W.fragment.uniforms.add(new z("tex",(e=>e.texture))),W.fragment.include($),q.add(V`
  30. void main() {
  31. discardBySlice(vpos);
  32. ${k.hasMultipassTerrain?"terrainDepthTest(gl_FragCoord, depth);":""}
  33. ${k.hasColorTexture?V`
  34. vec4 texColor = texture2D(tex, vuv0);
  35. ${k.textureAlphaPremultiplied?"texColor.rgb /= texColor.a;":""}
  36. discardOrAdjustAlpha(texColor);`:V`vec4 texColor = vec4(1.0);`}
  37. ${k.hasVertexColors?V`float opacity_ = layerOpacity * mixExternalOpacity(vColor.a * opacity, texColor.a, vcolorExt.a, int(colorMixMode));`:V`float opacity_ = layerOpacity * mixExternalOpacity(opacity, texColor.a, vcolorExt.a, int(colorMixMode));`}
  38. gl_FragColor = vec4(opacity_);
  39. }
  40. `)),k.output===i.Color&&(W.include(t,k),W.include(w,k),W.include(f,k),W.include(A,k),W.include(k.instancedDoublePrecision?L:T,k),W.include(x,k),E(W.fragment,k),W.fragment.uniforms.add([J,new D("ambient",(e=>e.ambient)),new D("diffuse",(e=>e.diffuse)),new F("opacity",(e=>e.opacity)),new F("layerOpacity",(e=>e.layerOpacity)),new F("lightingGlobalFactor",((e,r)=>r.lighting.globalFactor)),new D("lightingMainIntensity",((e,r)=>r.lighting.mainLight.intensity))]),W.fragment.constants.add("ambientBoostFactor","float",U),k.hasColorTexture&&W.fragment.uniforms.add(new z("tex",(e=>e.texture))),W.include(j,k),W.include(C,k),W.fragment.include($),W.include(y,k),q.add(V`
  41. void main() {
  42. discardBySlice(vpos);
  43. ${k.hasMultipassTerrain?"terrainDepthTest(gl_FragCoord, depth);":""}
  44. ${k.hasColorTexture?V`
  45. vec4 texColor = texture2D(tex, vuv0);
  46. ${k.textureAlphaPremultiplied?"texColor.rgb /= texColor.a;":""}
  47. discardOrAdjustAlpha(texColor);`:V`vec4 texColor = vec4(1.0);`}
  48. shadingParams.viewDirection = normalize(vpos - cameraPosition);
  49. ${k.normalType===d.ScreenDerivative?V`
  50. vec3 normal = screenDerivativeNormal(localvpos);`:V`
  51. shadingParams.normalView = vNormalWorld;
  52. vec3 normal = shadingNormal(shadingParams);`}
  53. ${k.pbrMode===M.Normal?"applyPBRFactors();":""}
  54. float ssao = evaluateAmbientOcclusionInverse();
  55. ssao *= getBakedOcclusion();
  56. float additionalAmbientScale = additionalDirectedAmbientLight(vpos + localOrigin);
  57. ${k.receiveShadows?"float shadow = readShadowMap(vpos, linearDepth);":k.spherical?"float shadow = lightingGlobalFactor * (1.0 - additionalAmbientScale);":"float shadow = 0.0;"}
  58. vec3 matColor = max(ambient, diffuse);
  59. ${k.hasVertexColors?V`
  60. vec3 albedo = mixExternalColor(vColor.rgb * matColor, texColor.rgb, vcolorExt.rgb, int(colorMixMode));
  61. float opacity_ = layerOpacity * mixExternalOpacity(vColor.a * opacity, texColor.a, vcolorExt.a, int(colorMixMode));`:V`
  62. vec3 albedo = mixExternalColor(matColor, texColor.rgb, vcolorExt.rgb, int(colorMixMode));
  63. float opacity_ = layerOpacity * mixExternalOpacity(opacity, texColor.a, vcolorExt.a, int(colorMixMode));`}
  64. ${k.hasNormalTexture?V`
  65. mat3 tangentSpace = ${k.hasVertexTangents?"computeTangentSpace(normal);":"computeTangentSpace(normal, vpos, vuv0);"}
  66. vec3 shadingNormal = computeTextureNormal(tangentSpace, vuv0);`:V`vec3 shadingNormal = normal;`}
  67. vec3 normalGround = ${k.spherical?V`normalize(vpos + localOrigin);`:V`vec3(0.0, 0.0, 1.0);`}
  68. ${k.snowCover?V`
  69. float snow = smoothstep(0.5, 0.55, dot(normal, normalGround));
  70. albedo = mix(albedo, vec3(1), snow);
  71. shadingNormal = mix(shadingNormal, normal, snow);
  72. ssao = mix(ssao, 1.0, snow);`:""}
  73. vec3 additionalLight = ssao * lightingMainIntensity * additionalAmbientScale * ambientBoostFactor * lightingGlobalFactor;
  74. ${k.pbrMode===M.Normal||k.pbrMode===M.Schematic?V`
  75. float additionalAmbientIrradiance = additionalAmbientIrradianceFactor * lightingMainIntensity[2];
  76. ${k.snowCover?V`
  77. mrr = mix(mrr, vec3(0.0, 1.0, 0.04), snow);
  78. emission = mix(emission, vec3(0.0), snow);`:""}
  79. vec3 shadedColor = evaluateSceneLightingPBR(shadingNormal, albedo, shadow, 1.0 - ssao, additionalLight, shadingParams.viewDirection, normalGround, mrr, emission, additionalAmbientIrradiance);`:V`vec3 shadedColor = evaluateSceneLighting(shadingNormal, albedo, shadow, 1.0 - ssao, additionalLight);`}
  80. gl_FragColor = highlightSlice(vec4(shadedColor, opacity_), vpos);
  81. ${k.transparencyPassType===G.Color?V`gl_FragColor = premultiplyAlpha(gl_FragColor);`:""}
  82. }
  83. `)),W.include(h,k),W}const W=Object.freeze(Object.defineProperty({__proto__:null,build:k},Symbol.toStringTag,{value:"Module"}));export{W as D,k as b};