@maptalks/gpu 0.124.3 → 0.124.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/maptalksgpu.es.js +8 -8
- package/dist/maptalksgpu.js +8 -8
- package/package.json +2 -2
package/dist/maptalksgpu.es.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @maptalks/gpu v0.124.
|
|
2
|
+
* @maptalks/gpu v0.124.4
|
|
3
3
|
* LICENSE : UNLICENSED
|
|
4
4
|
* (c) 2016-2026 maptalks.com
|
|
5
5
|
*/
|
|
@@ -49,7 +49,7 @@ var glFillFrag = "#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag
|
|
|
49
49
|
|
|
50
50
|
var glFillVert = "#include <vsm_shadow_vert>\nstruct VertexInput {\n @location($i) aPosition: vec3f,\n#ifdef HAS_PATTERN\n @location($i) aTexCoord: vec2f,\n#endif\n};\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n#ifdef HAS_PATTERN\n @location($o) vTexCoord: vec2f,\n#endif\n};\nstruct BackFillUniforms {\n projViewModelMatrix: mat4x4f,\n modelMatrix: mat4x4f,\n#ifdef HAS_PATTERN\n uvScale: vec2f,\n uvOffset: vec2f,\n#endif\n};\n@group(0) @binding($b) var<uniform> uniforms: BackFillUniforms;\n@vertex\nfn main(vertexInput: VertexInput) -> VertexOutput {\n var vertexOutput: VertexOutput;\n#ifdef HAS_PATTERN\n vertexOutput.vTexCoord = vertexInput.aTexCoord * uniforms.uvScale + uniforms.uvOffset;\n#endif\n let position = vec3f(vertexInput.aPosition.xyz);\n vertexOutput.position = uniforms.projViewModelMatrix * vec4f(position, 1.0);\n#if HAS_SHADOWING && !HAS_BLOOM\n shadow_computeShadowPars(vec4f(position, 1.0), &vertexOutput);\n#endif\n return vertexOutput;\n}";
|
|
51
51
|
|
|
52
|
-
var glTerrainFrag = "#define SHADER_NAME TERRAIN_MESH\n#include <mask_frag>\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\nstruct TerrainUniforms {\n polygonOpacity: f32,\n};\n@group(0) @binding($b) var<uniform> uniforms: TerrainUniforms;\n@group(0) @binding($b) var skin: texture_2d<f32>;\n@group(0) @binding($b) var skinSampler: sampler;\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n var uv = vec2f(vertexOutput.vUv);\n var color = textureSample(skin, skinSampler, uv);\n #if HAS_SHADOWING && !HAS_BLOOM\n var shadowCoeff = shadow_computeShadow();\n color.rgb = shadow_blend(color.rgb, shadowCoeff).rgb;\n #endif\n var fragColor = color * uniforms.polygonOpacity;\n #ifdef HAS_MASK_EXTENT\n fragColor = setMask(fragColor);\n #endif\n return fragColor;\n}";
|
|
52
|
+
var glTerrainFrag = "#define SHADER_NAME TERRAIN_MESH\n#include <mask_frag>\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\nstruct TerrainUniforms {\n polygonOpacity: f32,\n};\n@group(0) @binding($b) var<uniform> uniforms: TerrainUniforms;\n@group(0) @binding($b) var skin: texture_2d<f32>;\n@group(0) @binding($b) var skinSampler: sampler;\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n var uv = vec2f(vertexOutput.vUv);\n var color = textureSample(skin, skinSampler, uv);\n #if HAS_SHADOWING && !HAS_BLOOM\n var shadowCoeff = shadow_computeShadow(vertexOutput);\n color.rgb = shadow_blend(color.rgb, shadowCoeff).rgb;\n #endif\n var fragColor = color * uniforms.polygonOpacity;\n #ifdef HAS_MASK_EXTENT\n fragColor = setMask(fragColor);\n #endif\n return fragColor;\n}";
|
|
53
53
|
|
|
54
54
|
var glTerrainSkinFrag = "struct TerrrainSkinUniforms {\n tileSize: f32,\n skinDim: vec3f,\n opacity: f32,\n flipY: f32\n}\n@group(0) @binding($b) var<uniform> uniforms: TerrrainSkinUniforms;\n@group(0) @binding($b) var skinTexture: texture_2d<f32>;\n@group(0) @binding($b) var skinTextureSampler: sampler;\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n var fragCoord = vertexOutput.position.xy / 2.0;\n var resolution = vec2f(uniforms.tileSize);\n var uv = (fragCoord - uniforms.skinDim.xy) / (resolution * uniforms.skinDim.z);\n if (uniforms.flipY > 0.5) {\n uv.y = 1.0 - uv.y;\n }\n var color = textureSample(skinTexture, skinTextureSampler, uv);\n var opacity = 0.0;\n if (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0) {\n opacity = uniforms.opacity;\n }\n return color * opacity;\n}";
|
|
55
55
|
|
|
@@ -57,7 +57,7 @@ var glTerrainSkinVert = "struct VertexInput {\n @location($i) aPosition: vec2
|
|
|
57
57
|
|
|
58
58
|
var glTerrainVert = "#include <common_pack_float>\n#include <mask_vert>\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_vert>\n#endif\nstruct MatrixUniforms {\n projMatrix: mat4x4f,\n heightScale: f32,\n};\nstruct TerrainUniforms {\n minAltitude: f32,\n projViewModelMatrix: mat4x4f,\n modelMatrix: mat4x4f,\n modelViewMatrix: mat4x4f,\n positionMatrix: mat4x4f,\n};\nstruct VertexOutput {\n @builtin(position) position : vec4f,\n @location($o) vUv: vec2f,\n};\nstruct VertexInput {\n @location($i) aPosition: vec3f,\n @location($i) aTexCoord: vec2f,\n};\n@group(0) @binding($b) var<uniform> matrixUniforms: MatrixUniforms;\n@group(0) @binding($b) var<uniform> uniforms: TerrainUniforms;\n@group(0) @binding($b) var flatMaskSampler: sampler;\n@group(0) @binding($b) var flatMask: texture_2d<f32>;\n@vertex\nfn main(\n vertexInput: VertexInput,\n) -> VertexOutput {\n var vertexOutput: VertexOutput;\n var uv: vec2f = vertexInput.aTexCoord;\n let encodedHeight: vec4f = textureSampleLevel(flatMask, flatMaskSampler, uv, 0.0);\n var altitude: f32 = vertexInput.aPosition.z;\n if (length(encodedHeight) < 2.0) {\n let maskHeight: f32 = decodeFloat32(encodedHeight);\n altitude = min(vertexInput.aPosition.z, maskHeight);\n }\n var position: vec4f = vec4f(vertexInput.aPosition.xy, (altitude + uniforms.minAltitude) * matrixUniforms.heightScale, 1.0);\n position = uniforms.positionMatrix * position;\n #ifdef HAS_MASK_EXTENT\n vertexOutput.position = matrixUniforms.projMatrix * getMaskPosition(position, uniforms.modelMatrix, vertexOutput);\n #else\n vertexOutput.position = uniforms.projViewModelMatrix * position;\n #endif\n vertexOutput.vUv = vertexInput.aTexCoord;\n #if HAS_SHADOWING && !HAS_BLOOM\n shadow_computeShadowPars(position, &vertexOutput);\n #endif\n return vertexOutput;\n}";
|
|
59
59
|
|
|
60
|
-
var glStandardFrag = "#include <hsv_frag>\n#include <srgb_frag>\n#include <highlight_frag>\n#include <snow_frag>\n#include <mask_frag>\n#include <terrain_normal_frag>\n#include <vertex_color_frag>\n#include <excavate_frag>\n#include <compute_texcoord_frag>\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\n#define PI 3.141593\n#define RECIPROCAL_PI 0.3183099\nstruct MaterialUniforms {\n roughnessMetalness: vec2f,\n albedo: vec3f,\n alpha: f32,\n normal: vec3f,\n emit: vec3f,\n ao: f32,\n specularColor: vec3f,\n glossiness: f32,\n skinColor: vec4f,\n #ifdef MESH_ENV_EXPO\n environmentExposure: f32,\n #endif\n};\nvar<private> materialUniforms: MaterialUniforms;\nstruct SceneUniforms {\n alphaTest: f32,\n emissiveFactor: vec3f,\n baseColorFactor: vec4f,\n baseColorIntensity: f32,\n emitColorFactor: f32,\n occlusionFactor: f32,\n roughnessFactor: f32,\n metallicFactor: f32,\n normalMapFactor: f32,\n specularF0: f32,\n emitMultiplicative: f32,\n normalMapFlipY: f32,\n outputSRGB: f32,\n contrast: f32,\n hsv: vec3f,\n specularAAVariance: f32,\n specularAAThreshold: f32,\n #if HAS_SSR\n invProjMatrix: mat4x4f,\n outputFovInfo: array<vec4f, 2>,\n reprojViewProjMatrix: mat4x4f,\n #endif\n #ifndef HAS_COLOR\n #ifdef IS_LINE_EXTRUSION\n lineColor: vec4f,\n #else\n polygonFill: vec4f,\n #endif\n #endif\n #ifdef HAS_PATTERN\n #ifndef HAS_PATTERN_ANIM\n linePatternAnimSpeed: f32,\n #endif\n #ifndef HAS_PATTERN_GAP\n linePatternGap: f32,\n #endif\n linePatternGapColor: vec4f,\n flipY: f32,\n animSpeedScale: f32,\n uvScale: vec2f,\n atlasSize: vec2f,\n #endif\n #ifdef IS_LINE_EXTRUSION\n lineOpacity: f32,\n #else\n polygonOpacity: f32,\n #endif\n};\nstruct ShaderUniforms {\n #if HAS_IBL_LIGHTING\n hdrHSV: vec3f,\n diffuseSPH: array<vec3f, 9>,\n prefilterMiplevel: vec2f,\n prefilterSize: vec2f,\n #else\n ambientColor: vec3f,\n #endif\n cameraPosition: vec3f,\n cameraNearFar: vec2f,\n #ifndef MESH_ENV_EXPO\n environmentExposure: f32,\n #endif\n environmentTransform: mat3x3f,\n light0_viewDirection: vec3f,\n light0_diffuse: vec4f,\n #if HAS_LAYER_OPACITY\n layerOpacity: f32,\n #endif\n #if HAS_SSR\n outSize: vec2f,\n ssrFactor: f32,\n ssrQuality: f32,\n projMatrix: mat4x4f,\n #endif\n #ifdef HAS_PATTERN\n currentTime: f32,\n #endif\n}\n@group(0) @binding($b) var<uniform> uniforms: SceneUniforms;\n@group(0) @binding($b) var<uniform> shaderUniforms: ShaderUniforms;\n#if HAS_ALBEDO_MAP\n @group(0) @binding($b) var baseColorTexture: texture_2d<f32>;\n @group(0) @binding($b) var baseColorTextureSampler: sampler;\n#endif\n#if HAS_METALLICROUGHNESS_MAP\n @group(0) @binding($b) var metallicRoughnessTexture: texture_2d<f32>;\n @group(0) @binding($b) var metallicRoughnessTextureSampler: sampler;\n#endif\n#if HAS_EMISSIVE_MAP\n @group(0) @binding($b) var emissiveTexture: texture_2d<f32>;\n @group(0) @binding($b) var emissiveTextureSampler: sampler;\n#endif\n#if HAS_AO_MAP\n @group(0) @binding($b) var occlusionTexture: texture_2d<f32>;\n @group(0) @binding($b) var occlusionTextureSampler: sampler;\n#endif\n#if HAS_NORMAL_MAP && HAS_TANGENT\n @group(0) @binding($b) var normalTexture: texture_2d<f32>;\n @group(0) @binding($b) var normalTextureSampler: sampler;\n#endif\n#if HAS_SKIN_MAP\n @group(0) @binding($b) var skinTexture: texture_2d<f32>;\n @group(0) @binding($b) var skinTextureSampler: sampler;\n#endif\n#if HAS_RANDOM_TEX\n @group(0) @binding($b) var noiseTexture: texture_2d<f32>;\n @group(0) @binding($b) var noiseTextureSampler: sampler;\n#endif\n@group(0) @binding($b) var brdfLUT: texture_2d<f32>;\n@group(0) @binding($b) var brdfLUTSampler: sampler;\n#if HAS_IBL_LIGHTING\n @group(0) @binding($b) var prefilterMap: texture_cube<f32>;\n @group(0) @binding($b) var prefilterMapSampler: sampler;\n#endif\n#if HAS_SSR\n @group(0) @binding($b) var TextureDepth: texture_2d<f32>;\n @group(0) @binding($b) var TextureDepthSampler: sampler;\n @group(0) @binding($b) var TextureReflected: texture_2d<f32>;\n @group(0) @binding($b) var TextureReflectedSampler: sampler;\n#endif\n#if HAS_BUMP_MAP && HAS_TANGENT\n @group(0) @binding($b) var bumpTexture: texture_2d<f32>;\n @group(0) @binding($b) var bumpSampler: sampler;\n#endif\n#if HAS_PATTERN\n @group(0) @binding($b) var linePatternFile: texture_2d<f32>;\n @group(0) @binding($b) var linePatternFileSampler: sampler;\n#endif\nfn getMaterialAlbedo() -> vec3f {\n return materialUniforms.albedo;\n}\nfn getMaterialAlpha() -> f32 {\n return materialUniforms.alpha;\n}\nfn getMaterialMetalness() -> f32 {\n return materialUniforms.roughnessMetalness.y;\n}\nfn getMaterialRoughness() -> f32 {\n #if SHADING_MODEL_SPECULAR_GLOSSINESS\n return 1.0 - materialUniforms.glossiness;\n #else\n return materialUniforms.roughnessMetalness.x;\n #endif\n}\nfn getMaterialEmitColor() -> vec3f {\n return materialUniforms.emit;\n}\nfn getMaterialSkinColor() -> vec4f {\n return materialUniforms.skinColor;\n}\nfn getMaterialNormalMap() -> vec3f {\n return materialUniforms.normal;\n}\nfn getMaterialOcclusion() -> f32 {\n return materialUniforms.ao;\n}\nfn decodeDepth(pack: vec4f) -> f32 {\n return pack.r + pack.g / 255.0;\n}\nfn transformNormal(factor: f32, normalToTransform: vec3f, t: vec3f, b: vec3f, n: vec3f) -> vec3f {\n let normal = vec3f(normalToTransform.xy * factor, normalToTransform.z);\n let tbn = mat3x3f(t, b, n);\n return normalize(tbn * normal);\n}\nfn D_GGX(roughness: f32, normal: vec3f, H: vec3f) -> f32 {\n let NoH = clamp(dot(normal, H), 0.0, 1.0);\n let a = roughness * roughness;\n let a2 = a * a;\n let d = (NoH * a2 - NoH) * NoH + 1.0;\n return a2 / ( PI * d * d);\n}\nfn F_Schlick(f0: vec3f, f90: f32, L: vec3f, H: vec3f) -> vec3f {\n var VoH = clamp(dot(L, H), 0.0, 1.0);\n VoH = pow(1.0 - VoH, 5.0);\n return f90 * VoH + (1.0 - VoH) * f0;\n}\nfn V_SmithGGXCorrelated(normal: vec3f, V: vec3f, roughness: f32, NoL: f32) -> f32 {\n let NoV = clamp(dot(normal, V), 0.0, 1.0);\n let a = roughness * roughness;\n let GGXL = NoV * (NoL * (1.0 - a) + a);\n let GGXV = NoL * (NoV * (1.0 - a) + a);\n return 0.5 / (GGXV + GGXL);\n}\nfn computeSpecularBRDF(roughness: f32, normal: vec3f, V: vec3f, L: vec3f, specular: vec3f, NoL: f32, f90: f32) -> vec3f {\n let H = normalize(V + L);\n let D = D_GGX(roughness, normal, H);\n let V_S = V_SmithGGXCorrelated(normal, V, roughness, NoL);\n let F = F_Schlick(specular, f90, L, H);\n return (D * V_S * PI) * F;\n}\nfn BRDF_Lambert(diffuseColor: vec3f) -> vec3f {\n return RECIPROCAL_PI * diffuseColor;\n}\nstruct LambertLight {\n diffuse: vec3f,\n specular: vec3f\n}\nfn computeLambert(\n normal: vec3f,\n V: vec3f,\n NoL: f32,\n roughness: f32,\n materialDiffuse: vec3f,\n specular: vec3f,\n lightColor: vec3f,\n L: vec3f,\n f90: f32\n) -> LambertLight {\n var lambert: LambertLight;\n if (NoL <= 0.0) {\n lambert.diffuse = vec3f(0.0);\n lambert.specular = vec3f(0.0);\n return lambert;\n }\n let a = NoL * lightColor;\n let brdf = computeSpecularBRDF(roughness, normal, V, L, specular, NoL, f90);\n lambert.specular = a * brdf;\n lambert.diffuse = a * BRDF_Lambert(materialDiffuse);\n return lambert;\n}\n#if HAS_IBL_LIGHTING\n fn computeDiffuseSPH(normal: vec3f) -> vec3f {\n let n = shaderUniforms.environmentTransform * normal;\n let diffuseSPH = shaderUniforms.diffuseSPH;\n let x = n.x;\n let y = n.y;\n let z = n.z;\n let result = (\n diffuseSPH[0] +\n diffuseSPH[1] * x +\n diffuseSPH[2] * y +\n diffuseSPH[3] * z +\n diffuseSPH[4] * z * x +\n diffuseSPH[5] * y * z +\n diffuseSPH[6] * y * x +\n diffuseSPH[7] * (3.0 * z * z - 1.0) +\n diffuseSPH[8] * (x*x - y*y)\n );\n if (length(shaderUniforms.hdrHSV) > 0.0) {\n return hsv_apply3(result, shaderUniforms.hdrHSV);\n }\n return max(result, vec3f(0.0));\n }\n fn fetchEnvMap(roughness: f32, R: vec3f) -> vec3f {\n let dir = R;\n let maxLevels = shaderUniforms.prefilterMiplevel.x;\n let lod = min(maxLevels, roughness * shaderUniforms.prefilterMiplevel.y);\n var envLight = textureSampleLevel(prefilterMap, prefilterMapSampler, dir, lod).rgb;\n if (length(shaderUniforms.hdrHSV) > 0.0) {\n envLight = hsv_apply3(envLight, shaderUniforms.hdrHSV);\n }\n return envLight;\n }\n fn getIBLEnvMap(N: vec3f, V: vec3f, roughness: f32, frontNormal: vec3f, materialDiffuse: vec3f) -> vec3f {\n let smoothness = 1.0 - roughness;\n let R = mix(N, reflect(-V, N), smoothness * (sqrt(smoothness) + roughness));\n let factor = clamp(1.0 + dot(R, frontNormal), 0.0, 1.0);\n let prefilteredEnvColor = fetchEnvMap(roughness, shaderUniforms.environmentTransform * R) * factor * factor;\n return prefilteredEnvColor;\n }\n#else\n fn getIBLEnvMap(normal: vec3f, eyeVector: vec3f, roughness: f32, frontNormal: vec3f, materialDiffuse: vec3f) -> vec3f {\n return shaderUniforms.ambientColor * BRDF_Lambert(materialDiffuse);\n }\n#endif\nfn computeBRDF(spec: vec3f, roughness: f32, NoV: f32, f90: f32) -> vec3f {\n let rgba = textureSample(brdfLUT, brdfLUTSampler, vec2f(NoV, roughness)) * vec4f(255.0, 65280.0, 255.0, 65280.0);\n let b = (rgba[3] + rgba[2]);\n let a = (rgba[1] + rgba[0]);\n return (spec * a + b * f90) / 65535.0;\n}\nfn computeIBLSpecular(\n normal: vec3f,\n eyeVector: vec3f,\n NoV: f32,\n roughness: f32,\n specular: vec3f,\n frontNormal: vec3f,\n f90: f32,\n materialDiffuse: vec3f\n) -> vec3f {\n return getIBLEnvMap(normal, eyeVector, roughness, frontNormal, materialDiffuse) * computeBRDF(specular, roughness, NoV, f90);\n}\nfn computeSpecularAO(ao: f32, NoV: f32) -> f32 {\n let d = NoV + ao;\n return clamp((d * d) - 1.0 + ao, 0.0, 1.0);\n}\n#ifdef HAS_PATTERN\n fn computeUV(input: VertexOutput, texCoord: vec2f) -> vec2f {\n let uv = texCoord % 1.0;\n let uvStart = vec2f(input.vTexInfo.xy);\n let uvSize = vec2f(input.vTexInfo.zw);\n return (uvStart + uv * uvSize) / uniforms.atlasSize;\n }\n#endif\nfn initMaterial(vertexOutput: VertexOutput) -> MaterialUniforms {\n var materialUniforms: MaterialUniforms;\n var uv: vec2f;\n#ifdef HAS_MAP\n uv = computeTexCoord(vertexOutput.vTexCoord, vertexOutput);\n#endif\n#ifdef HAS_UV_FLIP\n uv.y = 1.0 - uv.y;\n#endif\n#if HAS_BUMP_MAP && HAS_TANGENT\n uv = bumpUV(uv, normalize(vertexOutput.vTangentViewPos - vertexOutput.vTangentFragPos));\n#endif\n materialUniforms.albedo = uniforms.baseColorIntensity * uniforms.baseColorFactor.rgb;\n materialUniforms.alpha = uniforms.baseColorFactor.a * vertexOutput.vOpacity;\n#if HAS_PATTERN\n var linesofar = vertexOutput.vLinesofar;\n let uvSize = vertexOutput.vTexInfo.zw;\n#ifdef HAS_PATTERN_GAP\n let myGap = vertexOutput.vLinePatternGap;\n#else\n let myGap = uniforms.linePatternGap;\n#endif\n#ifdef HAS_PATTERN_ANIM\n let myAnimSpeed = vertexOutput.vLinePatternAnimSpeed;\n#else\n let myAnimSpeed = uniforms.linePatternAnimSpeed;\n#endif\n let patternWidth = ceil(uvSize.x * vertexOutput.vPatternHeight / uvSize.y);\n let plusGapWidth = patternWidth * (1.0 + myGap);\n let animSpeed = myAnimSpeed / uniforms.animSpeedScale;\n linesofar += (shaderUniforms.currentTime * -animSpeed * 0.2) % plusGapWidth;\n let patternx = (linesofar / plusGapWidth) % 1.0;\n let patterny = (uniforms.flipY * vertexOutput.vNormalY) % 1.0;\n let texCoord = vec2f(patternx * (1.0 + myGap) * uniforms.uvScale[0], patterny * uniforms.uvScale[1]);\n uv = computeUV(vertexOutput, texCoord);\n var patternColor = textureSample(linePatternFile, linePatternFileSampler, uv);\n let inGap = clamp(sign(1.0 / (1.0 + myGap) - patternx) + 0.000001, 0.0, 1.0);\n patternColor = mix(uniforms.linePatternGapColor, patternColor, inGap);\n#ifdef IS_SQUARE_TUBE\n let v = clamp(sign(abs(vertexOutput.vNormalY) - 0.999999), 0.0, 1.0);\n patternColor = mix(patternColor, vec4(1.0), v);\n#endif\n materialUniforms.albedo *= patternColor.rgb;\n materialUniforms.alpha *= patternColor.a;\n#endif\n#if HAS_ALBEDO_MAP\n let baseColor = textureSample(baseColorTexture, baseColorTextureSampler, uv);\n materialUniforms.albedo *= sRGBToLinear(baseColor.rgb);\n materialUniforms.alpha *= baseColor.a;\n#endif\n#if HAS_SKIN_MAP\n let skinColorValue = textureSample(skinTexture, skinTextureSampler, uv);\n materialUniforms.skinColor = skinColorValue;\n#endif\n#if HAS_COLOR0\n materialUniforms.albedo *= vertexOutput.vColor0.rgb;\n#if COLOR0_SIZE == 4\n materialUniforms.alpha *= vertexOutput.vColor0.a;\n#endif\n#endif\n#if HAS_COLOR\n materialUniforms.albedo *= vertexOutput.vColor.rgb;\n materialUniforms.alpha *= vertexOutput.vColor.a;\n#elif IS_LINE_EXTRUSION\n materialUniforms.albedo *= uniforms.lineColor.rgb;\n materialUniforms.alpha *= uniforms.lineColor.a;\n#else\n materialUniforms.albedo *= uniforms.polygonFill.rgb;\n materialUniforms.alpha *= uniforms.polygonFill.a;\n#endif\n#if HAS_INSTANCE_COLOR\n materialUniforms.albedo *= vertexOutput.vInstanceColor.rgb;\n materialUniforms.alpha *= vertexOutput.vInstanceColor.a;\n#endif\n#if HAS_METALLICROUGHNESS_MAP\n let mrSample = textureSample(metallicRoughnessTexture, metallicRoughnessTextureSampler, uv).gb;\n materialUniforms.roughnessMetalness = mrSample * vec2(uniforms.roughnessFactor, uniforms.metallicFactor);\n#else\n materialUniforms.roughnessMetalness = vec2(uniforms.roughnessFactor, uniforms.metallicFactor);\n#endif\n materialUniforms.emit = uniforms.emissiveFactor;\n#if HAS_EMISSIVE_MAP\n if (uniforms.emitMultiplicative == 1.0) {\n materialUniforms.emit *= sRGBToLinear(textureSample(emissiveTexture, emissiveTextureSampler, uv).rgb);\n } else {\n materialUniforms.emit += sRGBToLinear(textureSample(emissiveTexture, emissiveTextureSampler, uv).rgb);\n }\n#endif\n materialUniforms.emit *= uniforms.emitColorFactor;\n#if HAS_AO_MAP\n let aoTexCoord = computeTexCoord(vertexOutput.vTexCoord1, vertexOutput);\n materialUniforms.ao = textureSample(occlusionTexture, occlusionTextureSampler, aoTexCoord).r;\n#else\n materialUniforms.ao = 1.0;\n#endif\n materialUniforms.ao *= uniforms.occlusionFactor;\n#if HAS_NORMAL_MAP && HAS_TANGENT\n var nmap = textureSample(normalTexture, normalTextureSampler, uv).xyz * 2.0 - 1.0;\n nmap.y = select(nmap.y, -nmap.y, uniforms.normalMapFlipY == 1.0);\n materialUniforms.normal = nmap;\n#else\n materialUniforms.normal = normalize(vertexOutput.vModelNormal);\n#endif\n#if HAS_TERRAIN_NORMAL && HAS_TANGENT\n var nmap = convertTerrainHeightToNormalMap(uv);\n nmap.y = select(nmap.y, -nmap.y, uniforms.normalMapFlipY == 1.0);\n materialUniforms.normal = nmap;\n#endif\n#if SHADING_MODEL_SPECULAR_GLOSSINESS\n materialUniforms.albedo *= uniforms.diffuseFactor.rgb;\n materialUniforms.alpha *= uniforms.diffuseFactor.a;\n#if HAS_DIFFUSE_MAP\n let diffuse = textureSample(diffuseTexture, diffuseTextureSampler, uv);\n materialUniforms.albedo *= sRGBToLinear(diffuse.rgb);\n materialUniforms.alpha *= diffuse.a;\n#endif\n materialUniforms.specularColor = uniforms.specularFactor;\n materialUniforms.glossiness = uniforms.glossinessFactor;\n#if HAS_SPECULARGLOSSINESS_MAP\n let specularGlossiness = textureSample(specularGlossinessTexture, specularGlossinessTextureSampler, uv);\n materialUniforms.specularColor *= sRGBToLinear(specularGlossiness.rgb);\n materialUniforms.glossiness *= specularGlossiness.a;\n#endif\n#endif\n return materialUniforms;\n}\nfn HDR_ACES(x: vec3f) -> vec3f {\n const a = 2.51;\n const b = 0.03;\n const c = 2.43;\n const d = 0.59;\n const e = 0.14;\n return (x * (a * x + b)) / (x * (c * x + d) + e);\n}\nfn tonemap(color: vec3f) -> vec3f {\n let tonemapped = HDR_ACES(color);\n return pow(tonemapped, vec3f(1.0/2.2));\n}\nfn normalFiltering(roughness: f32, worldNormal: vec3f) -> f32 {\n let du = dpdx(worldNormal);\n let dv = dpdy(worldNormal);\n let variance = uniforms.specularAAVariance * (dot(du, du) + dot(dv, dv));\n let kernelRoughness = min(2.0 * variance, uniforms.specularAAThreshold);\n let squareRoughness = saturate(roughness * roughness + kernelRoughness);\n return sqrt(squareRoughness);\n}\n#if HAS_SSR\n fn ssrViewToScreen(projection: mat4x4f, viewVertex: vec3f) -> vec3f {\n let projected = projection * vec4f(viewVertex, 1.0);\n return vec3f(0.5 + 0.5 * projected.xy / projected.w, projected.w);\n }\n fn fetchColorLod(level: f32, uv: vec2f) -> vec3f {\n return textureSampleLevel(TextureReflected, TextureReflectedSampler, uv, level).rgb;\n }\n fn linearizeDepth(depth: f32) -> f32 {\n let projection = uniforms.projMatrix;\n let z = depth * 2.0 - 1.0; return -projection[3].z / (z + projection[2].z);\n }\n fn fetchDepth(uv: vec2f) -> f32 {\n let depth = decodeDepth(textureSample(TextureDepth, TextureDepthSampler, uv));\n return depth;\n }\n fn interleavedGradientNoise(fragCoord: vec2f, frameMod: f32) -> f32 {\n let magic = vec3f(0.06711056, 0.00583715, 52.9829189);\n return fract(magic.z * fract(dot(fragCoord.xy + frameMod * vec2f(47.0, 17.0) * 0.695, magic.xy))) * 0.5;\n }\n fn importanceSampling(\n frameMod: f32,\n tangentX: vec3f,\n tangentY: vec3f,\n tangentZ: vec3f,\n eyeVector: vec3f,\n rough4: f32\n ) -> vec3f {\n var E: vec2f;\n E.x = interleavedGradientNoise(fragCoord.yx, frameMod);\n E.y = fract(E.x * 52.9829189);\n E.y = mix(E.y, 1.0, 0.7);\n let phi = 2.0 * 3.14159 * E.x;\n let cosTheta = pow(max(E.y, 0.000001), rough4 / (2.0 - rough4));\n let sinTheta = sqrt(1.0 - cosTheta * cosTheta);\n var h = vec3f(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta);\n h = h.x * tangentX + h.y * tangentY + h.z * tangentZ;\n return normalize((2.0 * dot(eyeVector, h)) * h - eyeVector);\n }\n fn getStepOffset(frameMod: f32) -> f32 {\n return (interleavedGradientNoise(fragCoord.xy, frameMod) - 0.5);\n }\n fn computeRayDirUV(rayOriginUV: vec3f, rayLen: f32, rayDirView: vec3f) -> vec3f {\n let rayDirUV = ssrViewToScreen(uniforms.projMatrix, vViewVertex.xyz + rayDirView * rayLen);\n rayDirUV.z = 1.0 / rayDirUV.z;\n rayDirUV -= rayOriginUV;\n let scaleMaxX = min(1.0, 0.99 * (1.0 - rayOriginUV.x) / max(1e-5, rayDirUV.x));\n let scaleMaxY = min(1.0, 0.99 * (1.0 - rayOriginUV.y) / max(1e-5, rayDirUV.y));\n let scaleMinX = min(1.0, 0.99 * rayOriginUV.x / max(1e-5, -rayDirUV.x));\n let scaleMinY = min(1.0, 0.99 * rayOriginUV.y / max(1e-5, -rayDirUV.y));\n return rayDirUV * min(scaleMaxX, scaleMaxY) * min(scaleMinX, scaleMinY);\n }\n fn binarySearch(rayOriginUV: vec3f, rayDirUV: vec3f, startSteps: ptr<function, f32>, endSteps: ptr<function, f32>) -> f32 {\n let steps = (*startSteps + *endSteps) * 0.5;\n let sampleUV = rayOriginUV + rayDirUV * steps;\n let z = fetchDepth(sampleUV.xy);\n let depth = linearizeDepth(z);\n let sampleDepth = -1.0 / sampleUV.z;\n *startSteps = select(steps, *startSteps, depth > sampleDepth);\n *endSteps = select(*endSteps, steps, depth > sampleDepth);\n return steps;\n }\n fn rayTrace(\n rayOriginUV: vec3f,\n rayLen: f32,\n depthTolerance: f32,\n rayDirView: vec3f,\n roughness: f32,\n frameMod: f32\n ) -> vec4f {\n let checkSteps = 20;\n let invNumSteps = 1.0 / f32(checkSteps);\n depthTolerance *= invNumSteps;\n let rayDirUV = computeRayDirUV(rayOriginUV, rayLen, rayDirView);\n let sampleTime = invNumSteps;\n var diffSampleW = vec3f(0.0, sampleTime, 1.0);\n var sampleUV: vec3f;\n var hit = false;\n var hitDepth = 1.0;\n var steps: f32;\n for (var i = 0; i < checkSteps; i++) {\n sampleUV = rayOriginUV + rayDirUV * diffSampleW.y;\n let z = fetchDepth(sampleUV.xy);\n let depth = linearizeDepth(z);\n let sampleDepth = -1.0 / sampleUV.z;\n let validDepth = clamp(sign(0.999 - z), 0.0, 1.0);\n var depthDiff = validDepth * (sampleDepth - depth);\n depthDiff *= clamp(sign(abs(depthDiff) - rayLen * invNumSteps * invNumSteps), 0.0, 1.0);\n hit = abs(depthDiff + depthTolerance) < depthTolerance;\n let timeLerp = clamp(diffSampleW.x / (diffSampleW.x - depthDiff), 0.0, 1.0);\n let hitTime = select(1.0, (diffSampleW.y + timeLerp * invNumSteps - invNumSteps), hit);\n diffSampleW.z = min(diffSampleW.z, hitTime);\n diffSampleW.x = depthDiff;\n if (hit) {\n var startSteps = diffSampleW.y - invNumSteps;\n var endSteps = diffSampleW.y;\n steps = binarySearch(rayOriginUV, rayDirUV, &startSteps, &endSteps);\n steps = binarySearch(rayOriginUV, rayDirUV, &startSteps, &endSteps);\n steps = binarySearch(rayOriginUV, rayDirUV, &startSteps, &endSteps);\n hitDepth = steps;\n break;\n }\n diffSampleW.y += invNumSteps;\n }\n return vec4f(rayOriginUV + rayDirUV * hitDepth, 1.0 - hitDepth);\n }\n fn fetchColorInRay(\n resRay: vec4f,\n maskSsr: f32,\n specularEnvironment: vec3f,\n specularColor: vec3f,\n roughness: f32\n ) -> vec4f {\n let AB = mix(uniforms.outputFovInfo[0], uniforms.outputFovInfo[1], resRay.x);\n resRay.xyz = vec3f(mix(AB.xy, AB.zw, resRay.y), 1.0) * -1.0 / resRay.z;\n resRay.xyz = (uniforms.reprojViewProjMatrix * vec4f(resRay.xyz, 1.0)).xyw;\n resRay.xy /= resRay.z;\n let maskEdge = clamp(6.0 - 6.0 * max(abs(resRay.x), abs(resRay.y)), 0.0, 1.0);\n resRay.xy = 0.5 + 0.5 * resRay.xy;\n let fetchColor = specularColor * fetchColorLod(roughness * (1.0 - resRay.w), resRay.xy);\n return vec4f(mix(specularEnvironment, fetchColor, maskSsr * maskEdge), 1.0);\n }\n fn ssr(\n specularEnvironment: vec3f,\n specularColor: vec3f,\n roughness: f32,\n normal: vec3f,\n eyeVector: vec3f\n ) -> vec3f {\n let taaSS = 0.0;\n var result = vec4f(0.0);\n var rough4 = roughness * roughness;\n rough4 = rough4 * rough4;\n let upVector = select(vec3f(1.0, 0.0, 0.0), vec3f(0.0, 0.0, 1.0), abs(normal.z) < 0.999);\n let tangentX = normalize(cross(upVector, normal));\n let tangentY = cross(normal, tangentX);\n var maskSsr = shaderUniforms.ssrFactor * clamp(-4.0 * dot(eyeVector, normal) + 3.8, 0.0, 1.0);\n maskSsr *= clamp(4.7 - roughness * 5.0, 0.0, 1.0);\n let rayOriginUV = ssrViewToScreen(shaderUniforms.projMatrix, vViewVertex.xyz);\n rayOriginUV.z = 1.0 / rayOriginUV.z;\n let rayDirView = importanceSampling(taaSS, tangentX, tangentY, normal, eyeVector, rough4);\n let rayLen = mix(shaderUniforms.cameraNearFar.y + vViewVertex.z, -vViewVertex.z - shaderUniforms.cameraNearFar.x, rayDirView.z * 0.5 + 0.5);\n let depthTolerance = 0.5 * rayLen;\n var resRay: vec4f;\n if (dot(rayDirView, normal) > 0.001 && maskSsr > 0.0) {\n resRay = rayTrace(rayOriginUV, rayLen, depthTolerance, rayDirView, roughness, taaSS);\n if (resRay.w > 0.0) {\n result += fetchColorInRay(resRay, maskSsr, specularEnvironment, specularColor, roughness);\n }\n }\n return select(specularEnvironment, result.rgb / result.w, result.w > 0.0);\n }\n#endif\nfn sRGBTransferOETF(value: vec4f) -> vec4f {\n let isLow: vec3<bool> = value.rgb <= vec3f(0.0031308);\n let highPart: vec3f = pow(value.rgb, vec3f(0.41666)) * 1.055 - vec3f(0.055);\n let lowPart: vec3f = value.rgb * 12.92;\n let rgb: vec3f = select(highPart, lowPart, isLow);\n return vec4f(rgb, value.a);\n}\nfn linearToOutputTexel(value: vec4f) -> vec4f {\n return sRGBTransferOETF(value);\n}\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n materialUniforms = initMaterial(vertexOutput);\n var glFragColor: vec4f;\n let eyeVector = normalize(shaderUniforms.cameraPosition - vertexOutput.vModelVertex);\n #if HAS_DOUBLE_SIDE\n let frontNormal = select(-normalize(vertexOutput.vModelNormal), normalize(vertexOutput.vModelNormal), gl_FrontFacing);\n #else\n let frontNormal = normalize(vertexOutput.vModelNormal);\n #endif\n let f0 = 0.08 * uniforms.specularF0;\n let metal = getMaterialMetalness();\n var materialDiffuse = getMaterialAlbedo();\n #if SHADING_MODEL_SPECULAR_GLOSSINESS\n let materialSpecular = materialUniforms.specularColor;\n #else\n let materialSpecular = mix(vec3f(f0), materialDiffuse, metal);\n #endif\n materialDiffuse *= 1.0 - metal;\n let materialF90 = clamp(50.0 * materialSpecular.g, 0.0, 1.0);\n var materialRoughness = getMaterialRoughness();\n if (uniforms.specularAAVariance > 0.0) {\n materialRoughness = normalFiltering(materialRoughness, frontNormal);\n }\n let materialEmit = getMaterialEmitColor();\n var materialNormal = getMaterialNormalMap();\n #if HAS_TANGENT\n #if HAS_NORMAL_MAP || HAS_TERRAIN_NORMAL\n materialNormal = transformNormal(uniforms.normalMapFactor, materialNormal, vertexOutput.vModelTangent.xyz, vertexOutput.vModelBiTangent, frontNormal);\n #endif\n #endif\n var diffuse = vec3f(0.0);\n var specular = vec3f(0.0);\n #if HAS_IBL_LIGHTING\n diffuse = materialDiffuse * computeDiffuseSPH(materialNormal) * 0.5;\n #else\n diffuse = materialDiffuse * shaderUniforms.ambientColor;\n #endif\n let NoV = dot(materialNormal, eyeVector);\n specular = computeIBLSpecular(materialNormal, eyeVector, NoV, materialRoughness, materialSpecular, frontNormal, materialF90, materialDiffuse);\n #ifdef MESH_ENV_EXPO\n let environmentExposure = materialUniforms.environmentExposure;\n #else\n let environmentExposure = shaderUniforms.environmentExposure;\n #endif\n var specularAO = 1.0;\n let materialAO = getMaterialOcclusion();\n diffuse *= environmentExposure * materialAO;\n #if HAS_IBL_LIGHTING\n specularAO = computeSpecularAO(materialAO, NoV);\n #endif\n #if HAS_SSR\n var ssrfrontNormal = normalize(select(-vertexOutput.vViewNormal, vertexOutput.vViewNormal, gl_FrontFacing));\n var viewNormal = ssrfrontNormal;\n #if HAS_TANGENT\n #if HAS_NORMAL_MAP || HAS_TERRAIN_NORMAL\n var ssrTangent = select(-vertexOutput.vViewTangent, vertexOutput.vViewTangent, gl_FrontFacing);\n ssrTangent.xyz = normalize(ssrTangent.xyz);\n let ssrBinormal = normalize(cross(ssrfrontNormal, ssrTangent.xyz)) * ssrTangent.w;\n viewNormal = transformNormal(uniforms.normalMapFactor, materialNormal, ssrTangent.xyz, ssrBinormal, ssrfrontNormal);\n #endif\n #endif\n specular = ssr(specular, materialSpecular * specularAO, materialRoughness, viewNormal, -normalize(vertexOutput.vViewVertex.xyz));\n #endif\n specular *= environmentExposure * specularAO;\n let modelNormal = vertexOutput.vModelNormal;\n let lightDir = -shaderUniforms.light0_viewDirection;\n let dotNL = saturate(dot(lightDir, materialNormal));\n let lambertResult = computeLambert(materialNormal, eyeVector, dotNL, max(0.045, materialRoughness), materialDiffuse, materialSpecular, shaderUniforms.light0_diffuse.rgb, lightDir, materialF90);\n var ambientDiffuse = lambertResult.diffuse;\n var ambientSpecular = lambertResult.specular;\n #if HAS_SHADOWING && !HAS_BLOOM\n let shadowCoeff = shadow_computeShadow(vertexOutput);\n ambientDiffuse = shadow_blend(ambientDiffuse, shadowCoeff).rgb;\n ambientSpecular = shadow_blend(ambientSpecular, shadowCoeff).rgb;\n #endif\n diffuse += ambientDiffuse;\n specular += ambientSpecular;\n diffuse += materialEmit;\n var frag = specular + diffuse;\n if (uniforms.outputSRGB == 1.0) {\n frag = linearTosRGB(frag);\n }\n #if HAS_SKIN_MAP\n let skinColor = getMaterialSkinColor();\n frag = frag.rgb * (1.0 - skinColor.a) + skinColor.rgb * skinColor.a;\n #if HAS_SHADOWING && !HAS_BLOOM\n frag = shadow_blend(rgb, shadowCoeff).rgb;\n #endif\n #endif\n var alpha = getMaterialAlpha();\n if (alpha < uniforms.alphaTest) {\n discard;\n }\n #if ALPHA_MODE\n #if ALPHA_MODE == 1\n if (alpha < uniforms.alphaCutoff) {\n discard;\n } else {\n alpha = 1.0;\n }\n #else\n alpha = 1.0;\n #endif\n #endif\n #if IS_LINE_EXTRUSION\n alpha *= uniforms.lineOpacity;\n #else\n alpha *= uniforms.polygonOpacity;\n #endif\n glFragColor = vec4f(frag * alpha, alpha);\n #ifdef HAS_VERTEX_COLOR\n glFragColor *= vertexColor_get(vertexOutput);\n #endif\n #ifdef HAS_EXCAVATE_ANALYSIS\n glFragColor = excavateColor(glFragColor);\n #endif\n #ifdef HAS_SNOW\n let snowColor = snow(glFragColor, getMaterialNormalMap(), 1.0);\n glFragColor = vec4f(snowColor, glFragColor.a);\n #endif\n if (uniforms.contrast != 1.0) {\n glFragColor = contrastMatrix(uniforms.contrast) * glFragColor;\n }\n if (length(uniforms.hsv) > 0.0) {\n glFragColor = hsv_apply4(glFragColor, uniforms.hsv);\n }\n #ifdef OUTPUT_NORMAL\n glFragColor = vec4f(frontNormal, 1.0);\n #endif\n #if HAS_HIGHLIGHT_OPACITY || HAS_HIGHLIGHT_COLOR\n glFragColor = highlight_blendColor(glFragColor, vertexOutput);\n #endif\n #ifdef HAS_LAYER_OPACITY\n glFragColor *= shaderUniforms.layerOpacity;\n #endif\n #ifdef HAS_MASK_EXTENT\n glFragColor = setMask(glFragColor);\n #endif\n return glFragColor;\n}";
|
|
60
|
+
var glStandardFrag = "#include <hsv_frag>\n#include <srgb_frag>\n#include <highlight_frag>\n#include <snow_frag>\n#include <mask_frag>\n#include <terrain_normal_frag>\n#include <vertex_color_frag>\n#include <excavate_frag>\n#include <compute_texcoord_frag>\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\n#define PI 3.141593\n#define RECIPROCAL_PI 1.0\nstruct MaterialUniforms {\n roughnessMetalness: vec2f,\n albedo: vec3f,\n alpha: f32,\n normal: vec3f,\n emit: vec3f,\n ao: f32,\n specularColor: vec3f,\n glossiness: f32,\n skinColor: vec4f,\n #ifdef MESH_ENV_EXPO\n environmentExposure: f32,\n #endif\n};\nvar<private> materialUniforms: MaterialUniforms;\nstruct SceneUniforms {\n alphaTest: f32,\n emissiveFactor: vec3f,\n baseColorFactor: vec4f,\n baseColorIntensity: f32,\n emitColorFactor: f32,\n occlusionFactor: f32,\n roughnessFactor: f32,\n metallicFactor: f32,\n normalMapFactor: f32,\n specularF0: f32,\n emitMultiplicative: f32,\n normalMapFlipY: f32,\n outputSRGB: f32,\n contrast: f32,\n hsv: vec3f,\n specularAAVariance: f32,\n specularAAThreshold: f32,\n #if HAS_SSR\n invProjMatrix: mat4x4f,\n outputFovInfo: array<vec4f, 2>,\n reprojViewProjMatrix: mat4x4f,\n #endif\n #ifndef HAS_COLOR\n #ifdef IS_LINE_EXTRUSION\n lineColor: vec4f,\n #else\n polygonFill: vec4f,\n #endif\n #endif\n #ifdef HAS_PATTERN\n #ifndef HAS_PATTERN_ANIM\n linePatternAnimSpeed: f32,\n #endif\n #ifndef HAS_PATTERN_GAP\n linePatternGap: f32,\n #endif\n linePatternGapColor: vec4f,\n flipY: f32,\n animSpeedScale: f32,\n uvScale: vec2f,\n atlasSize: vec2f,\n #endif\n #ifdef IS_LINE_EXTRUSION\n lineOpacity: f32,\n #else\n polygonOpacity: f32,\n #endif\n};\nstruct ShaderUniforms {\n #if HAS_IBL_LIGHTING\n hdrHSV: vec3f,\n diffuseSPH: array<vec3f, 9>,\n prefilterMiplevel: vec2f,\n prefilterSize: vec2f,\n #else\n ambientColor: vec3f,\n #endif\n cameraPosition: vec3f,\n cameraNearFar: vec2f,\n #ifndef MESH_ENV_EXPO\n environmentExposure: f32,\n #endif\n environmentTransform: mat3x3f,\n light0_viewDirection: vec3f,\n light0_diffuse: vec4f,\n #if HAS_LAYER_OPACITY\n layerOpacity: f32,\n #endif\n #if HAS_SSR\n outSize: vec2f,\n ssrFactor: f32,\n ssrQuality: f32,\n projMatrix: mat4x4f,\n #endif\n #ifdef HAS_PATTERN\n currentTime: f32,\n #endif\n}\n@group(0) @binding($b) var<uniform> uniforms: SceneUniforms;\n@group(0) @binding($b) var<uniform> shaderUniforms: ShaderUniforms;\n#if HAS_ALBEDO_MAP\n @group(0) @binding($b) var baseColorTexture: texture_2d<f32>;\n @group(0) @binding($b) var baseColorTextureSampler: sampler;\n#endif\n#if HAS_METALLICROUGHNESS_MAP\n @group(0) @binding($b) var metallicRoughnessTexture: texture_2d<f32>;\n @group(0) @binding($b) var metallicRoughnessTextureSampler: sampler;\n#endif\n#if HAS_EMISSIVE_MAP\n @group(0) @binding($b) var emissiveTexture: texture_2d<f32>;\n @group(0) @binding($b) var emissiveTextureSampler: sampler;\n#endif\n#if HAS_AO_MAP\n @group(0) @binding($b) var occlusionTexture: texture_2d<f32>;\n @group(0) @binding($b) var occlusionTextureSampler: sampler;\n#endif\n#if HAS_NORMAL_MAP && HAS_TANGENT\n @group(0) @binding($b) var normalTexture: texture_2d<f32>;\n @group(0) @binding($b) var normalTextureSampler: sampler;\n#endif\n#if HAS_SKIN_MAP\n @group(0) @binding($b) var skinTexture: texture_2d<f32>;\n @group(0) @binding($b) var skinTextureSampler: sampler;\n#endif\n#if HAS_RANDOM_TEX\n @group(0) @binding($b) var noiseTexture: texture_2d<f32>;\n @group(0) @binding($b) var noiseTextureSampler: sampler;\n#endif\n@group(0) @binding($b) var brdfLUT: texture_2d<f32>;\n@group(0) @binding($b) var brdfLUTSampler: sampler;\n#if HAS_IBL_LIGHTING\n @group(0) @binding($b) var prefilterMap: texture_cube<f32>;\n @group(0) @binding($b) var prefilterMapSampler: sampler;\n#endif\n#if HAS_SSR\n @group(0) @binding($b) var TextureDepth: texture_2d<f32>;\n @group(0) @binding($b) var TextureDepthSampler: sampler;\n @group(0) @binding($b) var TextureReflected: texture_2d<f32>;\n @group(0) @binding($b) var TextureReflectedSampler: sampler;\n#endif\n#if HAS_BUMP_MAP && HAS_TANGENT\n @group(0) @binding($b) var bumpTexture: texture_2d<f32>;\n @group(0) @binding($b) var bumpSampler: sampler;\n#endif\n#if HAS_PATTERN\n @group(0) @binding($b) var linePatternFile: texture_2d<f32>;\n @group(0) @binding($b) var linePatternFileSampler: sampler;\n#endif\nfn sum(v: vec3f) -> f32 {\n return v.x + v.y + v.z;\n}\nfn fetchTexture(tex: texture_2d<f32>, tex_sampler: sampler, uv: vec2f) -> vec4f {\n#ifdef HAS_RANDOM_TEX\n let origin = uniforms.uvOrigin; let uv1 = uv + origin - (origin % vec2f(1.0));\n let randomSeed = textureSample(noiseTexture, noiseSampler, 0.005 * uv1).x;\n let duvdx = dpdx(uv1);\n let duvdy = dpdy(uv1);\n let seed = randomSeed * 8.0;\n var seedFract = fract(seed);\n let seedDigit = floor(seed);\n let seedDigitPlusOne = seedDigit + 1.0;\n let offa = sin(vec2f(3.0, 7.0) * seedDigit);\n let offb = sin(vec2f(3.0, 7.0) * seedDigitPlusOne);\n let velocity = 0.5;\n let cola = textureSampleGrad(tex, tex_sampler, uv + velocity * offa, duvdx, duvdy);\n let colb = textureSampleGrad(tex, tex_sampler, uv + velocity * offb, duvdx, duvdy);\n let diffSum = sum(cola.rgb - colb.rgb);\n let t = smoothstep(0.2, 0.8, seedFract - 0.1 * diffSum);\n return mix(cola, colb, t);\n#else\n return textureSample(tex, tex_sampler, uv);\n#endif\n}\nfn getMaterialAlbedo() -> vec3f {\n return materialUniforms.albedo;\n}\nfn getMaterialAlpha() -> f32 {\n return materialUniforms.alpha;\n}\nfn getMaterialMetalness() -> f32 {\n return materialUniforms.roughnessMetalness.y;\n}\nfn getMaterialRoughness() -> f32 {\n #if SHADING_MODEL_SPECULAR_GLOSSINESS\n return 1.0 - materialUniforms.glossiness;\n #else\n return materialUniforms.roughnessMetalness.x;\n #endif\n}\nfn getMaterialEmitColor() -> vec3f {\n return materialUniforms.emit;\n}\nfn getMaterialSkinColor() -> vec4f {\n return materialUniforms.skinColor;\n}\nfn getMaterialNormalMap() -> vec3f {\n return materialUniforms.normal;\n}\nfn getMaterialOcclusion() -> f32 {\n return materialUniforms.ao;\n}\nfn decodeDepth(pack: vec4f) -> f32 {\n return pack.r + pack.g / 255.0;\n}\nfn transformNormal(factor: f32, normalToTransform: vec3f, t: vec3f, b: vec3f, n: vec3f) -> vec3f {\n let normal = vec3f(normalToTransform.xy * factor, normalToTransform.z);\n let tbn = mat3x3f(t, b, n);\n return normalize(tbn * normal);\n}\nfn D_GGX(roughness: f32, normal: vec3f, H: vec3f) -> f32 {\n let NoH = clamp(dot(normal, H), 0.0, 1.0);\n let a = roughness * roughness;\n let a2 = a * a;\n let d = (NoH * a2 - NoH) * NoH + 1.0;\n return a2 / ( PI * d * d);\n}\nfn F_Schlick(f0: vec3f, f90: f32, L: vec3f, H: vec3f) -> vec3f {\n var VoH = clamp(dot(L, H), 0.0, 1.0);\n VoH = pow(1.0 - VoH, 5.0);\n return f90 * VoH + (1.0 - VoH) * f0;\n}\nfn V_SmithGGXCorrelated(normal: vec3f, V: vec3f, roughness: f32, NoL: f32) -> f32 {\n let NoV = clamp(dot(normal, V), 0.0, 1.0);\n let a = roughness * roughness;\n let GGXL = NoV * (NoL * (1.0 - a) + a);\n let GGXV = NoL * (NoV * (1.0 - a) + a);\n return 0.5 / (GGXV + GGXL);\n}\nfn computeSpecularBRDF(roughness: f32, normal: vec3f, V: vec3f, L: vec3f, specular: vec3f, NoL: f32, f90: f32) -> vec3f {\n let H = normalize(V + L);\n let D = D_GGX(roughness, normal, H);\n let V_S = V_SmithGGXCorrelated(normal, V, roughness, NoL);\n let F = F_Schlick(specular, f90, L, H);\n return (D * V_S * PI) * F;\n}\nfn BRDF_Lambert(diffuseColor: vec3f) -> vec3f {\n return RECIPROCAL_PI * diffuseColor;\n}\nstruct LambertLight {\n diffuse: vec3f,\n specular: vec3f\n}\nfn computeLambert(\n normal: vec3f,\n V: vec3f,\n NoL: f32,\n roughness: f32,\n materialDiffuse: vec3f,\n specular: vec3f,\n lightColor: vec3f,\n L: vec3f,\n f90: f32\n) -> LambertLight {\n var lambert: LambertLight;\n if (NoL <= 0.0) {\n lambert.diffuse = vec3f(0.0);\n lambert.specular = vec3f(0.0);\n return lambert;\n }\n let a = NoL * lightColor;\n let brdf = computeSpecularBRDF(roughness, normal, V, L, specular, NoL, f90);\n lambert.specular = a * brdf;\n lambert.diffuse = a * BRDF_Lambert(materialDiffuse);\n return lambert;\n}\n#if HAS_IBL_LIGHTING\n fn computeDiffuseSPH(normal: vec3f) -> vec3f {\n let n = shaderUniforms.environmentTransform * normal;\n let diffuseSPH = shaderUniforms.diffuseSPH;\n let x = n.x;\n let y = n.y;\n let z = n.z;\n let result = (\n diffuseSPH[0] +\n diffuseSPH[1] * x +\n diffuseSPH[2] * y +\n diffuseSPH[3] * z +\n diffuseSPH[4] * z * x +\n diffuseSPH[5] * y * z +\n diffuseSPH[6] * y * x +\n diffuseSPH[7] * (3.0 * z * z - 1.0) +\n diffuseSPH[8] * (x*x - y*y)\n );\n if (length(shaderUniforms.hdrHSV) > 0.0) {\n return hsv_apply3(result, shaderUniforms.hdrHSV);\n }\n return max(result, vec3f(0.0));\n }\n fn fetchEnvMap(roughness: f32, R: vec3f) -> vec3f {\n let dir = R;\n let maxLevels = shaderUniforms.prefilterMiplevel.x;\n let lod = min(maxLevels, roughness * shaderUniforms.prefilterMiplevel.y);\n var envLight = textureSampleLevel(prefilterMap, prefilterMapSampler, dir, lod).rgb;\n if (length(shaderUniforms.hdrHSV) > 0.0) {\n envLight = hsv_apply3(envLight, shaderUniforms.hdrHSV);\n }\n return envLight;\n }\n fn getIBLEnvMap(N: vec3f, V: vec3f, roughness: f32, frontNormal: vec3f, materialDiffuse: vec3f) -> vec3f {\n let smoothness = 1.0 - roughness;\n let R = mix(N, reflect(-V, N), smoothness * (sqrt(smoothness) + roughness));\n let factor = clamp(1.0 + dot(R, frontNormal), 0.0, 1.0);\n let prefilteredEnvColor = fetchEnvMap(roughness, shaderUniforms.environmentTransform * R) * factor * factor;\n return prefilteredEnvColor;\n }\n#else\n fn getIBLEnvMap(normal: vec3f, eyeVector: vec3f, roughness: f32, frontNormal: vec3f, materialDiffuse: vec3f) -> vec3f {\n return shaderUniforms.ambientColor * BRDF_Lambert(materialDiffuse);\n }\n#endif\nfn computeBRDF(spec: vec3f, roughness: f32, NoV: f32, f90: f32) -> vec3f {\n let rgba = fetchTexture(brdfLUT, brdfLUTSampler, vec2f(NoV, roughness)) * vec4f(255.0, 65280.0, 255.0, 65280.0);\n let b = (rgba[3] + rgba[2]);\n let a = (rgba[1] + rgba[0]);\n return (spec * a + b * f90) / 65535.0;\n}\nfn computeIBLSpecular(\n normal: vec3f,\n eyeVector: vec3f,\n NoV: f32,\n roughness: f32,\n specular: vec3f,\n frontNormal: vec3f,\n f90: f32,\n materialDiffuse: vec3f\n) -> vec3f {\n return getIBLEnvMap(normal, eyeVector, roughness, frontNormal, materialDiffuse) * computeBRDF(specular, roughness, NoV, f90);\n}\nfn computeSpecularAO(ao: f32, NoV: f32) -> f32 {\n let d = NoV + ao;\n return clamp((d * d) - 1.0 + ao, 0.0, 1.0);\n}\n#ifdef HAS_PATTERN\n fn computeUV(input: VertexOutput, texCoord: vec2f) -> vec2f {\n let uv = texCoord % 1.0;\n let uvStart = vec2f(input.vTexInfo.xy);\n let uvSize = vec2f(input.vTexInfo.zw);\n return (uvStart + uv * uvSize) / uniforms.atlasSize;\n }\n#endif\nfn initMaterial(vertexOutput: VertexOutput) -> MaterialUniforms {\n var materialUniforms: MaterialUniforms;\n var uv: vec2f;\n#ifdef HAS_MAP\n uv = computeTexCoord(vertexOutput.vTexCoord, vertexOutput);\n#endif\n#ifdef HAS_UV_FLIP\n uv.y = 1.0 - uv.y;\n#endif\n#if HAS_BUMP_MAP && HAS_TANGENT\n uv = bumpUV(uv, normalize(vertexOutput.vTangentViewPos - vertexOutput.vTangentFragPos));\n#endif\n materialUniforms.albedo = uniforms.baseColorIntensity * uniforms.baseColorFactor.rgb;\n materialUniforms.alpha = uniforms.baseColorFactor.a * vertexOutput.vOpacity;\n#if HAS_PATTERN\n var linesofar = vertexOutput.vLinesofar;\n let uvSize = vertexOutput.vTexInfo.zw;\n#ifdef HAS_PATTERN_GAP\n let myGap = vertexOutput.vLinePatternGap;\n#else\n let myGap = uniforms.linePatternGap;\n#endif\n#ifdef HAS_PATTERN_ANIM\n let myAnimSpeed = vertexOutput.vLinePatternAnimSpeed;\n#else\n let myAnimSpeed = uniforms.linePatternAnimSpeed;\n#endif\n let patternWidth = ceil(uvSize.x * vertexOutput.vPatternHeight / uvSize.y);\n let plusGapWidth = patternWidth * (1.0 + myGap);\n let animSpeed = myAnimSpeed / uniforms.animSpeedScale;\n linesofar += (shaderUniforms.currentTime * -animSpeed * 0.2) % plusGapWidth;\n let patternx = (linesofar / plusGapWidth) % 1.0;\n let patterny = (uniforms.flipY * vertexOutput.vNormalY) % 1.0;\n let texCoord = vec2f(patternx * (1.0 + myGap) * uniforms.uvScale[0], patterny * uniforms.uvScale[1]);\n uv = computeUV(vertexOutput, texCoord);\n var patternColor = fetchTexture(linePatternFile, linePatternFileSampler, uv);\n let inGap = clamp(sign(1.0 / (1.0 + myGap) - patternx) + 0.000001, 0.0, 1.0);\n patternColor = mix(uniforms.linePatternGapColor, patternColor, inGap);\n#ifdef IS_SQUARE_TUBE\n let v = clamp(sign(abs(vertexOutput.vNormalY) - 0.999999), 0.0, 1.0);\n patternColor = mix(patternColor, vec4(1.0), v);\n#endif\n materialUniforms.albedo *= patternColor.rgb;\n materialUniforms.alpha *= patternColor.a;\n#endif\n#if HAS_ALBEDO_MAP\n let baseColor = fetchTexture(baseColorTexture, baseColorTextureSampler, uv);\n materialUniforms.albedo *= sRGBToLinear(baseColor.rgb);\n materialUniforms.alpha *= baseColor.a;\n#endif\n#if HAS_SKIN_MAP\n let skinColorValue = fetchTexture(skinTexture, skinTextureSampler, uv);\n materialUniforms.skinColor = skinColorValue;\n#endif\n#if HAS_COLOR0\n materialUniforms.albedo *= vertexOutput.vColor0.rgb;\n#if COLOR0_SIZE == 4\n materialUniforms.alpha *= vertexOutput.vColor0.a;\n#endif\n#endif\n#if HAS_COLOR\n materialUniforms.albedo *= vertexOutput.vColor.rgb;\n materialUniforms.alpha *= vertexOutput.vColor.a;\n#elif IS_LINE_EXTRUSION\n materialUniforms.albedo *= uniforms.lineColor.rgb;\n materialUniforms.alpha *= uniforms.lineColor.a;\n#else\n materialUniforms.albedo *= uniforms.polygonFill.rgb;\n materialUniforms.alpha *= uniforms.polygonFill.a;\n#endif\n#if HAS_INSTANCE_COLOR\n materialUniforms.albedo *= vertexOutput.vInstanceColor.rgb;\n materialUniforms.alpha *= vertexOutput.vInstanceColor.a;\n#endif\n#if HAS_METALLICROUGHNESS_MAP\n let mrSample = fetchTexture(metallicRoughnessTexture, metallicRoughnessTextureSampler, uv).gb;\n materialUniforms.roughnessMetalness = mrSample * vec2(uniforms.roughnessFactor, uniforms.metallicFactor);\n#else\n materialUniforms.roughnessMetalness = vec2(uniforms.roughnessFactor, uniforms.metallicFactor);\n#endif\n materialUniforms.emit = uniforms.emissiveFactor;\n#if HAS_EMISSIVE_MAP\n if (uniforms.emitMultiplicative == 1.0) {\n materialUniforms.emit *= sRGBToLinear(fetchTexture(emissiveTexture, emissiveTextureSampler, uv).rgb);\n } else {\n materialUniforms.emit += sRGBToLinear(fetchTexture(emissiveTexture, emissiveTextureSampler, uv).rgb);\n }\n#endif\n materialUniforms.emit *= uniforms.emitColorFactor;\n#if HAS_AO_MAP\n let aoTexCoord = computeTexCoord(vertexOutput.vTexCoord1, vertexOutput);\n materialUniforms.ao = fetchTexture(occlusionTexture, occlusionTextureSampler, aoTexCoord).r;\n#else\n materialUniforms.ao = 1.0;\n#endif\n materialUniforms.ao *= uniforms.occlusionFactor;\n#if HAS_NORMAL_MAP && HAS_TANGENT\n var nmap = fetchTexture(normalTexture, normalTextureSampler, uv).xyz * 2.0 - 1.0;\n nmap.y = select(nmap.y, -nmap.y, uniforms.normalMapFlipY == 1.0);\n materialUniforms.normal = nmap;\n#else\n materialUniforms.normal = normalize(vertexOutput.vModelNormal);\n#endif\n#if HAS_TERRAIN_NORMAL && HAS_TANGENT\n var nmap = convertTerrainHeightToNormalMap(uv);\n nmap.y = select(nmap.y, -nmap.y, uniforms.normalMapFlipY == 1.0);\n materialUniforms.normal = nmap;\n#endif\n#if SHADING_MODEL_SPECULAR_GLOSSINESS\n materialUniforms.albedo *= uniforms.diffuseFactor.rgb;\n materialUniforms.alpha *= uniforms.diffuseFactor.a;\n#if HAS_DIFFUSE_MAP\n let diffuse = fetchTexture(diffuseTexture, diffuseTextureSampler, uv);\n materialUniforms.albedo *= sRGBToLinear(diffuse.rgb);\n materialUniforms.alpha *= diffuse.a;\n#endif\n materialUniforms.specularColor = uniforms.specularFactor;\n materialUniforms.glossiness = uniforms.glossinessFactor;\n#if HAS_SPECULARGLOSSINESS_MAP\n let specularGlossiness = fetchTexture(specularGlossinessTexture, specularGlossinessTextureSampler, uv);\n materialUniforms.specularColor *= sRGBToLinear(specularGlossiness.rgb);\n materialUniforms.glossiness *= specularGlossiness.a;\n#endif\n#endif\n return materialUniforms;\n}\nfn HDR_ACES(x: vec3f) -> vec3f {\n const a = 2.51;\n const b = 0.03;\n const c = 2.43;\n const d = 0.59;\n const e = 0.14;\n return (x * (a * x + b)) / (x * (c * x + d) + e);\n}\nfn tonemap(color: vec3f) -> vec3f {\n let tonemapped = HDR_ACES(color);\n return pow(tonemapped, vec3f(1.0/2.2));\n}\nfn normalFiltering(roughness: f32, worldNormal: vec3f) -> f32 {\n let du = dpdx(worldNormal);\n let dv = dpdy(worldNormal);\n let variance = uniforms.specularAAVariance * (dot(du, du) + dot(dv, dv));\n let kernelRoughness = min(2.0 * variance, uniforms.specularAAThreshold);\n let squareRoughness = saturate(roughness * roughness + kernelRoughness);\n return sqrt(squareRoughness);\n}\n#if HAS_SSR\n fn ssrViewToScreen(projection: mat4x4f, viewVertex: vec3f) -> vec3f {\n let projected = projection * vec4f(viewVertex, 1.0);\n return vec3f(0.5 + 0.5 * projected.xy / projected.w, projected.w);\n }\n fn fetchColorLod(level: f32, uv: vec2f) -> vec3f {\n return textureSampleLevel(TextureReflected, TextureReflectedSampler, uv, level).rgb;\n }\n fn linearizeDepth(depth: f32) -> f32 {\n let projection = uniforms.projMatrix;\n let z = depth * 2.0 - 1.0; return -projection[3].z / (z + projection[2].z);\n }\n fn fetchDepth(uv: vec2f) -> f32 {\n let depth = decodeDepth(textureSample(TextureDepth, TextureDepthSampler, uv));\n return depth;\n }\n fn interleavedGradientNoise(fragCoord: vec2f, frameMod: f32) -> f32 {\n let magic = vec3f(0.06711056, 0.00583715, 52.9829189);\n return fract(magic.z * fract(dot(fragCoord.xy + frameMod * vec2f(47.0, 17.0) * 0.695, magic.xy))) * 0.5;\n }\n fn importanceSampling(\n fragCoord: vec2f,\n frameMod: f32,\n tangentX: vec3f,\n tangentY: vec3f,\n tangentZ: vec3f,\n eyeVector: vec3f,\n rough4: f32\n ) -> vec3f {\n var E: vec2f;\n E.x = interleavedGradientNoise(fragCoord.yx, frameMod);\n E.y = fract(E.x * 52.9829189);\n E.y = mix(E.y, 1.0, 0.7);\n let phi = 2.0 * 3.14159 * E.x;\n let cosTheta = pow(max(E.y, 0.000001), rough4 / (2.0 - rough4));\n let sinTheta = sqrt(1.0 - cosTheta * cosTheta);\n var h = vec3f(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta);\n h = h.x * tangentX + h.y * tangentY + h.z * tangentZ;\n return normalize((2.0 * dot(eyeVector, h)) * h - eyeVector);\n }\n fn getStepOffset(frameMod: f32) -> f32 {\n return (interleavedGradientNoise(fragCoord.xy, frameMod) - 0.5);\n }\n fn computeRayDirUV(rayOriginUV: vec3f, rayLen: f32, rayDirView: vec3f) -> vec3f {\n let rayDirUV = ssrViewToScreen(uniforms.projMatrix, vViewVertex.xyz + rayDirView * rayLen);\n rayDirUV.z = 1.0 / rayDirUV.z;\n rayDirUV -= rayOriginUV;\n let scaleMaxX = min(1.0, 0.99 * (1.0 - rayOriginUV.x) / max(1e-5, rayDirUV.x));\n let scaleMaxY = min(1.0, 0.99 * (1.0 - rayOriginUV.y) / max(1e-5, rayDirUV.y));\n let scaleMinX = min(1.0, 0.99 * rayOriginUV.x / max(1e-5, -rayDirUV.x));\n let scaleMinY = min(1.0, 0.99 * rayOriginUV.y / max(1e-5, -rayDirUV.y));\n return rayDirUV * min(scaleMaxX, scaleMaxY) * min(scaleMinX, scaleMinY);\n }\n fn binarySearch(rayOriginUV: vec3f, rayDirUV: vec3f, startSteps: ptr<function, f32>, endSteps: ptr<function, f32>) -> f32 {\n let steps = (*startSteps + *endSteps) * 0.5;\n let sampleUV = rayOriginUV + rayDirUV * steps;\n let z = fetchDepth(sampleUV.xy);\n let depth = linearizeDepth(z);\n let sampleDepth = -1.0 / sampleUV.z;\n *startSteps = select(steps, *startSteps, depth > sampleDepth);\n *endSteps = select(*endSteps, steps, depth > sampleDepth);\n return steps;\n }\n fn rayTrace(\n rayOriginUV: vec3f,\n rayLen: f32,\n depthTolerance: f32,\n rayDirView: vec3f,\n roughness: f32,\n frameMod: f32\n ) -> vec4f {\n let checkSteps = 20;\n let invNumSteps = 1.0 / f32(checkSteps);\n depthTolerance *= invNumSteps;\n let rayDirUV = computeRayDirUV(rayOriginUV, rayLen, rayDirView);\n let sampleTime = invNumSteps;\n var diffSampleW = vec3f(0.0, sampleTime, 1.0);\n var sampleUV: vec3f;\n var hit = false;\n var hitDepth = 1.0;\n var steps: f32;\n for (var i = 0; i < checkSteps; i++) {\n sampleUV = rayOriginUV + rayDirUV * diffSampleW.y;\n let z = fetchDepth(sampleUV.xy);\n let depth = linearizeDepth(z);\n let sampleDepth = -1.0 / sampleUV.z;\n let validDepth = clamp(sign(0.999 - z), 0.0, 1.0);\n var depthDiff = validDepth * (sampleDepth - depth);\n depthDiff *= clamp(sign(abs(depthDiff) - rayLen * invNumSteps * invNumSteps), 0.0, 1.0);\n hit = abs(depthDiff + depthTolerance) < depthTolerance;\n let timeLerp = clamp(diffSampleW.x / (diffSampleW.x - depthDiff), 0.0, 1.0);\n let hitTime = select(1.0, (diffSampleW.y + timeLerp * invNumSteps - invNumSteps), hit);\n diffSampleW.z = min(diffSampleW.z, hitTime);\n diffSampleW.x = depthDiff;\n if (hit) {\n var startSteps = diffSampleW.y - invNumSteps;\n var endSteps = diffSampleW.y;\n steps = binarySearch(rayOriginUV, rayDirUV, &startSteps, &endSteps);\n steps = binarySearch(rayOriginUV, rayDirUV, &startSteps, &endSteps);\n steps = binarySearch(rayOriginUV, rayDirUV, &startSteps, &endSteps);\n hitDepth = steps;\n break;\n }\n diffSampleW.y += invNumSteps;\n }\n return vec4f(rayOriginUV + rayDirUV * hitDepth, 1.0 - hitDepth);\n }\n fn fetchColorInRay(\n resRay: vec4f,\n maskSsr: f32,\n specularEnvironment: vec3f,\n specularColor: vec3f,\n roughness: f32\n ) -> vec4f {\n let AB = mix(uniforms.outputFovInfo[0], uniforms.outputFovInfo[1], resRay.x);\n resRay.xyz = vec3f(mix(AB.xy, AB.zw, resRay.y), 1.0) * -1.0 / resRay.z;\n resRay.xyz = (uniforms.reprojViewProjMatrix * vec4f(resRay.xyz, 1.0)).xyw;\n resRay.xy /= resRay.z;\n let maskEdge = clamp(6.0 - 6.0 * max(abs(resRay.x), abs(resRay.y)), 0.0, 1.0);\n resRay.xy = 0.5 + 0.5 * resRay.xy;\n let fetchColor = specularColor * fetchColorLod(roughness * (1.0 - resRay.w), resRay.xy);\n return vec4f(mix(specularEnvironment, fetchColor, maskSsr * maskEdge), 1.0);\n }\n fn ssr(\n fragCoord: vec2f,\n specularEnvironment: vec3f,\n specularColor: vec3f,\n roughness: f32,\n normal: vec3f,\n eyeVector: vec3f\n ) -> vec3f {\n let taaSS = 0.0;\n var result = vec4f(0.0);\n var rough4 = roughness * roughness;\n rough4 = rough4 * rough4;\n let upVector = select(vec3f(1.0, 0.0, 0.0), vec3f(0.0, 0.0, 1.0), abs(normal.z) < 0.999);\n let tangentX = normalize(cross(upVector, normal));\n let tangentY = cross(normal, tangentX);\n var maskSsr = shaderUniforms.ssrFactor * clamp(-4.0 * dot(eyeVector, normal) + 3.8, 0.0, 1.0);\n maskSsr *= clamp(4.7 - roughness * 5.0, 0.0, 1.0);\n let rayOriginUV = ssrViewToScreen(shaderUniforms.projMatrix, vViewVertex.xyz);\n rayOriginUV.z = 1.0 / rayOriginUV.z;\n let rayDirView = importanceSampling(fragCoord, taaSS, tangentX, tangentY, normal, eyeVector, rough4);\n let rayLen = mix(shaderUniforms.cameraNearFar.y + vViewVertex.z, -vViewVertex.z - shaderUniforms.cameraNearFar.x, rayDirView.z * 0.5 + 0.5);\n let depthTolerance = 0.5 * rayLen;\n var resRay: vec4f;\n if (dot(rayDirView, normal) > 0.001 && maskSsr > 0.0) {\n resRay = rayTrace(rayOriginUV, rayLen, depthTolerance, rayDirView, roughness, taaSS);\n if (resRay.w > 0.0) {\n result += fetchColorInRay(resRay, maskSsr, specularEnvironment, specularColor, roughness);\n }\n }\n return select(specularEnvironment, result.rgb / result.w, result.w > 0.0);\n }\n#endif\nfn sRGBTransferOETF(value: vec4f) -> vec4f {\n let isLow: vec3<bool> = value.rgb <= vec3f(0.0031308);\n let highPart: vec3f = pow(value.rgb, vec3f(0.41666)) * 1.055 - vec3f(0.055);\n let lowPart: vec3f = value.rgb * 12.92;\n let rgb: vec3f = select(highPart, lowPart, isLow);\n return vec4f(rgb, value.a);\n}\nfn linearToOutputTexel(value: vec4f) -> vec4f {\n return sRGBTransferOETF(value);\n}\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n materialUniforms = initMaterial(vertexOutput);\n var glFragColor: vec4f;\n let eyeVector = normalize(shaderUniforms.cameraPosition - vertexOutput.vModelVertex);\n #if HAS_DOUBLE_SIDE\n let frontNormal = select(-normalize(vertexOutput.vModelNormal), normalize(vertexOutput.vModelNormal), gl_FrontFacing);\n #else\n let frontNormal = normalize(vertexOutput.vModelNormal);\n #endif\n let f0 = 0.08 * uniforms.specularF0;\n let metal = getMaterialMetalness();\n var materialDiffuse = getMaterialAlbedo();\n #if SHADING_MODEL_SPECULAR_GLOSSINESS\n let materialSpecular = materialUniforms.specularColor;\n #else\n let materialSpecular = mix(vec3f(f0), materialDiffuse, metal);\n #endif\n materialDiffuse *= 1.0 - metal;\n let materialF90 = clamp(50.0 * materialSpecular.g, 0.0, 1.0);\n var materialRoughness = getMaterialRoughness();\n if (uniforms.specularAAVariance > 0.0) {\n materialRoughness = normalFiltering(materialRoughness, frontNormal);\n }\n let materialEmit = getMaterialEmitColor();\n var materialNormal = getMaterialNormalMap();\n #if HAS_TANGENT\n #if HAS_NORMAL_MAP || HAS_TERRAIN_NORMAL\n materialNormal = transformNormal(uniforms.normalMapFactor, materialNormal, vertexOutput.vModelTangent.xyz, vertexOutput.vModelBiTangent, frontNormal);\n #endif\n #endif\n var diffuse = vec3f(0.0);\n var specular = vec3f(0.0);\n #if HAS_IBL_LIGHTING\n diffuse = materialDiffuse * computeDiffuseSPH(materialNormal) * 0.5;\n #else\n diffuse = materialDiffuse * shaderUniforms.ambientColor;\n #endif\n let NoV = dot(materialNormal, eyeVector);\n specular = computeIBLSpecular(materialNormal, eyeVector, NoV, materialRoughness, materialSpecular, frontNormal, materialF90, materialDiffuse);\n #ifdef MESH_ENV_EXPO\n let environmentExposure = materialUniforms.environmentExposure;\n #else\n let environmentExposure = shaderUniforms.environmentExposure;\n #endif\n var specularAO = 1.0;\n let materialAO = getMaterialOcclusion();\n diffuse *= environmentExposure * materialAO;\n #if HAS_IBL_LIGHTING\n specularAO = computeSpecularAO(materialAO, NoV);\n #endif\n #if HAS_SSR\n var ssrfrontNormal = normalize(select(-vertexOutput.vViewNormal, vertexOutput.vViewNormal, gl_FrontFacing));\n var viewNormal = ssrfrontNormal;\n #if HAS_TANGENT\n #if HAS_NORMAL_MAP || HAS_TERRAIN_NORMAL\n var ssrTangent = select(-vertexOutput.vViewTangent, vertexOutput.vViewTangent, gl_FrontFacing);\n ssrTangent.xyz = normalize(ssrTangent.xyz);\n let ssrBinormal = normalize(cross(ssrfrontNormal, ssrTangent.xyz)) * ssrTangent.w;\n viewNormal = transformNormal(uniforms.normalMapFactor, materialNormal, ssrTangent.xyz, ssrBinormal, ssrfrontNormal);\n #endif\n #endif\n specular = ssr(vertexOutput.position, specular, materialSpecular * specularAO, materialRoughness, viewNormal, -normalize(vertexOutput.vViewVertex.xyz));\n #endif\n specular *= environmentExposure * specularAO;\n let modelNormal = vertexOutput.vModelNormal;\n let lightDir = -shaderUniforms.light0_viewDirection;\n let dotNL = saturate(dot(lightDir, materialNormal));\n let lambertResult = computeLambert(materialNormal, eyeVector, dotNL, max(0.045, materialRoughness), materialDiffuse, materialSpecular, shaderUniforms.light0_diffuse.rgb, lightDir, materialF90);\n var ambientDiffuse = lambertResult.diffuse;\n var ambientSpecular = lambertResult.specular;\n #if HAS_SHADOWING && !HAS_BLOOM\n let shadowCoeff = shadow_computeShadow(vertexOutput);\n ambientDiffuse = shadow_blend(ambientDiffuse, shadowCoeff).rgb;\n ambientSpecular = shadow_blend(ambientSpecular, shadowCoeff).rgb;\n #endif\n diffuse += ambientDiffuse;\n specular += ambientSpecular;\n diffuse += materialEmit;\n var frag = specular + diffuse;\n if (uniforms.outputSRGB == 1.0) {\n frag = linearTosRGB(frag);\n }\n #if HAS_SKIN_MAP\n let skinColor = getMaterialSkinColor();\n frag = frag.rgb * (1.0 - skinColor.a) + skinColor.rgb * skinColor.a;\n #if HAS_SHADOWING && !HAS_BLOOM\n frag = shadow_blend(rgb, shadowCoeff).rgb;\n #endif\n #endif\n var alpha = getMaterialAlpha();\n if (alpha < uniforms.alphaTest) {\n discard;\n }\n #if ALPHA_MODE\n #if ALPHA_MODE == 1\n if (alpha < uniforms.alphaCutoff) {\n discard;\n } else {\n alpha = 1.0;\n }\n #else\n alpha = 1.0;\n #endif\n #endif\n #if IS_LINE_EXTRUSION\n alpha *= uniforms.lineOpacity;\n #else\n alpha *= uniforms.polygonOpacity;\n #endif\n glFragColor = vec4f(frag * alpha, alpha);\n #ifdef HAS_VERTEX_COLOR\n glFragColor *= vertexColor_get(vertexOutput);\n #endif\n #ifdef HAS_EXCAVATE_ANALYSIS\n glFragColor = excavateColor(glFragColor);\n #endif\n #ifdef HAS_SNOW\n let snowColor = snow(glFragColor, getMaterialNormalMap(), 1.0);\n glFragColor = vec4f(snowColor, glFragColor.a);\n #endif\n if (uniforms.contrast != 1.0) {\n glFragColor = contrastMatrix(uniforms.contrast) * glFragColor;\n }\n if (length(uniforms.hsv) > 0.0) {\n glFragColor = hsv_apply4(glFragColor, uniforms.hsv);\n }\n #ifdef OUTPUT_NORMAL\n glFragColor = vec4f(frontNormal, 1.0);\n #endif\n #if HAS_HIGHLIGHT_OPACITY || HAS_HIGHLIGHT_COLOR\n glFragColor = highlight_blendColor(glFragColor, vertexOutput);\n #endif\n #ifdef HAS_LAYER_OPACITY\n glFragColor *= shaderUniforms.layerOpacity;\n #endif\n #ifdef HAS_MASK_EXTENT\n glFragColor = setMask(glFragColor);\n #endif\n return glFragColor;\n}";
|
|
61
61
|
|
|
62
62
|
var glStandardVert = "#include <highlight_vert>\n#include <line_extrusion_vert>\n#include <get_output>\n#include <vsm_shadow_vert>\n#include <vertex_color_vert>\n#ifdef PICKING_MODE\n #include <fbo_picking_vert>\n#endif\n#include <excavate_vert>\n#include <common_pack_float>\nstruct VertexInput {\n #include <position_vert>\n #if HAS_MAP || HAS_TERRAIN_FLAT_MASK\n #ifdef HAS_DRACO_TEXCOORD\n @location($i) aTexCoord: vec2u,\n #else\n @location($i) aTexCoord: vec2f,\n #endif\n #endif\n #if HAS_MAP\n #ifdef HAS_I3S_UVREGION\n @location($i) uvRegion: vec4f,\n #endif\n #if HAS_AO_MAP\n @location($i) aTexCoord1: vec2f,\n #endif\n #endif\n #if HAS_COLOR\n @location($i) aColor: vec4u,\n #endif\n #ifdef HAS_OPACITY\n @location($i) aOpacity: u32,\n #endif\n #if HAS_COLOR0\n #if COLOR0_SIZE == 3\n @location($i) aColor0: vec3u,\n #else\n @location($i) aColor0: vec4u,\n #endif\n #endif\n #if HAS_TANGENT\n @location($i) aTangent: vec4f,\n #elif HAS_NORMAL\n #ifdef NORMAL_IS_INT\n @location($i) aNormal: vec4i,\n #elif NORMAL_IS_UINT\n @location($i) aNormal: vec4u,\n #else\n @location($i) aNormal: vec3f,\n #endif\n #endif\n}\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n #ifdef HAS_SSR\n @location($o) vViewNormal: vec3f,\n #ifdef HAS_TANGENT\n @location($o) vViewTangent: vec4f,\n #endif\n #endif\n @location($o) vModelNormal: vec3f,\n @location($o) vViewVertex: vec4f,\n #if HAS_TANGENT\n @location($o) vModelTangent: vec4f,\n @location($o) vModelBiTangent: vec3f,\n #endif\n @location($o) vModelVertex: vec3f,\n #if HAS_MAP\n @location($o) vTexCoord: vec2f,\n #ifdef HAS_AO_MAP\n @location($o) vTexCoord1: vec2f,\n #endif\n #ifdef HAS_I3S_UVREGION\n @location($o) vUvRegion: vec4f,\n #endif\n #endif\n #if HAS_COLOR\n @location($o) vColor: vec4f,\n #endif\n @location($o) vOpacity: f32,\n #if HAS_COLOR0\n @location($o) vColor0: vec4f,\n #endif\n #if HAS_BUMP_MAP && HAS_TANGENT\n @location($o) vTangentViewPos: vec3f,\n @location($o) vTangentFragPos: vec3f,\n #endif\n}\nstruct ShaderUniforms {\n cameraPosition: vec3f,\n projMatrix: mat4x4f,\n}\nstruct Uniforms {\n uvOrigin: vec2f,\n uvScale: vec2f,\n uvOffset: vec2f,\n uvRotation: f32,\n modelMatrix: mat4x4f,\n modelViewMatrix: mat4x4f,\n positionMatrix: mat4x4f,\n modelNormalMatrix: mat3x3f,\n #ifdef HAS_SSR\n modelViewNormalMatrix: mat3x3f,\n #endif\n};\n@group(0) @binding($b) var<uniform> uniforms: Uniforms;\n@group(0) @binding($b) var<uniform> shaderUniforms: ShaderUniforms;\nvar<private> Vertex: vec3f;\nvar<private> Normal: vec3f;\nvar<private> Tangent: vec4f;\nconst mid = 0.5;\nfn toTangentFrame(q: vec4f) -> vec3f {\n return vec3f(0.0, 0.0, 1.0) +\n vec3f(2.0, -2.0, -2.0) * q.x * q.zwx +\n vec3f(2.0, 2.0, -2.0) * q.y * q.wzy;\n}\nstruct TangentFrame {\n n: vec3f,\n t: vec3f\n}\nfn toTangentFrameWithTangent(q: vec4f) -> TangentFrame {\n var out: TangentFrame;\n out.n = toTangentFrame(q);\n out.t = vec3f(1.0, 0.0, 0.0) +\n vec3f(-2.0, 2.0, -2.0) * q.y * q.yxw +\n vec3f(-2.0, 2.0, 2.0) * q.z * q.zwx;\n return out;\n}\nfn rotateUV(uv: vec2f, rotation: f32) -> vec2f {\n return vec2f(\n cos(rotation) * (uv.x - mid) + sin(rotation) * (uv.y - mid) + mid,\n cos(rotation) * (uv.y - mid) - sin(rotation) * (uv.x - mid) + mid\n );\n}\n#if HAS_MAP\nfn transformTexcoord(uv: vec2f) -> vec2f {\n let decodedTexCoord = decode_getTexcoord(uv);\n #ifdef HAS_RANDOM_TEX\n let origin = uniforms.uvOrigin;\n let texCoord = decodedTexCoord * uniforms.uvScale + uniforms.uvOffset;\n return (origin % 1.0) + texCoord;\n #else\n var origin = uniforms.uvOrigin;\n var texCoord = decodedTexCoord * uniforms.uvScale;\n if (uniforms.uvRotation != 0.0) {\n origin = rotateUV(origin, uniforms.uvRotation);\n texCoord = rotateUV(texCoord, uniforms.uvRotation);\n }\n return (origin % 1.0) + texCoord + uniforms.uvOffset;\n #endif\n}\n#endif\nfn transposeMat3(inMat: mat3x3f) -> mat3x3f {\n let i0 = inMat[0];\n let i1 = inMat[1];\n let i2 = inMat[2];\n return mat3x3f(\n vec3f(i0.x, i1.x, i2.x),\n vec3f(i0.y, i1.y, i2.y),\n vec3f(i0.z, i1.z, i2.z)\n );\n}\n@vertex\nfn main(input: VertexInput) -> VertexOutput {\n var output: VertexOutput;\n let localPositionMatrix = getPositionMatrix(input, &output, uniforms.positionMatrix);\n #ifdef IS_LINE_EXTRUSION\n let linePosition = getLineExtrudePosition(vec3f(input.aPosition.xyz), input);\n let localVertex = getPosition(linePosition, input);\n #else\n let localVertex = getPosition(vec3f(input.aPosition.xyz), input);\n #endif\n output.vModelVertex = (uniforms.modelMatrix * localVertex).xyz;\n let position = localPositionMatrix * localVertex;\n let viewVertex = uniforms.modelViewMatrix * position;\n output.vViewVertex = viewVertex;\n #ifdef HAS_MASK_EXTENT\n output.position = shaderUniforms.projMatrix * getMaskPosition(position, uniforms.modelMatrix);\n #else\n output.position = shaderUniforms.projMatrix * viewVertex;\n #endif\n #ifdef PICKING_MODE\n var alpha = 1.0;\n #if HAS_COLOR\n alpha *= f32(input.aColor.a);\n #endif\n #if HAS_COLOR0 && COLOR0_SIZE == 4\n alpha *= f32(input.aColor0.a);\n #endif\n fbo_picking_setData(input, &output, output.position.w, alpha != 0.0);\n #else\n #if HAS_MAP\n output.vTexCoord = transformTexcoord(input.aTexCoord.xy);\n #ifdef HAS_AO_MAP\n output.vTexCoord1 = transformTexcoord(input.aTexCoord1);\n #endif\n #ifdef HAS_I3S_UVREGION\n output.vUvRegion = input.uvRegion / 65535.0;\n #endif\n #endif\n #if HAS_TANGENT || HAS_NORMAL\n let positionNormalMatrix = mat3x3f(\n localPositionMatrix[0].xyz,\n localPositionMatrix[1].xyz,\n localPositionMatrix[2].xyz\n );\n let normalMatrix = uniforms.modelNormalMatrix * positionNormalMatrix;\n #if HAS_TANGENT\n let tangentFrame = toTangentFrameWithTangent(input.aTangent);\n Normal = tangentFrame.n;\n let t = tangentFrame.t;\n output.vModelTangent = vec4f(normalMatrix * t, input.aTangent.w);\n #else\n Normal = decode_getNormal(vec3f(input.aNormal.xyz));\n #endif\n let localNormal = Normal;\n output.vModelNormal = normalMatrix * localNormal;\n #else\n Normal = vec3f(0);\n output.vModelNormal = vec3f(0);\n #endif\n #if HAS_TANGENT\n output.vModelBiTangent = cross(output.vModelNormal, output.vModelTangent.xyz) * sign(input.aTangent.w);\n #endif\n #ifdef HAS_SSR\n let ssrNormalMatrix = uniforms.modelViewNormalMatrix * positionNormalMatrix;\n output.vViewNormal = ssrNormalMatrix * Normal;\n #if HAS_TANGENT\n let localTangent = vec4f(t, input.aTangent.w);\n output.vViewTangent = vec4f(ssrNormalMatrix * localTangent.xyz, localTangent.w);\n #endif\n #endif\n #if HAS_COLOR\n output.vColor = vec4f(input.aColor) / 255.0;\n #endif\n #ifdef HAS_OPACITY\n output.vOpacity = f32(input.aOpacity) / 255.0;\n #else\n output.vOpacity = 1.0;\n #endif\n #if HAS_HIGHLIGHT_OPACITY || HAS_HIGHLIGHT_COLOR\n highlight_setVarying(input, &output);\n #endif\n #if HAS_COLOR0\n #if COLOR0_SIZE == 3\n output.vColor0 = vec4f(vec3f(input.aColor0), 255.0) / 255.0;\n #else\n output.vColor0 = vec4f(input.aColor0) / 255.0;\n #endif\n #endif\n #if HAS_SHADOWING && !HAS_BLOOM\n shadow_computeShadowPars(position, &output);\n #endif\n #if HAS_BUMP_MAP && HAS_TANGENT\n let TBN = transposeMat3(mat3x3f(output.vModelTangent.xyz, output.vModelBiTangent, output.vModelNormal));\n output.vTangentViewPos = TBN * shaderUniforms.cameraPosition;\n output.vTangentFragPos = TBN * output.vModelVertex;\n #endif\n #ifdef HAS_VERTEX_COLOR\n vertexColor_update(input, &output);\n #endif\n #ifdef HAS_EXCAVATE_ANALYSIS\n output.vCoordinateTexcoord = getCoordinateTexcoord(position, uniforms.modelMatrix);\n output.vExcavateHeight = getWorldHeight(position, uniforms.modelMatrix);\n #endif\n #endif\n return output;\n}";
|
|
63
63
|
|
|
@@ -131,7 +131,7 @@ var layerVideoVideoFrag = "struct FragUniforms {\n opacity: f32\n}\n@group(0)
|
|
|
131
131
|
|
|
132
132
|
var layerVideoVideoVert = "#include <get_output>\nstruct Uniforms {\n modelMatrix: mat4x4f,\n positionMatrix: mat4x4f,\n projViewModelMatrix: mat4x4f,\n};\n@group(0) @binding($b) var<uniform> uniforms: Uniforms;\nstruct VertexInput {\n @location($i) aPosition: vec3f,\n @location($i) aTexCoord: vec2f,\n};\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location($o) vTexCoords: vec2f,\n};\n@vertex\nfn main(vertexInput: VertexInput) -> VertexOutput {\n var output: VertexOutput;\n let localPositionMatrix: mat4x4f = getPositionMatrix(vertexInput, &output, uniforms.positionMatrix);\n let localPosition: vec4f = getPosition(vec3f(vertexInput.aPosition.xyz), vertexInput);\n output.vTexCoords = vertexInput.aTexCoord;\n output.position = uniforms.projViewModelMatrix * localPositionMatrix * localPosition;\n return output;\n}";
|
|
133
133
|
|
|
134
|
-
var vtBillboardFrag = "struct BillboardFragmentUniforms {\n textureSize: vec2f,\n};\n@group(0) @binding($b) var<uniform> uniforms: BillboardFragmentUniforms;\n@group(0) @binding($b) var billTexture: texture_2d<f32>;\n@group(0) @binding($b) var billTextureSampler: sampler;\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n var fragColor: vec4f = textureSample(billTexture, billTextureSampler, vertexOutput.vTexCoord / uniforms.textureSize);\n #if HAS_SHADOWING && !HAS_BLOOM\n let shadowCoeff = shadow_computeShadow();\n fragColor.rgb = shadow_blend(fragColor.rgb, shadowCoeff);\n #endif\n return fragColor;\n}";
|
|
134
|
+
var vtBillboardFrag = "struct BillboardFragmentUniforms {\n textureSize: vec2f,\n};\n@group(0) @binding($b) var<uniform> uniforms: BillboardFragmentUniforms;\n@group(0) @binding($b) var billTexture: texture_2d<f32>;\n@group(0) @binding($b) var billTextureSampler: sampler;\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n var fragColor: vec4f = textureSample(billTexture, billTextureSampler, vertexOutput.vTexCoord / uniforms.textureSize);\n #if HAS_SHADOWING && !HAS_BLOOM\n let shadowCoeff = shadow_computeShadow(vertexOutput);\n fragColor.rgb = shadow_blend(fragColor.rgb, shadowCoeff);\n #endif\n return fragColor;\n}";
|
|
135
135
|
|
|
136
136
|
var vtBillboardVert = "#ifdef HAS_ALTITUDE\n struct VertexInput {\n @location($i) aPosition: vec2i,\n @location($i) aAltitude: f32,\n#else\n struct VertexInput {\n @location($i) aPosition: vec4i,\n#endif\n @location($i) aExtrude: vec2i,\n @location($i) aTexCoord: vec2i,\n @location($i) aQuat: vec4f,\n };\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location($o) vTexCoord: vec2f,\n};\nstruct BillboardUniforms {\n positionMatrix: mat4x4f,\n projViewModelMatrix: mat4x4f,\n extrudeScale: f32,\n};\n@group(0) @binding($b) var<uniform> uniforms: BillboardUniforms;\n#ifdef PICKING_MODE\n #include <fbo_picking_vert>\n#endif\n#include <vt_position_vert>\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_vert>\n#endif\nfn quatToMat4(q: vec4f) -> mat4x4f {\n let x = q.x;\n let y = q.y;\n let z = q.z;\n let w = q.w;\n let x2 = x * x;\n let y2 = y * y;\n let z2 = z * z;\n let xy = x * y;\n let xz = x * z;\n let yz = y * z;\n let wx = w * x;\n let wy = w * y;\n let wz = w * z;\n return mat4x4f(\n 1.0 - 2.0 * (y2 + z2), 2.0 * (xy - wz), 2.0 * (xz + wy), 0.0,\n 2.0 * (xy + wz), 1.0 - 2.0 * (x2 + z2), 2.0 * (yz - wx), 0.0,\n 2.0 * (xz - wy), 2.0 * (yz + wx), 1.0 - 2.0 * (x2 + y2), 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n}\n@vertex\nfn main(\n input: VertexInput\n) -> VertexOutput {\n var output: VertexOutput;\n let extrude = vec4f(f32(input.aExtrude.x) * uniforms.extrudeScale, 0.0, f32(input.aExtrude.y), 1.0);\n let rotationMat4 = quatToMat4(input.aQuat);\n let offset = (rotationMat4 * extrude).xyz;\n let position = unpackVTPositionOffset(input, offset);\n output.vTexCoord = vec2f(input.aTexCoord);\n output.position = uniforms.projViewModelMatrix * uniforms.positionMatrix * vec4f(position, 1.0);\n #ifdef PICKING_MODE\n fbo_picking_setData(output.position.w, true);\n #elif HAS_SHADOWING && !HAS_BLOOM\n shadow_computeShadowPars(vec4f(position, 1.0), &output);\n #endif\n return output;\n}";
|
|
137
137
|
|
|
@@ -145,7 +145,7 @@ var vtFillPickingVert = "struct VertexInput {\n#ifdef HAS_ALTITUDE\n @loc
|
|
|
145
145
|
|
|
146
146
|
var vtFillVert = "#define SHADER_NAME FILL\nstruct VertexInput {\n#ifdef HAS_ALTITUDE\n @location($i) aPosition: POSITION_TYPE_2,\n @location($i) aAltitude: f32,\n#else\n @location($i) aPosition: POSITION_TYPE_3,\n#endif\n#ifdef HAS_COLOR\n @location($i) aColor: vec4u,\n#endif\n#ifdef HAS_OPACITY\n @location($i) aOpacity: u32,\n#endif\n#ifdef HAS_PATTERN\n #ifdef HAS_TEX_COORD\n @location($i) aTexCoord: vec2f,\n #endif\n @location($i) aTexInfo: vec4u,\n #ifdef HAS_UV_SCALE\n @location($i) aUVScale: vec2u,\n #endif\n #ifdef HAS_UV_OFFSET\n @location($i) aUVOffset: vec2u,\n #endif\n #ifdef HAS_PATTERN_WIDTH\n @location($i) aPatternWidth: vec2f,\n #endif\n #ifdef HAS_PATTERN_ORIGIN\n @location($i) aPatternOrigin: vec2f,\n #endif\n #ifdef HAS_PATTERN_OFFSET\n @location($i) aPatternOffset: vec2f,\n #endif\n#endif\n}\nstruct VertexOutput {\n @builtin(position) position : vec4f,\n#ifdef HAS_COLOR\n @location($o) vColor: vec4f,\n#endif\n#ifdef HAS_OPACITY\n @location($o) vOpacity: f32,\n#endif\n#ifdef HAS_PATTERN\n @location($o) vTexCoord: vec2f,\n @location($o) vTexInfo: vec4f,\n #ifdef HAS_UV_SCALE\n @location($o) vUVScale: vec2f,\n #endif\n #ifdef HAS_UV_OFFSET\n @location($o) vUVOffset: vec2f,\n #endif\n#endif\n}\nstruct ModelUniforms {\n projViewModelMatrix: mat4x4f,\n positionMatrix: mat4x4f,\n#ifdef IS_VT\n#else\n modelMatrix: mat4x4f,\n#endif\n#ifdef HAS_PATTERN\n patternWidth: vec2f,\n patternOffset: vec2f,\n uvOrigin: vec2f,\n uvScale: vec2f,\n#ifdef IS_VT\n tileRatio: f32,\n tileScale: f32,\n#endif\n#endif\n};\n#ifdef HAS_PATTERN && IS_VT\n#else\nstruct Uniforms {\n glScale: f32,\n}\n#endif\n@group(0) @binding($b) var<uniform> uniforms: ModelUniforms;\n#ifdef HAS_PATTERN && IS_VT\n#else\n@group(0) @binding($b) var<uniform> shaderUniforms: Uniforms;\n#endif\n#ifdef HAS_PATTERN\n fn computeUV(input: VertexInput, vertex: vec2f, patternWidth: vec2f) -> vec2f {\n #ifdef IS_VT\n let u = vertex.x / patternWidth.x;\n let v = vertex.y / patternWidth.y;\n return vec2f(u, v);\n #else\n let glScale = shaderUniforms.glScale;\n var mapGLScale = glScale;\n #ifdef HAS_PATTERN_WIDTH\n let hasPatternWidth = sign(length(vec2f(input.aPatternWidth)));\n mapGLScale = mix(glScale, 1.0, hasPatternWidth);\n #endif\n var origin = uniforms.uvOrigin;\n #ifdef HAS_PATTERN_ORIGIN\n origin = vec2f(input.aPatternOrigin);\n #endif\n #ifdef HAS_PATTERN_OFFSET\n let myPatternOffset = vec2f(input.aPatternOffset);\n #else\n let myPatternOffset = uniforms.patternOffset;\n #endif\n origin += myPatternOffset;\n let u = (vertex.x - origin.x) * mapGLScale / patternWidth.x;\n let v = (vertex.y - origin.y) * mapGLScale / patternWidth.y;\n return vec2f(u, -v);\n #endif\n }\n fn computeTexCoord(input:VertexInput, localVertex: vec4f, patternSize: vec2f) -> vec2f {\n #ifdef HAS_PATTERN_WIDTH\n let aPatternWidth = vec2f(input.aPatternWidth);\n #endif\n #ifdef IS_VT\n #ifdef HAS_PATTERN_OFFSET\n let myPatternOffset = aPatternOffset;\n #else\n let myPatternOffset = uniforms.patternOffset;\n #endif\n var origin = uniforms.uvOrigin + myPatternOffset;\n #ifdef HAS_PATTERN_ORIGIN\n origin = origin - aPatternOrigin * uniforms.tileScale;\n #endif\n let hasPatternWidth = sign(length(uniforms.patternWidth));\n var myPatternWidth = mix(patternSize, uniforms.patternWidth, hasPatternWidth);\n #ifdef HAS_PATTERN_WIDTH\n myPatternWidth = aPatternWidth;\n #endif\n let originOffset = origin * vec2f(1.0, -1.0) / myPatternWidth;\n return (originOffset % 1.0) + computeUV(input, localVertex.xy * uniforms.tileScale / uniforms.tileRatio, myPatternWidth);\n #else\n var myPatternWidth = patternSize;\n #ifdef HAS_PATTERN_WIDTH\n let hasPatternWidth = sign(length(aPatternWidth));\n myPatternWidth = mix(patternSize, aPatternWidth, hasPatternWidth);\n #endif\n let position = uniforms.modelMatrix * localVertex;\n return computeUV(input, position.xy, myPatternWidth);\n #endif\n }\n#endif\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_vert>\n#endif\n#include <vt_position_vert>\n#include <highlight_vert>\n@vertex\nfn main(vertexInput: VertexInput) -> VertexOutput {\n let myPosition = unpackVTPosition(vertexInput);\n let localVertex = vec4f(myPosition, 1.0);\n var out: VertexOutput;\n var position = uniforms.projViewModelMatrix * uniforms.positionMatrix * localVertex;\n out.position = position;\n #ifdef HAS_PATTERN\n let aTexInfo: vec4f = vec4f(vertexInput.aTexInfo);\n let patternSize = aTexInfo.zw + 1.0;\n out.vTexInfo = vec4f(aTexInfo.xy, patternSize);\n #ifdef HAS_TEX_COORD\n if (vertexInput.aTexCoord.x == INVALID_TEX_COORD) {\n out.vTexCoord = computeTexCoord(vertexInput, localVertex, patternSize);\n } else {\n out.vTexCoord = vertexInput.aTexCoord;\n }\n #else\n out.vTexCoord = computeTexCoord(vertexInput, localVertex, patternSize);\n #endif\n #ifdef HAS_UV_SCALE\n out.vUVScale = vec2f(vertexInput.aUVScale) / 255.0;\n #endif\n #ifdef HAS_UV_OFFSET\n out.vUVOffset = vec2f(vertexInput.aUVOffset) / 255.0;\n #endif\n #endif\n #ifdef HAS_COLOR\n out.vColor = vec4f(vertexInput.aColor) / 255.0;\n #endif\n #if HAS_HIGHLIGHT_COLOR || HAS_HIGHLIGHT_OPACITY\n highlight_setVarying(vertexInput, &out);\n #endif\n #ifdef HAS_OPACITY\n out.vOpacity = f32(vertexInput.aOpacity) / 255.0;\n #endif\n #if HAS_SHADOWING && !HAS_BLOOM\n shadow_computeShadowPars(localVertex, &out);\n #endif\n return out;\n}";
|
|
147
147
|
|
|
148
|
-
var vtLineFrag = "#define DEVICE_PIXEL_RATIO 1.0\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\nstruct LineFragmentUniforms {\n lineBlur: f32,\n lineColor: vec4f,\n lineStrokeColor: vec4f,\n lineOpacity: f32,\n tileExtent: f32,\n lineDasharray: vec4f,\n lineDashColor: vec4f,\n #ifdef HAS_PATTERN\n atlasSize: vec2f,\n flipY: f32,\n linePatternAnimSpeed: f32,\n linePatternGap: f32,\n linePatterGapColor: vec4f,\n #endif\n}\nstruct ShaderUniforms {\n layerOpacity: f32,\n isRenderingTerrain: f32,\n trailSpeed: f32,\n trailLength: f32,\n trailCircle: f32,\n currentTime: f32,\n cameraPosition: vec3f,\n cameraToCenterDistance: f32,\n fogFactor: f32\n}\n@group(0) @binding($b) var<uniform> uniforms: LineFragmentUniforms;\n@group(0) @binding($b) var<uniform> shaderUniforms: ShaderUniforms;\n#ifdef HAS_PATTERN\n @group(0) @binding($b) var linePatternFile: texture_2d<f32>;\n @group(0) @binding($b) var linePatternFileSampler: sampler;\n#endif\n#include <highlight_frag>\n#ifdef HAS_PATTERN\nfn computeUV(texCoord: vec2f) -> vec2f {\n let uv = texCoord % 1.0;\n let uvStart = input.vTexInfo.xy;\n let uvSize = input.vTexInfo.zw;\n return (uvStart + uv * uvSize) / uniforms.atlasSize;\n}\n#endif\nfn dashAntialias(input: VertexOutput, dashMod: f32, dashWidth: f32) -> f32 {\n let dashHalf = dashWidth / 2.0;\n let dashDist = abs(dashMod - dashHalf);\n let blur2 = (0.1 + 1.0 / DEVICE_PIXEL_RATIO) * input.vGammaScale;\n return clamp(min(dashDist + blur2, dashHalf - dashDist) / blur2, 0.0, 1.0);\n}\n@fragment\nfn main(input: VertexOutput) -> @location(0) vec4f {\n #ifndef ENABLE_TILE_STENCIL\n let clip = sign(uniforms.tileExtent - min(uniforms.tileExtent, abs(input.vPosition.x))) *\n sign(1.0 + sign(input.vPosition.x)) *\n sign(uniforms.tileExtent - min(uniforms.tileExtent, abs(input.vPosition.y))) *\n sign(1.0 + sign(input.vPosition.y));\n if (clip == 0.0) {\n discard;\n }\n #endif\n #if HAS_PATTERN || HAS_DASHARRAY || HAS_GRADIENT || HAS_TRAIL\n let linesofar = input.vLinesofar;\n #endif\n let dist = length(input.vNormal) * input.vWidth.x;\n #ifdef HAS_PATTERN\n let uvSize = input.vTexInfo.zw;\n let hasPattern = sign(uvSize.x * uvSize.y);\n let blur = mix(uniforms.lineBlur, 0.0, hasPattern);\n #else\n let blur = uniforms.lineBlur;\n #endif\n let blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * input.vGammaScale;\n
|
|
148
|
+
var vtLineFrag = "#define DEVICE_PIXEL_RATIO 1.0\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\nstruct LineFragmentUniforms {\n lineBlur: f32,\n lineColor: vec4f,\n lineStrokeColor: vec4f,\n lineOpacity: f32,\n tileExtent: f32,\n lineDasharray: vec4f,\n lineDashColor: vec4f,\n #ifdef HAS_PATTERN\n atlasSize: vec2f,\n flipY: f32,\n linePatternAnimSpeed: f32,\n linePatternGap: f32,\n linePatterGapColor: vec4f,\n #endif\n}\nstruct ShaderUniforms {\n layerOpacity: f32,\n isRenderingTerrain: f32,\n trailSpeed: f32,\n trailLength: f32,\n trailCircle: f32,\n currentTime: f32,\n cameraPosition: vec3f,\n cameraToCenterDistance: f32,\n fogFactor: f32\n}\n@group(0) @binding($b) var<uniform> uniforms: LineFragmentUniforms;\n@group(0) @binding($b) var<uniform> shaderUniforms: ShaderUniforms;\n#ifdef HAS_PATTERN\n @group(0) @binding($b) var linePatternFile: texture_2d<f32>;\n @group(0) @binding($b) var linePatternFileSampler: sampler;\n#endif\n#include <highlight_frag>\n#ifdef HAS_PATTERN\nfn computeUV(texCoord: vec2f) -> vec2f {\n let uv = texCoord % 1.0;\n let uvStart = input.vTexInfo.xy;\n let uvSize = input.vTexInfo.zw;\n return (uvStart + uv * uvSize) / uniforms.atlasSize;\n}\n#endif\nfn dashAntialias(input: VertexOutput, dashMod: f32, dashWidth: f32) -> f32 {\n let dashHalf = dashWidth / 2.0;\n let dashDist = abs(dashMod - dashHalf);\n let blur2 = (0.1 + 1.0 / DEVICE_PIXEL_RATIO) * input.vGammaScale;\n return clamp(min(dashDist + blur2, dashHalf - dashDist) / blur2, 0.0, 1.0);\n}\n@fragment\nfn main(input: VertexOutput) -> @location(0) vec4f {\n #ifndef ENABLE_TILE_STENCIL\n let clip = sign(uniforms.tileExtent - min(uniforms.tileExtent, abs(input.vPosition.x))) *\n sign(1.0 + sign(input.vPosition.x)) *\n sign(uniforms.tileExtent - min(uniforms.tileExtent, abs(input.vPosition.y))) *\n sign(1.0 + sign(input.vPosition.y));\n if (clip == 0.0) {\n discard;\n }\n #endif\n #if HAS_PATTERN || HAS_DASHARRAY || HAS_GRADIENT || HAS_TRAIL\n let linesofar = input.vLinesofar;\n #endif\n let dist = length(input.vNormal) * input.vWidth.x;\n #ifdef HAS_PATTERN\n let uvSize = input.vTexInfo.zw;\n let hasPattern = sign(uvSize.x * uvSize.y);\n let blur = mix(uniforms.lineBlur, 0.0, hasPattern);\n #else\n let blur = uniforms.lineBlur;\n #endif\n let blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * input.vGammaScale;\n var alpha = clamp(min(dist - (input.vWidth.y - blur2), input.vWidth.x - dist) / blur2, 0.0, 1.0);\n if (uniforms.lineBlur == 0) {\n alpha = 1;\n }\n #ifdef HAS_COLOR\n var color = input.vColor / 255.0;\n #else\n var color = uniforms.lineColor;\n #endif\n #ifdef HAS_PATTERN\n if (hasPattern == 1.0) {\n #ifdef HAS_PATTERN_GAP\n let myGap = input.vLinePatternGap;\n #else\n let myGap = uniforms.linePatternGap;\n #endif\n #ifdef HAS_PATTERN_ANIM\n let myAnimSpeed = input.vLinePatternAnimSpeed;\n #else\n let myAnimSpeed = uniforms.linePatternAnimSpeed;\n #endif\n let patternWidth = uvSize.x * input.vWidth.x * 2.0 / uvSize.y;\n let plusGapWidth = patternWidth * (1.0 + myGap);\n let animatedLinesofar = linesofar + ((shaderUniforms.currentTime * -myAnimSpeed * 0.2) % plusGapWidth);\n let patternx = (animatedLinesofar / plusGapWidth) % 1.0;\n let patterny = ((uniforms.flipY * input.vNormal.y + 1.0) / 2.0) % 1.0;\n let patternColor = textureSample(\n linePatternFile,\n linePatternFileSampler,\n computeUV(vec2f(patternx * (1.0 + myGap), patterny))\n );\n let inGap = clamp(sign(1.0 / (1.0 + myGap) - patternx) + 0.000001, 0.0, 1.0);\n let finalPatternColor = mix(uniforms.linePatterGapColor, patternColor, inGap);\n color *= finalPatternColor;\n }\n #endif\n #ifdef HAS_DASHARRAY\n #ifdef HAS_DASHARRAY_ATTR\n let dasharray = input.vDasharray;\n #else\n let dasharray = uniforms.lineDasharray;\n #endif\n #ifdef HAS_DASHARRAY_COLOR\n let dashColor = input.vDashColor;\n #else\n let dashColor = uniforms.lineDashColor;\n #endif\n let dashWidth = dasharray[0] + dasharray[1] + dasharray[2] + dasharray[3];\n let dashMod = linesofar % dashWidth;\n let firstInDash = max(sign(dasharray[0] - dashMod), 0.0);\n let secondDashMod = dashMod - dasharray[0] - dasharray[1];\n let secondInDash = max(sign(secondDashMod), 0.0) * max(sign(dasharray[2] - secondDashMod), 0.0);\n let isInDash = firstInDash + secondInDash;\n let firstDashAlpha = dashAntialias(input, dashMod, dasharray[0]);\n let secondDashAlpha = dashAntialias(input, secondDashMod, dasharray[2]);\n let dashAlpha = firstDashAlpha * firstInDash + secondDashAlpha * secondInDash;\n color = color * (1.0 - dashAlpha) + dashColor * dashAlpha;\n #endif\n #ifdef HAS_STROKE_COLOR\n var strokeColor = input.vStrokeColor / 255.0;\n #else\n var strokeColor = uniforms.lineStrokeColor;\n #endif\n strokeColor = mix(color, strokeColor, sign(input.vWidth.y));\n color = strokeColor * alpha + max(sign(input.vWidth.y - dist), 0.0) * color * (1.0 - alpha);\n #ifdef HAS_TRAIL\n let trailMod = (linesofar - shaderUniforms.currentTime * shaderUniforms.trailSpeed * 0.1) % shaderUniforms.trailCircle;\n let trailAlpha = select(0.0, mix(0.0, 1.0, trailMod / shaderUniforms.trailLength), trailMod < shaderUniforms.trailLength);\n color *= trailAlpha;\n #endif\n #ifdef HAS_OPACITY\n let opacity = input.vOpacity;\n #else\n let opacity = uniforms.lineOpacity;\n #endif\n var fragColor = color * opacity * shaderUniforms.layerOpacity;\n #if HAS_SHADOWING && !HAS_BLOOM\n let shadowCoeff = shadow_computeShadow(input);\n fragColor = vec4(shadow_blend(fragColor.rgb, shadowCoeff), fragColor.a);\n #endif\n let cameraPosition = shaderUniforms.cameraPosition;\n let perspectiveAlpha = select(\n clamp(shaderUniforms.cameraToCenterDistance * 1.5 / distance(input.vVertex, cameraPosition), 0.0, 1.0),\n 1.0,\n shaderUniforms.isRenderingTerrain == 1.0\n );\n fragColor *= perspectiveAlpha;\n #if HAS_HIGHLIGHT_COLOR || HAS_HIGHLIGHT_OPACITY\n fragColor = highlight_blendColor(fragColor, input);\n #endif\n if (shaderUniforms.fogFactor > 0.0) {\n let dir = vec3f(input.vVertex.x - cameraPosition.x, input.vVertex.y - cameraPosition.y, input.vVertex.z - cameraPosition.z);\n let fog_dist = length(dir);\n let fog_alpha = clamp(1.0 - (fog_dist * 1.2) / shaderUniforms.fogFactor, 0.0, 1.0);\n fragColor *= fog_alpha;\n }\n return fragColor;\n}";
|
|
149
149
|
|
|
150
150
|
var vtLineGradientFrag = "#define SHADER_NAME LINE_GRADIENT\n#define DEVICE_PIXEL_RATIO 1.0\n#define MAX_LINE_COUNT 128.0\n#ifdef HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\n#include <highlight_frag>\nstruct LineGradientUniforms {\n layerOpacity: f32,\n #ifdef HAS_TRAIL\n trailSpeed: f32,\n trailLength: f32,\n trailCircle: f32,\n currentTime: f32,\n #endif\n};\nstruct LineFragmentUniforms {\n lineBlur: f32,\n tileExtent: f32,\n lineGradientTextureHeight: f32,\n #ifndef HAS_OPACITY\n lineOpacity: f32,\n #endif\n};\n@group(0) @binding($b) var<uniform> uniforms: LineGradientUniforms;\n@group(0) @binding($b) var<uniform> lineUniforms: LineFragmentUniforms;\n@group(0) @binding($b) var lineGradientTexture: texture_2d<f32>;\n@group(0) @binding($b) var lineGradientTextureSampler: sampler;\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n #ifndef ENABLE_TILE_STENCIL\n let tileExtent = lineUniforms.tileExtent;\n let clip = sign(tileExtent - min(tileExtent, abs(vertexOutput.vPosition.x))) *\n sign(1.0 + sign(vertexOutput.vPosition.x)) *\n sign(tileExtent - min(tileExtent, abs(vertexOutput.vPosition.y))) *\n sign(1.0 + sign(vertexOutput.vPosition.y));\n if clip == 0.0 {\n discard;\n }\n #endif\n let dist = length(vertexOutput.vNormal) * vertexOutput.vWidth.x;\n let blur2 = (lineUniforms.lineBlur + 1.0 / DEVICE_PIXEL_RATIO) * vertexOutput.vGammaScale;\n let alpha = clamp(min(dist - (vertexOutput.vWidth.y - blur2), vertexOutput.vWidth.x - dist) / blur2, 0.0, 1.0);\n let linesofar = vertexOutput.vLinesofar;\n let texCoord = vec2f(linesofar, (vertexOutput.vGradIndex * 2.0 + 0.5) / lineUniforms.lineGradientTextureHeight);\n var color = textureSample(lineGradientTexture, lineGradientTextureSampler, texCoord) * alpha;\n color = color * max(sign(MAX_LINE_COUNT - vertexOutput.vGradIndex), 0.0);\n #ifdef HAS_TRAIL\n let trailMod = mod(linesofar - uniforms.currentTime * uniforms.trailSpeed * 0.1, uniforms.trailCircle);\n let trailAlpha = select(0.0, mix(0.0, 1.0, trailMod / uniforms.trailLength), trailMod < uniforms.trailLength);\n color = color * trailAlpha;\n #endif\n #ifdef HAS_OPACITY\n let opacity = vertexOutput.vOpacity;\n #else\n let opacity = lineUniforms.lineOpacity;\n #endif\n var fragColor = color * opacity * uniforms.layerOpacity;\n #if HAS_SHADOWING && !HAS_BLOOM\n let shadowCoeff = shadow_computeShadow(vertexOutput);\n fragColor = vec4f(shadow_blend(fragColor.rgb, shadowCoeff).rgb, fragColor.a);\n #endif\n #if HAS_HIGHLIGHT_OPACITY || HAS_HIGHLIGHT_COLOR\n fragColor = highlight_blendColor(fragColor, vertexOutput);\n #endif\n return fragColor;\n}";
|
|
151
151
|
|
|
@@ -159,9 +159,9 @@ var vtNativeLineFrag = "struct Uniforms {\n lineOpacity: f32,\n lineColor:
|
|
|
159
159
|
|
|
160
160
|
var vtNativeLineVert = "struct VertexInput {\n#ifdef HAS_ALTITUDE\n @location($i) aPosition: vec2i,\n @location($i) aAltitude: f32,\n#else\n @location($i) aPosition: vec4i,\n#endif\n#ifndef PICKING_MODE\n #if HAS_COLOR\n @location($i) aColor: vec4u,\n #endif\n#endif\n}\nstruct MyAppUniforms {\n projViewModelMatrix: mat4x4f,\n positionMatrix: mat4x4f,\n};\n@group(0) @binding($b) var<uniform> uniforms: MyAppUniforms;\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n#ifndef PICKING_MODE\n #if HAS_COLOR\n @location($o) vColor: vec4f,\n #endif\n#endif\n}\n#ifdef PICKING_MODE\n #include <fbo_picking_vert>\n#endif\n#include <vt_position_vert>\n@vertex\nfn main(\n vertexInput: VertexInput\n) -> VertexOutput {\n var out: VertexOutput;\n let position = unpackVTPosition(vertexInput);\n out.position = uniforms.projViewModelMatrix * uniforms.positionMatrix * vec4f(position, 1.0);\n #ifndef PICKING_MODE\n #if HAS_COLOR\n out.vColor = vertexInputWithColor.aColor / 255.0;\n #endif\n #else\n fbo_picking_setData(vertexInput, &out, out.position.w, true);\n #endif\n return out;\n}";
|
|
161
161
|
|
|
162
|
-
var vtNativePointFrag = "struct MarkerFragmentUniforms {\n markerOpacity: f32,\n #ifndef HAS_COLOR\n markerFill: vec3f,\n #endif\n}\n@group(0) @binding($b) var<uniform> uniforms: MarkerFragmentUniforms;\n@group(0) @binding($b) var<uniform> layerOpacity: f32;\n
|
|
162
|
+
var vtNativePointFrag = "struct MarkerFragmentUniforms {\n markerOpacity: f32,\n #ifndef HAS_COLOR\n markerFill: vec3f,\n #endif\n}\n@group(0) @binding($b) var<uniform> uniforms: MarkerFragmentUniforms;\n@group(0) @binding($b) var<uniform> layerOpacity: f32;\n@fragment\nfn main(\n vertexOutput: VertexOutput\n) -> @location(0) vec4f {\n var alpha: f32 = 1.0;\n #ifdef USE_CIRCLE\n let uv = vertexOutput.vUv;\n let center = vec2f(0.5, 0.5);\n let dist = distance(uv, center);\n let radius = 0.5;\n let smooth_width = 0.05;\n let alpha_circle = 1.0 - smoothstep(radius - smooth_width, radius, dist);\n alpha = alpha_circle;\n #endif\n var pointColor: vec4f;\n #ifdef HAS_COLOR\n pointColor = vertexOutput.vColor;\n #else\n pointColor = vec4f(uniforms.markerFill, 1.0);\n #endif\n let color = pointColor * uniforms.markerOpacity * alpha * layerOpacity;\n if (color.a <= 0.01) {\n discard;\n }\n return color;\n}";
|
|
163
163
|
|
|
164
|
-
var vtNativePointVert = "struct AttributeInput {\n @location($i) aPosition: vec2i,\n#ifdef HAS_ALTITUDE\n @location($i) instancePosition: vec2i,\n @location($i) instanceAltitude: f32,\n#else\n @location($i) instancePosition: vec4i,\n#endif\n#ifndef PICKING_MODE\n #ifdef HAS_COLOR\n @location($i) aColor: vec4u,\n #endif\n#endif\n};\nstruct VertexInput {\n#ifdef HAS_ALTITUDE\n aPosition: vec2i,\n aAltitude: f32,\n#else\n aPosition: vec4i,\n#endif\n aPickingId: f32,\n}\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n #ifndef PICKING_MODE\n #ifdef HAS_COLOR\n @location($o) vColor: vec4f,\n #endif\n #endif\n};\nstruct MarkerUniforms {\n positionMatrix: mat4x4f,\n projViewModelMatrix: mat4x4f,\n markerSize: f32,\n};\n@group(0) @binding($b) var<uniform> uniforms: MarkerUniforms;\n@group(0) @binding($b) var<uniform> resolution: vec2f;\n#ifdef PICKING_MODE\n #include <fbo_picking_vert>\n#endif\n#include <vt_position_vert>\n@vertex\nfn main(\n input: AttributeInput\n) -> VertexOutput {\n var out: VertexOutput;\n var inputVertex: VertexInput;\n inputVertex.aPosition = input.instancePosition;\n #ifdef HAS_ALTITUDE\n inputVertex.aAltitude = input.instanceAltitude;\n #endif\n let position = unpackVTPosition(inputVertex);\n out.position = uniforms.projViewModelMatrix * uniforms.positionMatrix * vec4f(position, 1.0);\n let markerSize = uniforms.markerSize / resolution;\n let w = out.position.w;\n out.position.x += f32(input.aPosition.x) * markerSize.x * w;\n out.position.y += f32(input.aPosition.y) * markerSize.y * w;\n #ifndef PICKING_MODE\n #ifdef HAS_COLOR\n out.vColor = vec4f(input.aColor) / 255.0;\n #endif\n #endif\n #ifdef PICKING_MODE\n inputVertex.aPickingId = input.aPickingId;\n fbo_picking_setData(inputVertex, &out, w, true);\n #endif\n return out;\n}";
|
|
164
|
+
var vtNativePointVert = "struct AttributeInput {\n @location($i) aPosition: vec2i,\n#ifdef HAS_ALTITUDE\n @location($i) instancePosition: vec2i,\n @location($i) instanceAltitude: f32,\n#else\n @location($i) instancePosition: vec4i,\n#endif\n#ifdef HAS_TERRAIN_ALTITUDE\n @location($i) aTerrainAltitude: f32,\n#endif\n#ifndef PICKING_MODE\n #ifdef HAS_COLOR\n @location($i) aColor: vec4u,\n #endif\n#endif\n};\nstruct VertexInput {\n#ifdef HAS_ALTITUDE\n aPosition: vec2i,\n aAltitude: f32,\n#else\n aPosition: vec4i,\n#endif\n aPickingId: f32,\n}\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n #ifndef PICKING_MODE\n #ifdef HAS_COLOR\n @location($o) vColor: vec4f,\n #endif\n #endif\n @location($o) vUv: vec2f,\n};\nstruct MarkerUniforms {\n positionMatrix: mat4x4f,\n projViewModelMatrix: mat4x4f,\n markerSize: f32,\n};\n@group(0) @binding($b) var<uniform> uniforms: MarkerUniforms;\n@group(0) @binding($b) var<uniform> resolution: vec2f;\n#ifdef PICKING_MODE\n #include <fbo_picking_vert>\n#endif\n#include <vt_position_vert>\n@vertex\nfn main(\n input: AttributeInput\n) -> VertexOutput {\n var out: VertexOutput;\n var inputVertex: VertexInput;\n inputVertex.aPosition = input.instancePosition;\n #ifdef HAS_ALTITUDE\n inputVertex.aAltitude = input.instanceAltitude;\n #endif\n #ifdef HAS_TERRAIN_ALTITUDE\n inputVertex.aTerrainAltitude += input.aTerrainAltitude;\n #endif\n let position = unpackVTPosition(inputVertex);\n out.position = uniforms.projViewModelMatrix * uniforms.positionMatrix * vec4f(position, 1.0);\n let markerSize = uniforms.markerSize / resolution;\n let w = out.position.w;\n out.position.x += f32(input.aPosition.x) * markerSize.x * w;\n out.position.y += f32(input.aPosition.y) * markerSize.y * w;\n out.vUv = vec2f(input.aPosition + 1) / 2.0;\n #ifndef PICKING_MODE\n #ifdef HAS_COLOR\n out.vColor = vec4f(input.aColor) / 255.0;\n #endif\n #endif\n #ifdef PICKING_MODE\n inputVertex.aPickingId = input.aPickingId;\n fbo_picking_setData(inputVertex, &out, w, true);\n #endif\n return out;\n}";
|
|
165
165
|
|
|
166
166
|
var vtOutlineFrag = "struct OutlineUniforms {\n highlightPickingId: f32,\n}\n@group(0) @binding($b) var<uniform> uniforms: OutlineUniforms;\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n if (uniforms.highlightPickingId < 0.0 ||\n floor(uniforms.highlightPickingId + 0.5) == floor(vertexOutput.vPickingId + 0.5)) {\n return vec4f(1.0);\n } else {\n discard;\n return vec4f(0.0);\n }\n}";
|
|
167
167
|
|
|
@@ -259,4 +259,4 @@ registerWGSLSource('vt_tube_vert', vtTubeVert);
|
|
|
259
259
|
registerWGSLSource('vt_flat_mask_frag', vtFlatMaskFrag);
|
|
260
260
|
registerWGSLSource('vt_flat_mask_vert', vtFlatMaskVert);
|
|
261
261
|
|
|
262
|
-
typeof console !== 'undefined' && console.log('@maptalks/gpu v0.124.
|
|
262
|
+
typeof console !== 'undefined' && console.log('@maptalks/gpu v0.124.4');
|
package/dist/maptalksgpu.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @maptalks/gpu v0.124.
|
|
2
|
+
* @maptalks/gpu v0.124.4
|
|
3
3
|
* LICENSE : UNLICENSED
|
|
4
4
|
* (c) 2016-2026 maptalks.com
|
|
5
5
|
*/
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
|
|
55
55
|
var glFillVert = "#include <vsm_shadow_vert>\nstruct VertexInput {\n @location($i) aPosition: vec3f,\n#ifdef HAS_PATTERN\n @location($i) aTexCoord: vec2f,\n#endif\n};\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n#ifdef HAS_PATTERN\n @location($o) vTexCoord: vec2f,\n#endif\n};\nstruct BackFillUniforms {\n projViewModelMatrix: mat4x4f,\n modelMatrix: mat4x4f,\n#ifdef HAS_PATTERN\n uvScale: vec2f,\n uvOffset: vec2f,\n#endif\n};\n@group(0) @binding($b) var<uniform> uniforms: BackFillUniforms;\n@vertex\nfn main(vertexInput: VertexInput) -> VertexOutput {\n var vertexOutput: VertexOutput;\n#ifdef HAS_PATTERN\n vertexOutput.vTexCoord = vertexInput.aTexCoord * uniforms.uvScale + uniforms.uvOffset;\n#endif\n let position = vec3f(vertexInput.aPosition.xyz);\n vertexOutput.position = uniforms.projViewModelMatrix * vec4f(position, 1.0);\n#if HAS_SHADOWING && !HAS_BLOOM\n shadow_computeShadowPars(vec4f(position, 1.0), &vertexOutput);\n#endif\n return vertexOutput;\n}";
|
|
56
56
|
|
|
57
|
-
var glTerrainFrag = "#define SHADER_NAME TERRAIN_MESH\n#include <mask_frag>\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\nstruct TerrainUniforms {\n polygonOpacity: f32,\n};\n@group(0) @binding($b) var<uniform> uniforms: TerrainUniforms;\n@group(0) @binding($b) var skin: texture_2d<f32>;\n@group(0) @binding($b) var skinSampler: sampler;\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n var uv = vec2f(vertexOutput.vUv);\n var color = textureSample(skin, skinSampler, uv);\n #if HAS_SHADOWING && !HAS_BLOOM\n var shadowCoeff = shadow_computeShadow();\n color.rgb = shadow_blend(color.rgb, shadowCoeff).rgb;\n #endif\n var fragColor = color * uniforms.polygonOpacity;\n #ifdef HAS_MASK_EXTENT\n fragColor = setMask(fragColor);\n #endif\n return fragColor;\n}";
|
|
57
|
+
var glTerrainFrag = "#define SHADER_NAME TERRAIN_MESH\n#include <mask_frag>\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\nstruct TerrainUniforms {\n polygonOpacity: f32,\n};\n@group(0) @binding($b) var<uniform> uniforms: TerrainUniforms;\n@group(0) @binding($b) var skin: texture_2d<f32>;\n@group(0) @binding($b) var skinSampler: sampler;\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n var uv = vec2f(vertexOutput.vUv);\n var color = textureSample(skin, skinSampler, uv);\n #if HAS_SHADOWING && !HAS_BLOOM\n var shadowCoeff = shadow_computeShadow(vertexOutput);\n color.rgb = shadow_blend(color.rgb, shadowCoeff).rgb;\n #endif\n var fragColor = color * uniforms.polygonOpacity;\n #ifdef HAS_MASK_EXTENT\n fragColor = setMask(fragColor);\n #endif\n return fragColor;\n}";
|
|
58
58
|
|
|
59
59
|
var glTerrainSkinFrag = "struct TerrrainSkinUniforms {\n tileSize: f32,\n skinDim: vec3f,\n opacity: f32,\n flipY: f32\n}\n@group(0) @binding($b) var<uniform> uniforms: TerrrainSkinUniforms;\n@group(0) @binding($b) var skinTexture: texture_2d<f32>;\n@group(0) @binding($b) var skinTextureSampler: sampler;\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n var fragCoord = vertexOutput.position.xy / 2.0;\n var resolution = vec2f(uniforms.tileSize);\n var uv = (fragCoord - uniforms.skinDim.xy) / (resolution * uniforms.skinDim.z);\n if (uniforms.flipY > 0.5) {\n uv.y = 1.0 - uv.y;\n }\n var color = textureSample(skinTexture, skinTextureSampler, uv);\n var opacity = 0.0;\n if (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0) {\n opacity = uniforms.opacity;\n }\n return color * opacity;\n}";
|
|
60
60
|
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
|
|
63
63
|
var glTerrainVert = "#include <common_pack_float>\n#include <mask_vert>\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_vert>\n#endif\nstruct MatrixUniforms {\n projMatrix: mat4x4f,\n heightScale: f32,\n};\nstruct TerrainUniforms {\n minAltitude: f32,\n projViewModelMatrix: mat4x4f,\n modelMatrix: mat4x4f,\n modelViewMatrix: mat4x4f,\n positionMatrix: mat4x4f,\n};\nstruct VertexOutput {\n @builtin(position) position : vec4f,\n @location($o) vUv: vec2f,\n};\nstruct VertexInput {\n @location($i) aPosition: vec3f,\n @location($i) aTexCoord: vec2f,\n};\n@group(0) @binding($b) var<uniform> matrixUniforms: MatrixUniforms;\n@group(0) @binding($b) var<uniform> uniforms: TerrainUniforms;\n@group(0) @binding($b) var flatMaskSampler: sampler;\n@group(0) @binding($b) var flatMask: texture_2d<f32>;\n@vertex\nfn main(\n vertexInput: VertexInput,\n) -> VertexOutput {\n var vertexOutput: VertexOutput;\n var uv: vec2f = vertexInput.aTexCoord;\n let encodedHeight: vec4f = textureSampleLevel(flatMask, flatMaskSampler, uv, 0.0);\n var altitude: f32 = vertexInput.aPosition.z;\n if (length(encodedHeight) < 2.0) {\n let maskHeight: f32 = decodeFloat32(encodedHeight);\n altitude = min(vertexInput.aPosition.z, maskHeight);\n }\n var position: vec4f = vec4f(vertexInput.aPosition.xy, (altitude + uniforms.minAltitude) * matrixUniforms.heightScale, 1.0);\n position = uniforms.positionMatrix * position;\n #ifdef HAS_MASK_EXTENT\n vertexOutput.position = matrixUniforms.projMatrix * getMaskPosition(position, uniforms.modelMatrix, vertexOutput);\n #else\n vertexOutput.position = uniforms.projViewModelMatrix * position;\n #endif\n vertexOutput.vUv = vertexInput.aTexCoord;\n #if HAS_SHADOWING && !HAS_BLOOM\n shadow_computeShadowPars(position, &vertexOutput);\n #endif\n return vertexOutput;\n}";
|
|
64
64
|
|
|
65
|
-
var glStandardFrag = "#include <hsv_frag>\n#include <srgb_frag>\n#include <highlight_frag>\n#include <snow_frag>\n#include <mask_frag>\n#include <terrain_normal_frag>\n#include <vertex_color_frag>\n#include <excavate_frag>\n#include <compute_texcoord_frag>\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\n#define PI 3.141593\n#define RECIPROCAL_PI 0.3183099\nstruct MaterialUniforms {\n roughnessMetalness: vec2f,\n albedo: vec3f,\n alpha: f32,\n normal: vec3f,\n emit: vec3f,\n ao: f32,\n specularColor: vec3f,\n glossiness: f32,\n skinColor: vec4f,\n #ifdef MESH_ENV_EXPO\n environmentExposure: f32,\n #endif\n};\nvar<private> materialUniforms: MaterialUniforms;\nstruct SceneUniforms {\n alphaTest: f32,\n emissiveFactor: vec3f,\n baseColorFactor: vec4f,\n baseColorIntensity: f32,\n emitColorFactor: f32,\n occlusionFactor: f32,\n roughnessFactor: f32,\n metallicFactor: f32,\n normalMapFactor: f32,\n specularF0: f32,\n emitMultiplicative: f32,\n normalMapFlipY: f32,\n outputSRGB: f32,\n contrast: f32,\n hsv: vec3f,\n specularAAVariance: f32,\n specularAAThreshold: f32,\n #if HAS_SSR\n invProjMatrix: mat4x4f,\n outputFovInfo: array<vec4f, 2>,\n reprojViewProjMatrix: mat4x4f,\n #endif\n #ifndef HAS_COLOR\n #ifdef IS_LINE_EXTRUSION\n lineColor: vec4f,\n #else\n polygonFill: vec4f,\n #endif\n #endif\n #ifdef HAS_PATTERN\n #ifndef HAS_PATTERN_ANIM\n linePatternAnimSpeed: f32,\n #endif\n #ifndef HAS_PATTERN_GAP\n linePatternGap: f32,\n #endif\n linePatternGapColor: vec4f,\n flipY: f32,\n animSpeedScale: f32,\n uvScale: vec2f,\n atlasSize: vec2f,\n #endif\n #ifdef IS_LINE_EXTRUSION\n lineOpacity: f32,\n #else\n polygonOpacity: f32,\n #endif\n};\nstruct ShaderUniforms {\n #if HAS_IBL_LIGHTING\n hdrHSV: vec3f,\n diffuseSPH: array<vec3f, 9>,\n prefilterMiplevel: vec2f,\n prefilterSize: vec2f,\n #else\n ambientColor: vec3f,\n #endif\n cameraPosition: vec3f,\n cameraNearFar: vec2f,\n #ifndef MESH_ENV_EXPO\n environmentExposure: f32,\n #endif\n environmentTransform: mat3x3f,\n light0_viewDirection: vec3f,\n light0_diffuse: vec4f,\n #if HAS_LAYER_OPACITY\n layerOpacity: f32,\n #endif\n #if HAS_SSR\n outSize: vec2f,\n ssrFactor: f32,\n ssrQuality: f32,\n projMatrix: mat4x4f,\n #endif\n #ifdef HAS_PATTERN\n currentTime: f32,\n #endif\n}\n@group(0) @binding($b) var<uniform> uniforms: SceneUniforms;\n@group(0) @binding($b) var<uniform> shaderUniforms: ShaderUniforms;\n#if HAS_ALBEDO_MAP\n @group(0) @binding($b) var baseColorTexture: texture_2d<f32>;\n @group(0) @binding($b) var baseColorTextureSampler: sampler;\n#endif\n#if HAS_METALLICROUGHNESS_MAP\n @group(0) @binding($b) var metallicRoughnessTexture: texture_2d<f32>;\n @group(0) @binding($b) var metallicRoughnessTextureSampler: sampler;\n#endif\n#if HAS_EMISSIVE_MAP\n @group(0) @binding($b) var emissiveTexture: texture_2d<f32>;\n @group(0) @binding($b) var emissiveTextureSampler: sampler;\n#endif\n#if HAS_AO_MAP\n @group(0) @binding($b) var occlusionTexture: texture_2d<f32>;\n @group(0) @binding($b) var occlusionTextureSampler: sampler;\n#endif\n#if HAS_NORMAL_MAP && HAS_TANGENT\n @group(0) @binding($b) var normalTexture: texture_2d<f32>;\n @group(0) @binding($b) var normalTextureSampler: sampler;\n#endif\n#if HAS_SKIN_MAP\n @group(0) @binding($b) var skinTexture: texture_2d<f32>;\n @group(0) @binding($b) var skinTextureSampler: sampler;\n#endif\n#if HAS_RANDOM_TEX\n @group(0) @binding($b) var noiseTexture: texture_2d<f32>;\n @group(0) @binding($b) var noiseTextureSampler: sampler;\n#endif\n@group(0) @binding($b) var brdfLUT: texture_2d<f32>;\n@group(0) @binding($b) var brdfLUTSampler: sampler;\n#if HAS_IBL_LIGHTING\n @group(0) @binding($b) var prefilterMap: texture_cube<f32>;\n @group(0) @binding($b) var prefilterMapSampler: sampler;\n#endif\n#if HAS_SSR\n @group(0) @binding($b) var TextureDepth: texture_2d<f32>;\n @group(0) @binding($b) var TextureDepthSampler: sampler;\n @group(0) @binding($b) var TextureReflected: texture_2d<f32>;\n @group(0) @binding($b) var TextureReflectedSampler: sampler;\n#endif\n#if HAS_BUMP_MAP && HAS_TANGENT\n @group(0) @binding($b) var bumpTexture: texture_2d<f32>;\n @group(0) @binding($b) var bumpSampler: sampler;\n#endif\n#if HAS_PATTERN\n @group(0) @binding($b) var linePatternFile: texture_2d<f32>;\n @group(0) @binding($b) var linePatternFileSampler: sampler;\n#endif\nfn getMaterialAlbedo() -> vec3f {\n return materialUniforms.albedo;\n}\nfn getMaterialAlpha() -> f32 {\n return materialUniforms.alpha;\n}\nfn getMaterialMetalness() -> f32 {\n return materialUniforms.roughnessMetalness.y;\n}\nfn getMaterialRoughness() -> f32 {\n #if SHADING_MODEL_SPECULAR_GLOSSINESS\n return 1.0 - materialUniforms.glossiness;\n #else\n return materialUniforms.roughnessMetalness.x;\n #endif\n}\nfn getMaterialEmitColor() -> vec3f {\n return materialUniforms.emit;\n}\nfn getMaterialSkinColor() -> vec4f {\n return materialUniforms.skinColor;\n}\nfn getMaterialNormalMap() -> vec3f {\n return materialUniforms.normal;\n}\nfn getMaterialOcclusion() -> f32 {\n return materialUniforms.ao;\n}\nfn decodeDepth(pack: vec4f) -> f32 {\n return pack.r + pack.g / 255.0;\n}\nfn transformNormal(factor: f32, normalToTransform: vec3f, t: vec3f, b: vec3f, n: vec3f) -> vec3f {\n let normal = vec3f(normalToTransform.xy * factor, normalToTransform.z);\n let tbn = mat3x3f(t, b, n);\n return normalize(tbn * normal);\n}\nfn D_GGX(roughness: f32, normal: vec3f, H: vec3f) -> f32 {\n let NoH = clamp(dot(normal, H), 0.0, 1.0);\n let a = roughness * roughness;\n let a2 = a * a;\n let d = (NoH * a2 - NoH) * NoH + 1.0;\n return a2 / ( PI * d * d);\n}\nfn F_Schlick(f0: vec3f, f90: f32, L: vec3f, H: vec3f) -> vec3f {\n var VoH = clamp(dot(L, H), 0.0, 1.0);\n VoH = pow(1.0 - VoH, 5.0);\n return f90 * VoH + (1.0 - VoH) * f0;\n}\nfn V_SmithGGXCorrelated(normal: vec3f, V: vec3f, roughness: f32, NoL: f32) -> f32 {\n let NoV = clamp(dot(normal, V), 0.0, 1.0);\n let a = roughness * roughness;\n let GGXL = NoV * (NoL * (1.0 - a) + a);\n let GGXV = NoL * (NoV * (1.0 - a) + a);\n return 0.5 / (GGXV + GGXL);\n}\nfn computeSpecularBRDF(roughness: f32, normal: vec3f, V: vec3f, L: vec3f, specular: vec3f, NoL: f32, f90: f32) -> vec3f {\n let H = normalize(V + L);\n let D = D_GGX(roughness, normal, H);\n let V_S = V_SmithGGXCorrelated(normal, V, roughness, NoL);\n let F = F_Schlick(specular, f90, L, H);\n return (D * V_S * PI) * F;\n}\nfn BRDF_Lambert(diffuseColor: vec3f) -> vec3f {\n return RECIPROCAL_PI * diffuseColor;\n}\nstruct LambertLight {\n diffuse: vec3f,\n specular: vec3f\n}\nfn computeLambert(\n normal: vec3f,\n V: vec3f,\n NoL: f32,\n roughness: f32,\n materialDiffuse: vec3f,\n specular: vec3f,\n lightColor: vec3f,\n L: vec3f,\n f90: f32\n) -> LambertLight {\n var lambert: LambertLight;\n if (NoL <= 0.0) {\n lambert.diffuse = vec3f(0.0);\n lambert.specular = vec3f(0.0);\n return lambert;\n }\n let a = NoL * lightColor;\n let brdf = computeSpecularBRDF(roughness, normal, V, L, specular, NoL, f90);\n lambert.specular = a * brdf;\n lambert.diffuse = a * BRDF_Lambert(materialDiffuse);\n return lambert;\n}\n#if HAS_IBL_LIGHTING\n fn computeDiffuseSPH(normal: vec3f) -> vec3f {\n let n = shaderUniforms.environmentTransform * normal;\n let diffuseSPH = shaderUniforms.diffuseSPH;\n let x = n.x;\n let y = n.y;\n let z = n.z;\n let result = (\n diffuseSPH[0] +\n diffuseSPH[1] * x +\n diffuseSPH[2] * y +\n diffuseSPH[3] * z +\n diffuseSPH[4] * z * x +\n diffuseSPH[5] * y * z +\n diffuseSPH[6] * y * x +\n diffuseSPH[7] * (3.0 * z * z - 1.0) +\n diffuseSPH[8] * (x*x - y*y)\n );\n if (length(shaderUniforms.hdrHSV) > 0.0) {\n return hsv_apply3(result, shaderUniforms.hdrHSV);\n }\n return max(result, vec3f(0.0));\n }\n fn fetchEnvMap(roughness: f32, R: vec3f) -> vec3f {\n let dir = R;\n let maxLevels = shaderUniforms.prefilterMiplevel.x;\n let lod = min(maxLevels, roughness * shaderUniforms.prefilterMiplevel.y);\n var envLight = textureSampleLevel(prefilterMap, prefilterMapSampler, dir, lod).rgb;\n if (length(shaderUniforms.hdrHSV) > 0.0) {\n envLight = hsv_apply3(envLight, shaderUniforms.hdrHSV);\n }\n return envLight;\n }\n fn getIBLEnvMap(N: vec3f, V: vec3f, roughness: f32, frontNormal: vec3f, materialDiffuse: vec3f) -> vec3f {\n let smoothness = 1.0 - roughness;\n let R = mix(N, reflect(-V, N), smoothness * (sqrt(smoothness) + roughness));\n let factor = clamp(1.0 + dot(R, frontNormal), 0.0, 1.0);\n let prefilteredEnvColor = fetchEnvMap(roughness, shaderUniforms.environmentTransform * R) * factor * factor;\n return prefilteredEnvColor;\n }\n#else\n fn getIBLEnvMap(normal: vec3f, eyeVector: vec3f, roughness: f32, frontNormal: vec3f, materialDiffuse: vec3f) -> vec3f {\n return shaderUniforms.ambientColor * BRDF_Lambert(materialDiffuse);\n }\n#endif\nfn computeBRDF(spec: vec3f, roughness: f32, NoV: f32, f90: f32) -> vec3f {\n let rgba = textureSample(brdfLUT, brdfLUTSampler, vec2f(NoV, roughness)) * vec4f(255.0, 65280.0, 255.0, 65280.0);\n let b = (rgba[3] + rgba[2]);\n let a = (rgba[1] + rgba[0]);\n return (spec * a + b * f90) / 65535.0;\n}\nfn computeIBLSpecular(\n normal: vec3f,\n eyeVector: vec3f,\n NoV: f32,\n roughness: f32,\n specular: vec3f,\n frontNormal: vec3f,\n f90: f32,\n materialDiffuse: vec3f\n) -> vec3f {\n return getIBLEnvMap(normal, eyeVector, roughness, frontNormal, materialDiffuse) * computeBRDF(specular, roughness, NoV, f90);\n}\nfn computeSpecularAO(ao: f32, NoV: f32) -> f32 {\n let d = NoV + ao;\n return clamp((d * d) - 1.0 + ao, 0.0, 1.0);\n}\n#ifdef HAS_PATTERN\n fn computeUV(input: VertexOutput, texCoord: vec2f) -> vec2f {\n let uv = texCoord % 1.0;\n let uvStart = vec2f(input.vTexInfo.xy);\n let uvSize = vec2f(input.vTexInfo.zw);\n return (uvStart + uv * uvSize) / uniforms.atlasSize;\n }\n#endif\nfn initMaterial(vertexOutput: VertexOutput) -> MaterialUniforms {\n var materialUniforms: MaterialUniforms;\n var uv: vec2f;\n#ifdef HAS_MAP\n uv = computeTexCoord(vertexOutput.vTexCoord, vertexOutput);\n#endif\n#ifdef HAS_UV_FLIP\n uv.y = 1.0 - uv.y;\n#endif\n#if HAS_BUMP_MAP && HAS_TANGENT\n uv = bumpUV(uv, normalize(vertexOutput.vTangentViewPos - vertexOutput.vTangentFragPos));\n#endif\n materialUniforms.albedo = uniforms.baseColorIntensity * uniforms.baseColorFactor.rgb;\n materialUniforms.alpha = uniforms.baseColorFactor.a * vertexOutput.vOpacity;\n#if HAS_PATTERN\n var linesofar = vertexOutput.vLinesofar;\n let uvSize = vertexOutput.vTexInfo.zw;\n#ifdef HAS_PATTERN_GAP\n let myGap = vertexOutput.vLinePatternGap;\n#else\n let myGap = uniforms.linePatternGap;\n#endif\n#ifdef HAS_PATTERN_ANIM\n let myAnimSpeed = vertexOutput.vLinePatternAnimSpeed;\n#else\n let myAnimSpeed = uniforms.linePatternAnimSpeed;\n#endif\n let patternWidth = ceil(uvSize.x * vertexOutput.vPatternHeight / uvSize.y);\n let plusGapWidth = patternWidth * (1.0 + myGap);\n let animSpeed = myAnimSpeed / uniforms.animSpeedScale;\n linesofar += (shaderUniforms.currentTime * -animSpeed * 0.2) % plusGapWidth;\n let patternx = (linesofar / plusGapWidth) % 1.0;\n let patterny = (uniforms.flipY * vertexOutput.vNormalY) % 1.0;\n let texCoord = vec2f(patternx * (1.0 + myGap) * uniforms.uvScale[0], patterny * uniforms.uvScale[1]);\n uv = computeUV(vertexOutput, texCoord);\n var patternColor = textureSample(linePatternFile, linePatternFileSampler, uv);\n let inGap = clamp(sign(1.0 / (1.0 + myGap) - patternx) + 0.000001, 0.0, 1.0);\n patternColor = mix(uniforms.linePatternGapColor, patternColor, inGap);\n#ifdef IS_SQUARE_TUBE\n let v = clamp(sign(abs(vertexOutput.vNormalY) - 0.999999), 0.0, 1.0);\n patternColor = mix(patternColor, vec4(1.0), v);\n#endif\n materialUniforms.albedo *= patternColor.rgb;\n materialUniforms.alpha *= patternColor.a;\n#endif\n#if HAS_ALBEDO_MAP\n let baseColor = textureSample(baseColorTexture, baseColorTextureSampler, uv);\n materialUniforms.albedo *= sRGBToLinear(baseColor.rgb);\n materialUniforms.alpha *= baseColor.a;\n#endif\n#if HAS_SKIN_MAP\n let skinColorValue = textureSample(skinTexture, skinTextureSampler, uv);\n materialUniforms.skinColor = skinColorValue;\n#endif\n#if HAS_COLOR0\n materialUniforms.albedo *= vertexOutput.vColor0.rgb;\n#if COLOR0_SIZE == 4\n materialUniforms.alpha *= vertexOutput.vColor0.a;\n#endif\n#endif\n#if HAS_COLOR\n materialUniforms.albedo *= vertexOutput.vColor.rgb;\n materialUniforms.alpha *= vertexOutput.vColor.a;\n#elif IS_LINE_EXTRUSION\n materialUniforms.albedo *= uniforms.lineColor.rgb;\n materialUniforms.alpha *= uniforms.lineColor.a;\n#else\n materialUniforms.albedo *= uniforms.polygonFill.rgb;\n materialUniforms.alpha *= uniforms.polygonFill.a;\n#endif\n#if HAS_INSTANCE_COLOR\n materialUniforms.albedo *= vertexOutput.vInstanceColor.rgb;\n materialUniforms.alpha *= vertexOutput.vInstanceColor.a;\n#endif\n#if HAS_METALLICROUGHNESS_MAP\n let mrSample = textureSample(metallicRoughnessTexture, metallicRoughnessTextureSampler, uv).gb;\n materialUniforms.roughnessMetalness = mrSample * vec2(uniforms.roughnessFactor, uniforms.metallicFactor);\n#else\n materialUniforms.roughnessMetalness = vec2(uniforms.roughnessFactor, uniforms.metallicFactor);\n#endif\n materialUniforms.emit = uniforms.emissiveFactor;\n#if HAS_EMISSIVE_MAP\n if (uniforms.emitMultiplicative == 1.0) {\n materialUniforms.emit *= sRGBToLinear(textureSample(emissiveTexture, emissiveTextureSampler, uv).rgb);\n } else {\n materialUniforms.emit += sRGBToLinear(textureSample(emissiveTexture, emissiveTextureSampler, uv).rgb);\n }\n#endif\n materialUniforms.emit *= uniforms.emitColorFactor;\n#if HAS_AO_MAP\n let aoTexCoord = computeTexCoord(vertexOutput.vTexCoord1, vertexOutput);\n materialUniforms.ao = textureSample(occlusionTexture, occlusionTextureSampler, aoTexCoord).r;\n#else\n materialUniforms.ao = 1.0;\n#endif\n materialUniforms.ao *= uniforms.occlusionFactor;\n#if HAS_NORMAL_MAP && HAS_TANGENT\n var nmap = textureSample(normalTexture, normalTextureSampler, uv).xyz * 2.0 - 1.0;\n nmap.y = select(nmap.y, -nmap.y, uniforms.normalMapFlipY == 1.0);\n materialUniforms.normal = nmap;\n#else\n materialUniforms.normal = normalize(vertexOutput.vModelNormal);\n#endif\n#if HAS_TERRAIN_NORMAL && HAS_TANGENT\n var nmap = convertTerrainHeightToNormalMap(uv);\n nmap.y = select(nmap.y, -nmap.y, uniforms.normalMapFlipY == 1.0);\n materialUniforms.normal = nmap;\n#endif\n#if SHADING_MODEL_SPECULAR_GLOSSINESS\n materialUniforms.albedo *= uniforms.diffuseFactor.rgb;\n materialUniforms.alpha *= uniforms.diffuseFactor.a;\n#if HAS_DIFFUSE_MAP\n let diffuse = textureSample(diffuseTexture, diffuseTextureSampler, uv);\n materialUniforms.albedo *= sRGBToLinear(diffuse.rgb);\n materialUniforms.alpha *= diffuse.a;\n#endif\n materialUniforms.specularColor = uniforms.specularFactor;\n materialUniforms.glossiness = uniforms.glossinessFactor;\n#if HAS_SPECULARGLOSSINESS_MAP\n let specularGlossiness = textureSample(specularGlossinessTexture, specularGlossinessTextureSampler, uv);\n materialUniforms.specularColor *= sRGBToLinear(specularGlossiness.rgb);\n materialUniforms.glossiness *= specularGlossiness.a;\n#endif\n#endif\n return materialUniforms;\n}\nfn HDR_ACES(x: vec3f) -> vec3f {\n const a = 2.51;\n const b = 0.03;\n const c = 2.43;\n const d = 0.59;\n const e = 0.14;\n return (x * (a * x + b)) / (x * (c * x + d) + e);\n}\nfn tonemap(color: vec3f) -> vec3f {\n let tonemapped = HDR_ACES(color);\n return pow(tonemapped, vec3f(1.0/2.2));\n}\nfn normalFiltering(roughness: f32, worldNormal: vec3f) -> f32 {\n let du = dpdx(worldNormal);\n let dv = dpdy(worldNormal);\n let variance = uniforms.specularAAVariance * (dot(du, du) + dot(dv, dv));\n let kernelRoughness = min(2.0 * variance, uniforms.specularAAThreshold);\n let squareRoughness = saturate(roughness * roughness + kernelRoughness);\n return sqrt(squareRoughness);\n}\n#if HAS_SSR\n fn ssrViewToScreen(projection: mat4x4f, viewVertex: vec3f) -> vec3f {\n let projected = projection * vec4f(viewVertex, 1.0);\n return vec3f(0.5 + 0.5 * projected.xy / projected.w, projected.w);\n }\n fn fetchColorLod(level: f32, uv: vec2f) -> vec3f {\n return textureSampleLevel(TextureReflected, TextureReflectedSampler, uv, level).rgb;\n }\n fn linearizeDepth(depth: f32) -> f32 {\n let projection = uniforms.projMatrix;\n let z = depth * 2.0 - 1.0; return -projection[3].z / (z + projection[2].z);\n }\n fn fetchDepth(uv: vec2f) -> f32 {\n let depth = decodeDepth(textureSample(TextureDepth, TextureDepthSampler, uv));\n return depth;\n }\n fn interleavedGradientNoise(fragCoord: vec2f, frameMod: f32) -> f32 {\n let magic = vec3f(0.06711056, 0.00583715, 52.9829189);\n return fract(magic.z * fract(dot(fragCoord.xy + frameMod * vec2f(47.0, 17.0) * 0.695, magic.xy))) * 0.5;\n }\n fn importanceSampling(\n frameMod: f32,\n tangentX: vec3f,\n tangentY: vec3f,\n tangentZ: vec3f,\n eyeVector: vec3f,\n rough4: f32\n ) -> vec3f {\n var E: vec2f;\n E.x = interleavedGradientNoise(fragCoord.yx, frameMod);\n E.y = fract(E.x * 52.9829189);\n E.y = mix(E.y, 1.0, 0.7);\n let phi = 2.0 * 3.14159 * E.x;\n let cosTheta = pow(max(E.y, 0.000001), rough4 / (2.0 - rough4));\n let sinTheta = sqrt(1.0 - cosTheta * cosTheta);\n var h = vec3f(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta);\n h = h.x * tangentX + h.y * tangentY + h.z * tangentZ;\n return normalize((2.0 * dot(eyeVector, h)) * h - eyeVector);\n }\n fn getStepOffset(frameMod: f32) -> f32 {\n return (interleavedGradientNoise(fragCoord.xy, frameMod) - 0.5);\n }\n fn computeRayDirUV(rayOriginUV: vec3f, rayLen: f32, rayDirView: vec3f) -> vec3f {\n let rayDirUV = ssrViewToScreen(uniforms.projMatrix, vViewVertex.xyz + rayDirView * rayLen);\n rayDirUV.z = 1.0 / rayDirUV.z;\n rayDirUV -= rayOriginUV;\n let scaleMaxX = min(1.0, 0.99 * (1.0 - rayOriginUV.x) / max(1e-5, rayDirUV.x));\n let scaleMaxY = min(1.0, 0.99 * (1.0 - rayOriginUV.y) / max(1e-5, rayDirUV.y));\n let scaleMinX = min(1.0, 0.99 * rayOriginUV.x / max(1e-5, -rayDirUV.x));\n let scaleMinY = min(1.0, 0.99 * rayOriginUV.y / max(1e-5, -rayDirUV.y));\n return rayDirUV * min(scaleMaxX, scaleMaxY) * min(scaleMinX, scaleMinY);\n }\n fn binarySearch(rayOriginUV: vec3f, rayDirUV: vec3f, startSteps: ptr<function, f32>, endSteps: ptr<function, f32>) -> f32 {\n let steps = (*startSteps + *endSteps) * 0.5;\n let sampleUV = rayOriginUV + rayDirUV * steps;\n let z = fetchDepth(sampleUV.xy);\n let depth = linearizeDepth(z);\n let sampleDepth = -1.0 / sampleUV.z;\n *startSteps = select(steps, *startSteps, depth > sampleDepth);\n *endSteps = select(*endSteps, steps, depth > sampleDepth);\n return steps;\n }\n fn rayTrace(\n rayOriginUV: vec3f,\n rayLen: f32,\n depthTolerance: f32,\n rayDirView: vec3f,\n roughness: f32,\n frameMod: f32\n ) -> vec4f {\n let checkSteps = 20;\n let invNumSteps = 1.0 / f32(checkSteps);\n depthTolerance *= invNumSteps;\n let rayDirUV = computeRayDirUV(rayOriginUV, rayLen, rayDirView);\n let sampleTime = invNumSteps;\n var diffSampleW = vec3f(0.0, sampleTime, 1.0);\n var sampleUV: vec3f;\n var hit = false;\n var hitDepth = 1.0;\n var steps: f32;\n for (var i = 0; i < checkSteps; i++) {\n sampleUV = rayOriginUV + rayDirUV * diffSampleW.y;\n let z = fetchDepth(sampleUV.xy);\n let depth = linearizeDepth(z);\n let sampleDepth = -1.0 / sampleUV.z;\n let validDepth = clamp(sign(0.999 - z), 0.0, 1.0);\n var depthDiff = validDepth * (sampleDepth - depth);\n depthDiff *= clamp(sign(abs(depthDiff) - rayLen * invNumSteps * invNumSteps), 0.0, 1.0);\n hit = abs(depthDiff + depthTolerance) < depthTolerance;\n let timeLerp = clamp(diffSampleW.x / (diffSampleW.x - depthDiff), 0.0, 1.0);\n let hitTime = select(1.0, (diffSampleW.y + timeLerp * invNumSteps - invNumSteps), hit);\n diffSampleW.z = min(diffSampleW.z, hitTime);\n diffSampleW.x = depthDiff;\n if (hit) {\n var startSteps = diffSampleW.y - invNumSteps;\n var endSteps = diffSampleW.y;\n steps = binarySearch(rayOriginUV, rayDirUV, &startSteps, &endSteps);\n steps = binarySearch(rayOriginUV, rayDirUV, &startSteps, &endSteps);\n steps = binarySearch(rayOriginUV, rayDirUV, &startSteps, &endSteps);\n hitDepth = steps;\n break;\n }\n diffSampleW.y += invNumSteps;\n }\n return vec4f(rayOriginUV + rayDirUV * hitDepth, 1.0 - hitDepth);\n }\n fn fetchColorInRay(\n resRay: vec4f,\n maskSsr: f32,\n specularEnvironment: vec3f,\n specularColor: vec3f,\n roughness: f32\n ) -> vec4f {\n let AB = mix(uniforms.outputFovInfo[0], uniforms.outputFovInfo[1], resRay.x);\n resRay.xyz = vec3f(mix(AB.xy, AB.zw, resRay.y), 1.0) * -1.0 / resRay.z;\n resRay.xyz = (uniforms.reprojViewProjMatrix * vec4f(resRay.xyz, 1.0)).xyw;\n resRay.xy /= resRay.z;\n let maskEdge = clamp(6.0 - 6.0 * max(abs(resRay.x), abs(resRay.y)), 0.0, 1.0);\n resRay.xy = 0.5 + 0.5 * resRay.xy;\n let fetchColor = specularColor * fetchColorLod(roughness * (1.0 - resRay.w), resRay.xy);\n return vec4f(mix(specularEnvironment, fetchColor, maskSsr * maskEdge), 1.0);\n }\n fn ssr(\n specularEnvironment: vec3f,\n specularColor: vec3f,\n roughness: f32,\n normal: vec3f,\n eyeVector: vec3f\n ) -> vec3f {\n let taaSS = 0.0;\n var result = vec4f(0.0);\n var rough4 = roughness * roughness;\n rough4 = rough4 * rough4;\n let upVector = select(vec3f(1.0, 0.0, 0.0), vec3f(0.0, 0.0, 1.0), abs(normal.z) < 0.999);\n let tangentX = normalize(cross(upVector, normal));\n let tangentY = cross(normal, tangentX);\n var maskSsr = shaderUniforms.ssrFactor * clamp(-4.0 * dot(eyeVector, normal) + 3.8, 0.0, 1.0);\n maskSsr *= clamp(4.7 - roughness * 5.0, 0.0, 1.0);\n let rayOriginUV = ssrViewToScreen(shaderUniforms.projMatrix, vViewVertex.xyz);\n rayOriginUV.z = 1.0 / rayOriginUV.z;\n let rayDirView = importanceSampling(taaSS, tangentX, tangentY, normal, eyeVector, rough4);\n let rayLen = mix(shaderUniforms.cameraNearFar.y + vViewVertex.z, -vViewVertex.z - shaderUniforms.cameraNearFar.x, rayDirView.z * 0.5 + 0.5);\n let depthTolerance = 0.5 * rayLen;\n var resRay: vec4f;\n if (dot(rayDirView, normal) > 0.001 && maskSsr > 0.0) {\n resRay = rayTrace(rayOriginUV, rayLen, depthTolerance, rayDirView, roughness, taaSS);\n if (resRay.w > 0.0) {\n result += fetchColorInRay(resRay, maskSsr, specularEnvironment, specularColor, roughness);\n }\n }\n return select(specularEnvironment, result.rgb / result.w, result.w > 0.0);\n }\n#endif\nfn sRGBTransferOETF(value: vec4f) -> vec4f {\n let isLow: vec3<bool> = value.rgb <= vec3f(0.0031308);\n let highPart: vec3f = pow(value.rgb, vec3f(0.41666)) * 1.055 - vec3f(0.055);\n let lowPart: vec3f = value.rgb * 12.92;\n let rgb: vec3f = select(highPart, lowPart, isLow);\n return vec4f(rgb, value.a);\n}\nfn linearToOutputTexel(value: vec4f) -> vec4f {\n return sRGBTransferOETF(value);\n}\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n materialUniforms = initMaterial(vertexOutput);\n var glFragColor: vec4f;\n let eyeVector = normalize(shaderUniforms.cameraPosition - vertexOutput.vModelVertex);\n #if HAS_DOUBLE_SIDE\n let frontNormal = select(-normalize(vertexOutput.vModelNormal), normalize(vertexOutput.vModelNormal), gl_FrontFacing);\n #else\n let frontNormal = normalize(vertexOutput.vModelNormal);\n #endif\n let f0 = 0.08 * uniforms.specularF0;\n let metal = getMaterialMetalness();\n var materialDiffuse = getMaterialAlbedo();\n #if SHADING_MODEL_SPECULAR_GLOSSINESS\n let materialSpecular = materialUniforms.specularColor;\n #else\n let materialSpecular = mix(vec3f(f0), materialDiffuse, metal);\n #endif\n materialDiffuse *= 1.0 - metal;\n let materialF90 = clamp(50.0 * materialSpecular.g, 0.0, 1.0);\n var materialRoughness = getMaterialRoughness();\n if (uniforms.specularAAVariance > 0.0) {\n materialRoughness = normalFiltering(materialRoughness, frontNormal);\n }\n let materialEmit = getMaterialEmitColor();\n var materialNormal = getMaterialNormalMap();\n #if HAS_TANGENT\n #if HAS_NORMAL_MAP || HAS_TERRAIN_NORMAL\n materialNormal = transformNormal(uniforms.normalMapFactor, materialNormal, vertexOutput.vModelTangent.xyz, vertexOutput.vModelBiTangent, frontNormal);\n #endif\n #endif\n var diffuse = vec3f(0.0);\n var specular = vec3f(0.0);\n #if HAS_IBL_LIGHTING\n diffuse = materialDiffuse * computeDiffuseSPH(materialNormal) * 0.5;\n #else\n diffuse = materialDiffuse * shaderUniforms.ambientColor;\n #endif\n let NoV = dot(materialNormal, eyeVector);\n specular = computeIBLSpecular(materialNormal, eyeVector, NoV, materialRoughness, materialSpecular, frontNormal, materialF90, materialDiffuse);\n #ifdef MESH_ENV_EXPO\n let environmentExposure = materialUniforms.environmentExposure;\n #else\n let environmentExposure = shaderUniforms.environmentExposure;\n #endif\n var specularAO = 1.0;\n let materialAO = getMaterialOcclusion();\n diffuse *= environmentExposure * materialAO;\n #if HAS_IBL_LIGHTING\n specularAO = computeSpecularAO(materialAO, NoV);\n #endif\n #if HAS_SSR\n var ssrfrontNormal = normalize(select(-vertexOutput.vViewNormal, vertexOutput.vViewNormal, gl_FrontFacing));\n var viewNormal = ssrfrontNormal;\n #if HAS_TANGENT\n #if HAS_NORMAL_MAP || HAS_TERRAIN_NORMAL\n var ssrTangent = select(-vertexOutput.vViewTangent, vertexOutput.vViewTangent, gl_FrontFacing);\n ssrTangent.xyz = normalize(ssrTangent.xyz);\n let ssrBinormal = normalize(cross(ssrfrontNormal, ssrTangent.xyz)) * ssrTangent.w;\n viewNormal = transformNormal(uniforms.normalMapFactor, materialNormal, ssrTangent.xyz, ssrBinormal, ssrfrontNormal);\n #endif\n #endif\n specular = ssr(specular, materialSpecular * specularAO, materialRoughness, viewNormal, -normalize(vertexOutput.vViewVertex.xyz));\n #endif\n specular *= environmentExposure * specularAO;\n let modelNormal = vertexOutput.vModelNormal;\n let lightDir = -shaderUniforms.light0_viewDirection;\n let dotNL = saturate(dot(lightDir, materialNormal));\n let lambertResult = computeLambert(materialNormal, eyeVector, dotNL, max(0.045, materialRoughness), materialDiffuse, materialSpecular, shaderUniforms.light0_diffuse.rgb, lightDir, materialF90);\n var ambientDiffuse = lambertResult.diffuse;\n var ambientSpecular = lambertResult.specular;\n #if HAS_SHADOWING && !HAS_BLOOM\n let shadowCoeff = shadow_computeShadow(vertexOutput);\n ambientDiffuse = shadow_blend(ambientDiffuse, shadowCoeff).rgb;\n ambientSpecular = shadow_blend(ambientSpecular, shadowCoeff).rgb;\n #endif\n diffuse += ambientDiffuse;\n specular += ambientSpecular;\n diffuse += materialEmit;\n var frag = specular + diffuse;\n if (uniforms.outputSRGB == 1.0) {\n frag = linearTosRGB(frag);\n }\n #if HAS_SKIN_MAP\n let skinColor = getMaterialSkinColor();\n frag = frag.rgb * (1.0 - skinColor.a) + skinColor.rgb * skinColor.a;\n #if HAS_SHADOWING && !HAS_BLOOM\n frag = shadow_blend(rgb, shadowCoeff).rgb;\n #endif\n #endif\n var alpha = getMaterialAlpha();\n if (alpha < uniforms.alphaTest) {\n discard;\n }\n #if ALPHA_MODE\n #if ALPHA_MODE == 1\n if (alpha < uniforms.alphaCutoff) {\n discard;\n } else {\n alpha = 1.0;\n }\n #else\n alpha = 1.0;\n #endif\n #endif\n #if IS_LINE_EXTRUSION\n alpha *= uniforms.lineOpacity;\n #else\n alpha *= uniforms.polygonOpacity;\n #endif\n glFragColor = vec4f(frag * alpha, alpha);\n #ifdef HAS_VERTEX_COLOR\n glFragColor *= vertexColor_get(vertexOutput);\n #endif\n #ifdef HAS_EXCAVATE_ANALYSIS\n glFragColor = excavateColor(glFragColor);\n #endif\n #ifdef HAS_SNOW\n let snowColor = snow(glFragColor, getMaterialNormalMap(), 1.0);\n glFragColor = vec4f(snowColor, glFragColor.a);\n #endif\n if (uniforms.contrast != 1.0) {\n glFragColor = contrastMatrix(uniforms.contrast) * glFragColor;\n }\n if (length(uniforms.hsv) > 0.0) {\n glFragColor = hsv_apply4(glFragColor, uniforms.hsv);\n }\n #ifdef OUTPUT_NORMAL\n glFragColor = vec4f(frontNormal, 1.0);\n #endif\n #if HAS_HIGHLIGHT_OPACITY || HAS_HIGHLIGHT_COLOR\n glFragColor = highlight_blendColor(glFragColor, vertexOutput);\n #endif\n #ifdef HAS_LAYER_OPACITY\n glFragColor *= shaderUniforms.layerOpacity;\n #endif\n #ifdef HAS_MASK_EXTENT\n glFragColor = setMask(glFragColor);\n #endif\n return glFragColor;\n}";
|
|
65
|
+
var glStandardFrag = "#include <hsv_frag>\n#include <srgb_frag>\n#include <highlight_frag>\n#include <snow_frag>\n#include <mask_frag>\n#include <terrain_normal_frag>\n#include <vertex_color_frag>\n#include <excavate_frag>\n#include <compute_texcoord_frag>\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\n#define PI 3.141593\n#define RECIPROCAL_PI 1.0\nstruct MaterialUniforms {\n roughnessMetalness: vec2f,\n albedo: vec3f,\n alpha: f32,\n normal: vec3f,\n emit: vec3f,\n ao: f32,\n specularColor: vec3f,\n glossiness: f32,\n skinColor: vec4f,\n #ifdef MESH_ENV_EXPO\n environmentExposure: f32,\n #endif\n};\nvar<private> materialUniforms: MaterialUniforms;\nstruct SceneUniforms {\n alphaTest: f32,\n emissiveFactor: vec3f,\n baseColorFactor: vec4f,\n baseColorIntensity: f32,\n emitColorFactor: f32,\n occlusionFactor: f32,\n roughnessFactor: f32,\n metallicFactor: f32,\n normalMapFactor: f32,\n specularF0: f32,\n emitMultiplicative: f32,\n normalMapFlipY: f32,\n outputSRGB: f32,\n contrast: f32,\n hsv: vec3f,\n specularAAVariance: f32,\n specularAAThreshold: f32,\n #if HAS_SSR\n invProjMatrix: mat4x4f,\n outputFovInfo: array<vec4f, 2>,\n reprojViewProjMatrix: mat4x4f,\n #endif\n #ifndef HAS_COLOR\n #ifdef IS_LINE_EXTRUSION\n lineColor: vec4f,\n #else\n polygonFill: vec4f,\n #endif\n #endif\n #ifdef HAS_PATTERN\n #ifndef HAS_PATTERN_ANIM\n linePatternAnimSpeed: f32,\n #endif\n #ifndef HAS_PATTERN_GAP\n linePatternGap: f32,\n #endif\n linePatternGapColor: vec4f,\n flipY: f32,\n animSpeedScale: f32,\n uvScale: vec2f,\n atlasSize: vec2f,\n #endif\n #ifdef IS_LINE_EXTRUSION\n lineOpacity: f32,\n #else\n polygonOpacity: f32,\n #endif\n};\nstruct ShaderUniforms {\n #if HAS_IBL_LIGHTING\n hdrHSV: vec3f,\n diffuseSPH: array<vec3f, 9>,\n prefilterMiplevel: vec2f,\n prefilterSize: vec2f,\n #else\n ambientColor: vec3f,\n #endif\n cameraPosition: vec3f,\n cameraNearFar: vec2f,\n #ifndef MESH_ENV_EXPO\n environmentExposure: f32,\n #endif\n environmentTransform: mat3x3f,\n light0_viewDirection: vec3f,\n light0_diffuse: vec4f,\n #if HAS_LAYER_OPACITY\n layerOpacity: f32,\n #endif\n #if HAS_SSR\n outSize: vec2f,\n ssrFactor: f32,\n ssrQuality: f32,\n projMatrix: mat4x4f,\n #endif\n #ifdef HAS_PATTERN\n currentTime: f32,\n #endif\n}\n@group(0) @binding($b) var<uniform> uniforms: SceneUniforms;\n@group(0) @binding($b) var<uniform> shaderUniforms: ShaderUniforms;\n#if HAS_ALBEDO_MAP\n @group(0) @binding($b) var baseColorTexture: texture_2d<f32>;\n @group(0) @binding($b) var baseColorTextureSampler: sampler;\n#endif\n#if HAS_METALLICROUGHNESS_MAP\n @group(0) @binding($b) var metallicRoughnessTexture: texture_2d<f32>;\n @group(0) @binding($b) var metallicRoughnessTextureSampler: sampler;\n#endif\n#if HAS_EMISSIVE_MAP\n @group(0) @binding($b) var emissiveTexture: texture_2d<f32>;\n @group(0) @binding($b) var emissiveTextureSampler: sampler;\n#endif\n#if HAS_AO_MAP\n @group(0) @binding($b) var occlusionTexture: texture_2d<f32>;\n @group(0) @binding($b) var occlusionTextureSampler: sampler;\n#endif\n#if HAS_NORMAL_MAP && HAS_TANGENT\n @group(0) @binding($b) var normalTexture: texture_2d<f32>;\n @group(0) @binding($b) var normalTextureSampler: sampler;\n#endif\n#if HAS_SKIN_MAP\n @group(0) @binding($b) var skinTexture: texture_2d<f32>;\n @group(0) @binding($b) var skinTextureSampler: sampler;\n#endif\n#if HAS_RANDOM_TEX\n @group(0) @binding($b) var noiseTexture: texture_2d<f32>;\n @group(0) @binding($b) var noiseTextureSampler: sampler;\n#endif\n@group(0) @binding($b) var brdfLUT: texture_2d<f32>;\n@group(0) @binding($b) var brdfLUTSampler: sampler;\n#if HAS_IBL_LIGHTING\n @group(0) @binding($b) var prefilterMap: texture_cube<f32>;\n @group(0) @binding($b) var prefilterMapSampler: sampler;\n#endif\n#if HAS_SSR\n @group(0) @binding($b) var TextureDepth: texture_2d<f32>;\n @group(0) @binding($b) var TextureDepthSampler: sampler;\n @group(0) @binding($b) var TextureReflected: texture_2d<f32>;\n @group(0) @binding($b) var TextureReflectedSampler: sampler;\n#endif\n#if HAS_BUMP_MAP && HAS_TANGENT\n @group(0) @binding($b) var bumpTexture: texture_2d<f32>;\n @group(0) @binding($b) var bumpSampler: sampler;\n#endif\n#if HAS_PATTERN\n @group(0) @binding($b) var linePatternFile: texture_2d<f32>;\n @group(0) @binding($b) var linePatternFileSampler: sampler;\n#endif\nfn sum(v: vec3f) -> f32 {\n return v.x + v.y + v.z;\n}\nfn fetchTexture(tex: texture_2d<f32>, tex_sampler: sampler, uv: vec2f) -> vec4f {\n#ifdef HAS_RANDOM_TEX\n let origin = uniforms.uvOrigin; let uv1 = uv + origin - (origin % vec2f(1.0));\n let randomSeed = textureSample(noiseTexture, noiseSampler, 0.005 * uv1).x;\n let duvdx = dpdx(uv1);\n let duvdy = dpdy(uv1);\n let seed = randomSeed * 8.0;\n var seedFract = fract(seed);\n let seedDigit = floor(seed);\n let seedDigitPlusOne = seedDigit + 1.0;\n let offa = sin(vec2f(3.0, 7.0) * seedDigit);\n let offb = sin(vec2f(3.0, 7.0) * seedDigitPlusOne);\n let velocity = 0.5;\n let cola = textureSampleGrad(tex, tex_sampler, uv + velocity * offa, duvdx, duvdy);\n let colb = textureSampleGrad(tex, tex_sampler, uv + velocity * offb, duvdx, duvdy);\n let diffSum = sum(cola.rgb - colb.rgb);\n let t = smoothstep(0.2, 0.8, seedFract - 0.1 * diffSum);\n return mix(cola, colb, t);\n#else\n return textureSample(tex, tex_sampler, uv);\n#endif\n}\nfn getMaterialAlbedo() -> vec3f {\n return materialUniforms.albedo;\n}\nfn getMaterialAlpha() -> f32 {\n return materialUniforms.alpha;\n}\nfn getMaterialMetalness() -> f32 {\n return materialUniforms.roughnessMetalness.y;\n}\nfn getMaterialRoughness() -> f32 {\n #if SHADING_MODEL_SPECULAR_GLOSSINESS\n return 1.0 - materialUniforms.glossiness;\n #else\n return materialUniforms.roughnessMetalness.x;\n #endif\n}\nfn getMaterialEmitColor() -> vec3f {\n return materialUniforms.emit;\n}\nfn getMaterialSkinColor() -> vec4f {\n return materialUniforms.skinColor;\n}\nfn getMaterialNormalMap() -> vec3f {\n return materialUniforms.normal;\n}\nfn getMaterialOcclusion() -> f32 {\n return materialUniforms.ao;\n}\nfn decodeDepth(pack: vec4f) -> f32 {\n return pack.r + pack.g / 255.0;\n}\nfn transformNormal(factor: f32, normalToTransform: vec3f, t: vec3f, b: vec3f, n: vec3f) -> vec3f {\n let normal = vec3f(normalToTransform.xy * factor, normalToTransform.z);\n let tbn = mat3x3f(t, b, n);\n return normalize(tbn * normal);\n}\nfn D_GGX(roughness: f32, normal: vec3f, H: vec3f) -> f32 {\n let NoH = clamp(dot(normal, H), 0.0, 1.0);\n let a = roughness * roughness;\n let a2 = a * a;\n let d = (NoH * a2 - NoH) * NoH + 1.0;\n return a2 / ( PI * d * d);\n}\nfn F_Schlick(f0: vec3f, f90: f32, L: vec3f, H: vec3f) -> vec3f {\n var VoH = clamp(dot(L, H), 0.0, 1.0);\n VoH = pow(1.0 - VoH, 5.0);\n return f90 * VoH + (1.0 - VoH) * f0;\n}\nfn V_SmithGGXCorrelated(normal: vec3f, V: vec3f, roughness: f32, NoL: f32) -> f32 {\n let NoV = clamp(dot(normal, V), 0.0, 1.0);\n let a = roughness * roughness;\n let GGXL = NoV * (NoL * (1.0 - a) + a);\n let GGXV = NoL * (NoV * (1.0 - a) + a);\n return 0.5 / (GGXV + GGXL);\n}\nfn computeSpecularBRDF(roughness: f32, normal: vec3f, V: vec3f, L: vec3f, specular: vec3f, NoL: f32, f90: f32) -> vec3f {\n let H = normalize(V + L);\n let D = D_GGX(roughness, normal, H);\n let V_S = V_SmithGGXCorrelated(normal, V, roughness, NoL);\n let F = F_Schlick(specular, f90, L, H);\n return (D * V_S * PI) * F;\n}\nfn BRDF_Lambert(diffuseColor: vec3f) -> vec3f {\n return RECIPROCAL_PI * diffuseColor;\n}\nstruct LambertLight {\n diffuse: vec3f,\n specular: vec3f\n}\nfn computeLambert(\n normal: vec3f,\n V: vec3f,\n NoL: f32,\n roughness: f32,\n materialDiffuse: vec3f,\n specular: vec3f,\n lightColor: vec3f,\n L: vec3f,\n f90: f32\n) -> LambertLight {\n var lambert: LambertLight;\n if (NoL <= 0.0) {\n lambert.diffuse = vec3f(0.0);\n lambert.specular = vec3f(0.0);\n return lambert;\n }\n let a = NoL * lightColor;\n let brdf = computeSpecularBRDF(roughness, normal, V, L, specular, NoL, f90);\n lambert.specular = a * brdf;\n lambert.diffuse = a * BRDF_Lambert(materialDiffuse);\n return lambert;\n}\n#if HAS_IBL_LIGHTING\n fn computeDiffuseSPH(normal: vec3f) -> vec3f {\n let n = shaderUniforms.environmentTransform * normal;\n let diffuseSPH = shaderUniforms.diffuseSPH;\n let x = n.x;\n let y = n.y;\n let z = n.z;\n let result = (\n diffuseSPH[0] +\n diffuseSPH[1] * x +\n diffuseSPH[2] * y +\n diffuseSPH[3] * z +\n diffuseSPH[4] * z * x +\n diffuseSPH[5] * y * z +\n diffuseSPH[6] * y * x +\n diffuseSPH[7] * (3.0 * z * z - 1.0) +\n diffuseSPH[8] * (x*x - y*y)\n );\n if (length(shaderUniforms.hdrHSV) > 0.0) {\n return hsv_apply3(result, shaderUniforms.hdrHSV);\n }\n return max(result, vec3f(0.0));\n }\n fn fetchEnvMap(roughness: f32, R: vec3f) -> vec3f {\n let dir = R;\n let maxLevels = shaderUniforms.prefilterMiplevel.x;\n let lod = min(maxLevels, roughness * shaderUniforms.prefilterMiplevel.y);\n var envLight = textureSampleLevel(prefilterMap, prefilterMapSampler, dir, lod).rgb;\n if (length(shaderUniforms.hdrHSV) > 0.0) {\n envLight = hsv_apply3(envLight, shaderUniforms.hdrHSV);\n }\n return envLight;\n }\n fn getIBLEnvMap(N: vec3f, V: vec3f, roughness: f32, frontNormal: vec3f, materialDiffuse: vec3f) -> vec3f {\n let smoothness = 1.0 - roughness;\n let R = mix(N, reflect(-V, N), smoothness * (sqrt(smoothness) + roughness));\n let factor = clamp(1.0 + dot(R, frontNormal), 0.0, 1.0);\n let prefilteredEnvColor = fetchEnvMap(roughness, shaderUniforms.environmentTransform * R) * factor * factor;\n return prefilteredEnvColor;\n }\n#else\n fn getIBLEnvMap(normal: vec3f, eyeVector: vec3f, roughness: f32, frontNormal: vec3f, materialDiffuse: vec3f) -> vec3f {\n return shaderUniforms.ambientColor * BRDF_Lambert(materialDiffuse);\n }\n#endif\nfn computeBRDF(spec: vec3f, roughness: f32, NoV: f32, f90: f32) -> vec3f {\n let rgba = fetchTexture(brdfLUT, brdfLUTSampler, vec2f(NoV, roughness)) * vec4f(255.0, 65280.0, 255.0, 65280.0);\n let b = (rgba[3] + rgba[2]);\n let a = (rgba[1] + rgba[0]);\n return (spec * a + b * f90) / 65535.0;\n}\nfn computeIBLSpecular(\n normal: vec3f,\n eyeVector: vec3f,\n NoV: f32,\n roughness: f32,\n specular: vec3f,\n frontNormal: vec3f,\n f90: f32,\n materialDiffuse: vec3f\n) -> vec3f {\n return getIBLEnvMap(normal, eyeVector, roughness, frontNormal, materialDiffuse) * computeBRDF(specular, roughness, NoV, f90);\n}\nfn computeSpecularAO(ao: f32, NoV: f32) -> f32 {\n let d = NoV + ao;\n return clamp((d * d) - 1.0 + ao, 0.0, 1.0);\n}\n#ifdef HAS_PATTERN\n fn computeUV(input: VertexOutput, texCoord: vec2f) -> vec2f {\n let uv = texCoord % 1.0;\n let uvStart = vec2f(input.vTexInfo.xy);\n let uvSize = vec2f(input.vTexInfo.zw);\n return (uvStart + uv * uvSize) / uniforms.atlasSize;\n }\n#endif\nfn initMaterial(vertexOutput: VertexOutput) -> MaterialUniforms {\n var materialUniforms: MaterialUniforms;\n var uv: vec2f;\n#ifdef HAS_MAP\n uv = computeTexCoord(vertexOutput.vTexCoord, vertexOutput);\n#endif\n#ifdef HAS_UV_FLIP\n uv.y = 1.0 - uv.y;\n#endif\n#if HAS_BUMP_MAP && HAS_TANGENT\n uv = bumpUV(uv, normalize(vertexOutput.vTangentViewPos - vertexOutput.vTangentFragPos));\n#endif\n materialUniforms.albedo = uniforms.baseColorIntensity * uniforms.baseColorFactor.rgb;\n materialUniforms.alpha = uniforms.baseColorFactor.a * vertexOutput.vOpacity;\n#if HAS_PATTERN\n var linesofar = vertexOutput.vLinesofar;\n let uvSize = vertexOutput.vTexInfo.zw;\n#ifdef HAS_PATTERN_GAP\n let myGap = vertexOutput.vLinePatternGap;\n#else\n let myGap = uniforms.linePatternGap;\n#endif\n#ifdef HAS_PATTERN_ANIM\n let myAnimSpeed = vertexOutput.vLinePatternAnimSpeed;\n#else\n let myAnimSpeed = uniforms.linePatternAnimSpeed;\n#endif\n let patternWidth = ceil(uvSize.x * vertexOutput.vPatternHeight / uvSize.y);\n let plusGapWidth = patternWidth * (1.0 + myGap);\n let animSpeed = myAnimSpeed / uniforms.animSpeedScale;\n linesofar += (shaderUniforms.currentTime * -animSpeed * 0.2) % plusGapWidth;\n let patternx = (linesofar / plusGapWidth) % 1.0;\n let patterny = (uniforms.flipY * vertexOutput.vNormalY) % 1.0;\n let texCoord = vec2f(patternx * (1.0 + myGap) * uniforms.uvScale[0], patterny * uniforms.uvScale[1]);\n uv = computeUV(vertexOutput, texCoord);\n var patternColor = fetchTexture(linePatternFile, linePatternFileSampler, uv);\n let inGap = clamp(sign(1.0 / (1.0 + myGap) - patternx) + 0.000001, 0.0, 1.0);\n patternColor = mix(uniforms.linePatternGapColor, patternColor, inGap);\n#ifdef IS_SQUARE_TUBE\n let v = clamp(sign(abs(vertexOutput.vNormalY) - 0.999999), 0.0, 1.0);\n patternColor = mix(patternColor, vec4(1.0), v);\n#endif\n materialUniforms.albedo *= patternColor.rgb;\n materialUniforms.alpha *= patternColor.a;\n#endif\n#if HAS_ALBEDO_MAP\n let baseColor = fetchTexture(baseColorTexture, baseColorTextureSampler, uv);\n materialUniforms.albedo *= sRGBToLinear(baseColor.rgb);\n materialUniforms.alpha *= baseColor.a;\n#endif\n#if HAS_SKIN_MAP\n let skinColorValue = fetchTexture(skinTexture, skinTextureSampler, uv);\n materialUniforms.skinColor = skinColorValue;\n#endif\n#if HAS_COLOR0\n materialUniforms.albedo *= vertexOutput.vColor0.rgb;\n#if COLOR0_SIZE == 4\n materialUniforms.alpha *= vertexOutput.vColor0.a;\n#endif\n#endif\n#if HAS_COLOR\n materialUniforms.albedo *= vertexOutput.vColor.rgb;\n materialUniforms.alpha *= vertexOutput.vColor.a;\n#elif IS_LINE_EXTRUSION\n materialUniforms.albedo *= uniforms.lineColor.rgb;\n materialUniforms.alpha *= uniforms.lineColor.a;\n#else\n materialUniforms.albedo *= uniforms.polygonFill.rgb;\n materialUniforms.alpha *= uniforms.polygonFill.a;\n#endif\n#if HAS_INSTANCE_COLOR\n materialUniforms.albedo *= vertexOutput.vInstanceColor.rgb;\n materialUniforms.alpha *= vertexOutput.vInstanceColor.a;\n#endif\n#if HAS_METALLICROUGHNESS_MAP\n let mrSample = fetchTexture(metallicRoughnessTexture, metallicRoughnessTextureSampler, uv).gb;\n materialUniforms.roughnessMetalness = mrSample * vec2(uniforms.roughnessFactor, uniforms.metallicFactor);\n#else\n materialUniforms.roughnessMetalness = vec2(uniforms.roughnessFactor, uniforms.metallicFactor);\n#endif\n materialUniforms.emit = uniforms.emissiveFactor;\n#if HAS_EMISSIVE_MAP\n if (uniforms.emitMultiplicative == 1.0) {\n materialUniforms.emit *= sRGBToLinear(fetchTexture(emissiveTexture, emissiveTextureSampler, uv).rgb);\n } else {\n materialUniforms.emit += sRGBToLinear(fetchTexture(emissiveTexture, emissiveTextureSampler, uv).rgb);\n }\n#endif\n materialUniforms.emit *= uniforms.emitColorFactor;\n#if HAS_AO_MAP\n let aoTexCoord = computeTexCoord(vertexOutput.vTexCoord1, vertexOutput);\n materialUniforms.ao = fetchTexture(occlusionTexture, occlusionTextureSampler, aoTexCoord).r;\n#else\n materialUniforms.ao = 1.0;\n#endif\n materialUniforms.ao *= uniforms.occlusionFactor;\n#if HAS_NORMAL_MAP && HAS_TANGENT\n var nmap = fetchTexture(normalTexture, normalTextureSampler, uv).xyz * 2.0 - 1.0;\n nmap.y = select(nmap.y, -nmap.y, uniforms.normalMapFlipY == 1.0);\n materialUniforms.normal = nmap;\n#else\n materialUniforms.normal = normalize(vertexOutput.vModelNormal);\n#endif\n#if HAS_TERRAIN_NORMAL && HAS_TANGENT\n var nmap = convertTerrainHeightToNormalMap(uv);\n nmap.y = select(nmap.y, -nmap.y, uniforms.normalMapFlipY == 1.0);\n materialUniforms.normal = nmap;\n#endif\n#if SHADING_MODEL_SPECULAR_GLOSSINESS\n materialUniforms.albedo *= uniforms.diffuseFactor.rgb;\n materialUniforms.alpha *= uniforms.diffuseFactor.a;\n#if HAS_DIFFUSE_MAP\n let diffuse = fetchTexture(diffuseTexture, diffuseTextureSampler, uv);\n materialUniforms.albedo *= sRGBToLinear(diffuse.rgb);\n materialUniforms.alpha *= diffuse.a;\n#endif\n materialUniforms.specularColor = uniforms.specularFactor;\n materialUniforms.glossiness = uniforms.glossinessFactor;\n#if HAS_SPECULARGLOSSINESS_MAP\n let specularGlossiness = fetchTexture(specularGlossinessTexture, specularGlossinessTextureSampler, uv);\n materialUniforms.specularColor *= sRGBToLinear(specularGlossiness.rgb);\n materialUniforms.glossiness *= specularGlossiness.a;\n#endif\n#endif\n return materialUniforms;\n}\nfn HDR_ACES(x: vec3f) -> vec3f {\n const a = 2.51;\n const b = 0.03;\n const c = 2.43;\n const d = 0.59;\n const e = 0.14;\n return (x * (a * x + b)) / (x * (c * x + d) + e);\n}\nfn tonemap(color: vec3f) -> vec3f {\n let tonemapped = HDR_ACES(color);\n return pow(tonemapped, vec3f(1.0/2.2));\n}\nfn normalFiltering(roughness: f32, worldNormal: vec3f) -> f32 {\n let du = dpdx(worldNormal);\n let dv = dpdy(worldNormal);\n let variance = uniforms.specularAAVariance * (dot(du, du) + dot(dv, dv));\n let kernelRoughness = min(2.0 * variance, uniforms.specularAAThreshold);\n let squareRoughness = saturate(roughness * roughness + kernelRoughness);\n return sqrt(squareRoughness);\n}\n#if HAS_SSR\n fn ssrViewToScreen(projection: mat4x4f, viewVertex: vec3f) -> vec3f {\n let projected = projection * vec4f(viewVertex, 1.0);\n return vec3f(0.5 + 0.5 * projected.xy / projected.w, projected.w);\n }\n fn fetchColorLod(level: f32, uv: vec2f) -> vec3f {\n return textureSampleLevel(TextureReflected, TextureReflectedSampler, uv, level).rgb;\n }\n fn linearizeDepth(depth: f32) -> f32 {\n let projection = uniforms.projMatrix;\n let z = depth * 2.0 - 1.0; return -projection[3].z / (z + projection[2].z);\n }\n fn fetchDepth(uv: vec2f) -> f32 {\n let depth = decodeDepth(textureSample(TextureDepth, TextureDepthSampler, uv));\n return depth;\n }\n fn interleavedGradientNoise(fragCoord: vec2f, frameMod: f32) -> f32 {\n let magic = vec3f(0.06711056, 0.00583715, 52.9829189);\n return fract(magic.z * fract(dot(fragCoord.xy + frameMod * vec2f(47.0, 17.0) * 0.695, magic.xy))) * 0.5;\n }\n fn importanceSampling(\n fragCoord: vec2f,\n frameMod: f32,\n tangentX: vec3f,\n tangentY: vec3f,\n tangentZ: vec3f,\n eyeVector: vec3f,\n rough4: f32\n ) -> vec3f {\n var E: vec2f;\n E.x = interleavedGradientNoise(fragCoord.yx, frameMod);\n E.y = fract(E.x * 52.9829189);\n E.y = mix(E.y, 1.0, 0.7);\n let phi = 2.0 * 3.14159 * E.x;\n let cosTheta = pow(max(E.y, 0.000001), rough4 / (2.0 - rough4));\n let sinTheta = sqrt(1.0 - cosTheta * cosTheta);\n var h = vec3f(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta);\n h = h.x * tangentX + h.y * tangentY + h.z * tangentZ;\n return normalize((2.0 * dot(eyeVector, h)) * h - eyeVector);\n }\n fn getStepOffset(frameMod: f32) -> f32 {\n return (interleavedGradientNoise(fragCoord.xy, frameMod) - 0.5);\n }\n fn computeRayDirUV(rayOriginUV: vec3f, rayLen: f32, rayDirView: vec3f) -> vec3f {\n let rayDirUV = ssrViewToScreen(uniforms.projMatrix, vViewVertex.xyz + rayDirView * rayLen);\n rayDirUV.z = 1.0 / rayDirUV.z;\n rayDirUV -= rayOriginUV;\n let scaleMaxX = min(1.0, 0.99 * (1.0 - rayOriginUV.x) / max(1e-5, rayDirUV.x));\n let scaleMaxY = min(1.0, 0.99 * (1.0 - rayOriginUV.y) / max(1e-5, rayDirUV.y));\n let scaleMinX = min(1.0, 0.99 * rayOriginUV.x / max(1e-5, -rayDirUV.x));\n let scaleMinY = min(1.0, 0.99 * rayOriginUV.y / max(1e-5, -rayDirUV.y));\n return rayDirUV * min(scaleMaxX, scaleMaxY) * min(scaleMinX, scaleMinY);\n }\n fn binarySearch(rayOriginUV: vec3f, rayDirUV: vec3f, startSteps: ptr<function, f32>, endSteps: ptr<function, f32>) -> f32 {\n let steps = (*startSteps + *endSteps) * 0.5;\n let sampleUV = rayOriginUV + rayDirUV * steps;\n let z = fetchDepth(sampleUV.xy);\n let depth = linearizeDepth(z);\n let sampleDepth = -1.0 / sampleUV.z;\n *startSteps = select(steps, *startSteps, depth > sampleDepth);\n *endSteps = select(*endSteps, steps, depth > sampleDepth);\n return steps;\n }\n fn rayTrace(\n rayOriginUV: vec3f,\n rayLen: f32,\n depthTolerance: f32,\n rayDirView: vec3f,\n roughness: f32,\n frameMod: f32\n ) -> vec4f {\n let checkSteps = 20;\n let invNumSteps = 1.0 / f32(checkSteps);\n depthTolerance *= invNumSteps;\n let rayDirUV = computeRayDirUV(rayOriginUV, rayLen, rayDirView);\n let sampleTime = invNumSteps;\n var diffSampleW = vec3f(0.0, sampleTime, 1.0);\n var sampleUV: vec3f;\n var hit = false;\n var hitDepth = 1.0;\n var steps: f32;\n for (var i = 0; i < checkSteps; i++) {\n sampleUV = rayOriginUV + rayDirUV * diffSampleW.y;\n let z = fetchDepth(sampleUV.xy);\n let depth = linearizeDepth(z);\n let sampleDepth = -1.0 / sampleUV.z;\n let validDepth = clamp(sign(0.999 - z), 0.0, 1.0);\n var depthDiff = validDepth * (sampleDepth - depth);\n depthDiff *= clamp(sign(abs(depthDiff) - rayLen * invNumSteps * invNumSteps), 0.0, 1.0);\n hit = abs(depthDiff + depthTolerance) < depthTolerance;\n let timeLerp = clamp(diffSampleW.x / (diffSampleW.x - depthDiff), 0.0, 1.0);\n let hitTime = select(1.0, (diffSampleW.y + timeLerp * invNumSteps - invNumSteps), hit);\n diffSampleW.z = min(diffSampleW.z, hitTime);\n diffSampleW.x = depthDiff;\n if (hit) {\n var startSteps = diffSampleW.y - invNumSteps;\n var endSteps = diffSampleW.y;\n steps = binarySearch(rayOriginUV, rayDirUV, &startSteps, &endSteps);\n steps = binarySearch(rayOriginUV, rayDirUV, &startSteps, &endSteps);\n steps = binarySearch(rayOriginUV, rayDirUV, &startSteps, &endSteps);\n hitDepth = steps;\n break;\n }\n diffSampleW.y += invNumSteps;\n }\n return vec4f(rayOriginUV + rayDirUV * hitDepth, 1.0 - hitDepth);\n }\n fn fetchColorInRay(\n resRay: vec4f,\n maskSsr: f32,\n specularEnvironment: vec3f,\n specularColor: vec3f,\n roughness: f32\n ) -> vec4f {\n let AB = mix(uniforms.outputFovInfo[0], uniforms.outputFovInfo[1], resRay.x);\n resRay.xyz = vec3f(mix(AB.xy, AB.zw, resRay.y), 1.0) * -1.0 / resRay.z;\n resRay.xyz = (uniforms.reprojViewProjMatrix * vec4f(resRay.xyz, 1.0)).xyw;\n resRay.xy /= resRay.z;\n let maskEdge = clamp(6.0 - 6.0 * max(abs(resRay.x), abs(resRay.y)), 0.0, 1.0);\n resRay.xy = 0.5 + 0.5 * resRay.xy;\n let fetchColor = specularColor * fetchColorLod(roughness * (1.0 - resRay.w), resRay.xy);\n return vec4f(mix(specularEnvironment, fetchColor, maskSsr * maskEdge), 1.0);\n }\n fn ssr(\n fragCoord: vec2f,\n specularEnvironment: vec3f,\n specularColor: vec3f,\n roughness: f32,\n normal: vec3f,\n eyeVector: vec3f\n ) -> vec3f {\n let taaSS = 0.0;\n var result = vec4f(0.0);\n var rough4 = roughness * roughness;\n rough4 = rough4 * rough4;\n let upVector = select(vec3f(1.0, 0.0, 0.0), vec3f(0.0, 0.0, 1.0), abs(normal.z) < 0.999);\n let tangentX = normalize(cross(upVector, normal));\n let tangentY = cross(normal, tangentX);\n var maskSsr = shaderUniforms.ssrFactor * clamp(-4.0 * dot(eyeVector, normal) + 3.8, 0.0, 1.0);\n maskSsr *= clamp(4.7 - roughness * 5.0, 0.0, 1.0);\n let rayOriginUV = ssrViewToScreen(shaderUniforms.projMatrix, vViewVertex.xyz);\n rayOriginUV.z = 1.0 / rayOriginUV.z;\n let rayDirView = importanceSampling(fragCoord, taaSS, tangentX, tangentY, normal, eyeVector, rough4);\n let rayLen = mix(shaderUniforms.cameraNearFar.y + vViewVertex.z, -vViewVertex.z - shaderUniforms.cameraNearFar.x, rayDirView.z * 0.5 + 0.5);\n let depthTolerance = 0.5 * rayLen;\n var resRay: vec4f;\n if (dot(rayDirView, normal) > 0.001 && maskSsr > 0.0) {\n resRay = rayTrace(rayOriginUV, rayLen, depthTolerance, rayDirView, roughness, taaSS);\n if (resRay.w > 0.0) {\n result += fetchColorInRay(resRay, maskSsr, specularEnvironment, specularColor, roughness);\n }\n }\n return select(specularEnvironment, result.rgb / result.w, result.w > 0.0);\n }\n#endif\nfn sRGBTransferOETF(value: vec4f) -> vec4f {\n let isLow: vec3<bool> = value.rgb <= vec3f(0.0031308);\n let highPart: vec3f = pow(value.rgb, vec3f(0.41666)) * 1.055 - vec3f(0.055);\n let lowPart: vec3f = value.rgb * 12.92;\n let rgb: vec3f = select(highPart, lowPart, isLow);\n return vec4f(rgb, value.a);\n}\nfn linearToOutputTexel(value: vec4f) -> vec4f {\n return sRGBTransferOETF(value);\n}\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n materialUniforms = initMaterial(vertexOutput);\n var glFragColor: vec4f;\n let eyeVector = normalize(shaderUniforms.cameraPosition - vertexOutput.vModelVertex);\n #if HAS_DOUBLE_SIDE\n let frontNormal = select(-normalize(vertexOutput.vModelNormal), normalize(vertexOutput.vModelNormal), gl_FrontFacing);\n #else\n let frontNormal = normalize(vertexOutput.vModelNormal);\n #endif\n let f0 = 0.08 * uniforms.specularF0;\n let metal = getMaterialMetalness();\n var materialDiffuse = getMaterialAlbedo();\n #if SHADING_MODEL_SPECULAR_GLOSSINESS\n let materialSpecular = materialUniforms.specularColor;\n #else\n let materialSpecular = mix(vec3f(f0), materialDiffuse, metal);\n #endif\n materialDiffuse *= 1.0 - metal;\n let materialF90 = clamp(50.0 * materialSpecular.g, 0.0, 1.0);\n var materialRoughness = getMaterialRoughness();\n if (uniforms.specularAAVariance > 0.0) {\n materialRoughness = normalFiltering(materialRoughness, frontNormal);\n }\n let materialEmit = getMaterialEmitColor();\n var materialNormal = getMaterialNormalMap();\n #if HAS_TANGENT\n #if HAS_NORMAL_MAP || HAS_TERRAIN_NORMAL\n materialNormal = transformNormal(uniforms.normalMapFactor, materialNormal, vertexOutput.vModelTangent.xyz, vertexOutput.vModelBiTangent, frontNormal);\n #endif\n #endif\n var diffuse = vec3f(0.0);\n var specular = vec3f(0.0);\n #if HAS_IBL_LIGHTING\n diffuse = materialDiffuse * computeDiffuseSPH(materialNormal) * 0.5;\n #else\n diffuse = materialDiffuse * shaderUniforms.ambientColor;\n #endif\n let NoV = dot(materialNormal, eyeVector);\n specular = computeIBLSpecular(materialNormal, eyeVector, NoV, materialRoughness, materialSpecular, frontNormal, materialF90, materialDiffuse);\n #ifdef MESH_ENV_EXPO\n let environmentExposure = materialUniforms.environmentExposure;\n #else\n let environmentExposure = shaderUniforms.environmentExposure;\n #endif\n var specularAO = 1.0;\n let materialAO = getMaterialOcclusion();\n diffuse *= environmentExposure * materialAO;\n #if HAS_IBL_LIGHTING\n specularAO = computeSpecularAO(materialAO, NoV);\n #endif\n #if HAS_SSR\n var ssrfrontNormal = normalize(select(-vertexOutput.vViewNormal, vertexOutput.vViewNormal, gl_FrontFacing));\n var viewNormal = ssrfrontNormal;\n #if HAS_TANGENT\n #if HAS_NORMAL_MAP || HAS_TERRAIN_NORMAL\n var ssrTangent = select(-vertexOutput.vViewTangent, vertexOutput.vViewTangent, gl_FrontFacing);\n ssrTangent.xyz = normalize(ssrTangent.xyz);\n let ssrBinormal = normalize(cross(ssrfrontNormal, ssrTangent.xyz)) * ssrTangent.w;\n viewNormal = transformNormal(uniforms.normalMapFactor, materialNormal, ssrTangent.xyz, ssrBinormal, ssrfrontNormal);\n #endif\n #endif\n specular = ssr(vertexOutput.position, specular, materialSpecular * specularAO, materialRoughness, viewNormal, -normalize(vertexOutput.vViewVertex.xyz));\n #endif\n specular *= environmentExposure * specularAO;\n let modelNormal = vertexOutput.vModelNormal;\n let lightDir = -shaderUniforms.light0_viewDirection;\n let dotNL = saturate(dot(lightDir, materialNormal));\n let lambertResult = computeLambert(materialNormal, eyeVector, dotNL, max(0.045, materialRoughness), materialDiffuse, materialSpecular, shaderUniforms.light0_diffuse.rgb, lightDir, materialF90);\n var ambientDiffuse = lambertResult.diffuse;\n var ambientSpecular = lambertResult.specular;\n #if HAS_SHADOWING && !HAS_BLOOM\n let shadowCoeff = shadow_computeShadow(vertexOutput);\n ambientDiffuse = shadow_blend(ambientDiffuse, shadowCoeff).rgb;\n ambientSpecular = shadow_blend(ambientSpecular, shadowCoeff).rgb;\n #endif\n diffuse += ambientDiffuse;\n specular += ambientSpecular;\n diffuse += materialEmit;\n var frag = specular + diffuse;\n if (uniforms.outputSRGB == 1.0) {\n frag = linearTosRGB(frag);\n }\n #if HAS_SKIN_MAP\n let skinColor = getMaterialSkinColor();\n frag = frag.rgb * (1.0 - skinColor.a) + skinColor.rgb * skinColor.a;\n #if HAS_SHADOWING && !HAS_BLOOM\n frag = shadow_blend(rgb, shadowCoeff).rgb;\n #endif\n #endif\n var alpha = getMaterialAlpha();\n if (alpha < uniforms.alphaTest) {\n discard;\n }\n #if ALPHA_MODE\n #if ALPHA_MODE == 1\n if (alpha < uniforms.alphaCutoff) {\n discard;\n } else {\n alpha = 1.0;\n }\n #else\n alpha = 1.0;\n #endif\n #endif\n #if IS_LINE_EXTRUSION\n alpha *= uniforms.lineOpacity;\n #else\n alpha *= uniforms.polygonOpacity;\n #endif\n glFragColor = vec4f(frag * alpha, alpha);\n #ifdef HAS_VERTEX_COLOR\n glFragColor *= vertexColor_get(vertexOutput);\n #endif\n #ifdef HAS_EXCAVATE_ANALYSIS\n glFragColor = excavateColor(glFragColor);\n #endif\n #ifdef HAS_SNOW\n let snowColor = snow(glFragColor, getMaterialNormalMap(), 1.0);\n glFragColor = vec4f(snowColor, glFragColor.a);\n #endif\n if (uniforms.contrast != 1.0) {\n glFragColor = contrastMatrix(uniforms.contrast) * glFragColor;\n }\n if (length(uniforms.hsv) > 0.0) {\n glFragColor = hsv_apply4(glFragColor, uniforms.hsv);\n }\n #ifdef OUTPUT_NORMAL\n glFragColor = vec4f(frontNormal, 1.0);\n #endif\n #if HAS_HIGHLIGHT_OPACITY || HAS_HIGHLIGHT_COLOR\n glFragColor = highlight_blendColor(glFragColor, vertexOutput);\n #endif\n #ifdef HAS_LAYER_OPACITY\n glFragColor *= shaderUniforms.layerOpacity;\n #endif\n #ifdef HAS_MASK_EXTENT\n glFragColor = setMask(glFragColor);\n #endif\n return glFragColor;\n}";
|
|
66
66
|
|
|
67
67
|
var glStandardVert = "#include <highlight_vert>\n#include <line_extrusion_vert>\n#include <get_output>\n#include <vsm_shadow_vert>\n#include <vertex_color_vert>\n#ifdef PICKING_MODE\n #include <fbo_picking_vert>\n#endif\n#include <excavate_vert>\n#include <common_pack_float>\nstruct VertexInput {\n #include <position_vert>\n #if HAS_MAP || HAS_TERRAIN_FLAT_MASK\n #ifdef HAS_DRACO_TEXCOORD\n @location($i) aTexCoord: vec2u,\n #else\n @location($i) aTexCoord: vec2f,\n #endif\n #endif\n #if HAS_MAP\n #ifdef HAS_I3S_UVREGION\n @location($i) uvRegion: vec4f,\n #endif\n #if HAS_AO_MAP\n @location($i) aTexCoord1: vec2f,\n #endif\n #endif\n #if HAS_COLOR\n @location($i) aColor: vec4u,\n #endif\n #ifdef HAS_OPACITY\n @location($i) aOpacity: u32,\n #endif\n #if HAS_COLOR0\n #if COLOR0_SIZE == 3\n @location($i) aColor0: vec3u,\n #else\n @location($i) aColor0: vec4u,\n #endif\n #endif\n #if HAS_TANGENT\n @location($i) aTangent: vec4f,\n #elif HAS_NORMAL\n #ifdef NORMAL_IS_INT\n @location($i) aNormal: vec4i,\n #elif NORMAL_IS_UINT\n @location($i) aNormal: vec4u,\n #else\n @location($i) aNormal: vec3f,\n #endif\n #endif\n}\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n #ifdef HAS_SSR\n @location($o) vViewNormal: vec3f,\n #ifdef HAS_TANGENT\n @location($o) vViewTangent: vec4f,\n #endif\n #endif\n @location($o) vModelNormal: vec3f,\n @location($o) vViewVertex: vec4f,\n #if HAS_TANGENT\n @location($o) vModelTangent: vec4f,\n @location($o) vModelBiTangent: vec3f,\n #endif\n @location($o) vModelVertex: vec3f,\n #if HAS_MAP\n @location($o) vTexCoord: vec2f,\n #ifdef HAS_AO_MAP\n @location($o) vTexCoord1: vec2f,\n #endif\n #ifdef HAS_I3S_UVREGION\n @location($o) vUvRegion: vec4f,\n #endif\n #endif\n #if HAS_COLOR\n @location($o) vColor: vec4f,\n #endif\n @location($o) vOpacity: f32,\n #if HAS_COLOR0\n @location($o) vColor0: vec4f,\n #endif\n #if HAS_BUMP_MAP && HAS_TANGENT\n @location($o) vTangentViewPos: vec3f,\n @location($o) vTangentFragPos: vec3f,\n #endif\n}\nstruct ShaderUniforms {\n cameraPosition: vec3f,\n projMatrix: mat4x4f,\n}\nstruct Uniforms {\n uvOrigin: vec2f,\n uvScale: vec2f,\n uvOffset: vec2f,\n uvRotation: f32,\n modelMatrix: mat4x4f,\n modelViewMatrix: mat4x4f,\n positionMatrix: mat4x4f,\n modelNormalMatrix: mat3x3f,\n #ifdef HAS_SSR\n modelViewNormalMatrix: mat3x3f,\n #endif\n};\n@group(0) @binding($b) var<uniform> uniforms: Uniforms;\n@group(0) @binding($b) var<uniform> shaderUniforms: ShaderUniforms;\nvar<private> Vertex: vec3f;\nvar<private> Normal: vec3f;\nvar<private> Tangent: vec4f;\nconst mid = 0.5;\nfn toTangentFrame(q: vec4f) -> vec3f {\n return vec3f(0.0, 0.0, 1.0) +\n vec3f(2.0, -2.0, -2.0) * q.x * q.zwx +\n vec3f(2.0, 2.0, -2.0) * q.y * q.wzy;\n}\nstruct TangentFrame {\n n: vec3f,\n t: vec3f\n}\nfn toTangentFrameWithTangent(q: vec4f) -> TangentFrame {\n var out: TangentFrame;\n out.n = toTangentFrame(q);\n out.t = vec3f(1.0, 0.0, 0.0) +\n vec3f(-2.0, 2.0, -2.0) * q.y * q.yxw +\n vec3f(-2.0, 2.0, 2.0) * q.z * q.zwx;\n return out;\n}\nfn rotateUV(uv: vec2f, rotation: f32) -> vec2f {\n return vec2f(\n cos(rotation) * (uv.x - mid) + sin(rotation) * (uv.y - mid) + mid,\n cos(rotation) * (uv.y - mid) - sin(rotation) * (uv.x - mid) + mid\n );\n}\n#if HAS_MAP\nfn transformTexcoord(uv: vec2f) -> vec2f {\n let decodedTexCoord = decode_getTexcoord(uv);\n #ifdef HAS_RANDOM_TEX\n let origin = uniforms.uvOrigin;\n let texCoord = decodedTexCoord * uniforms.uvScale + uniforms.uvOffset;\n return (origin % 1.0) + texCoord;\n #else\n var origin = uniforms.uvOrigin;\n var texCoord = decodedTexCoord * uniforms.uvScale;\n if (uniforms.uvRotation != 0.0) {\n origin = rotateUV(origin, uniforms.uvRotation);\n texCoord = rotateUV(texCoord, uniforms.uvRotation);\n }\n return (origin % 1.0) + texCoord + uniforms.uvOffset;\n #endif\n}\n#endif\nfn transposeMat3(inMat: mat3x3f) -> mat3x3f {\n let i0 = inMat[0];\n let i1 = inMat[1];\n let i2 = inMat[2];\n return mat3x3f(\n vec3f(i0.x, i1.x, i2.x),\n vec3f(i0.y, i1.y, i2.y),\n vec3f(i0.z, i1.z, i2.z)\n );\n}\n@vertex\nfn main(input: VertexInput) -> VertexOutput {\n var output: VertexOutput;\n let localPositionMatrix = getPositionMatrix(input, &output, uniforms.positionMatrix);\n #ifdef IS_LINE_EXTRUSION\n let linePosition = getLineExtrudePosition(vec3f(input.aPosition.xyz), input);\n let localVertex = getPosition(linePosition, input);\n #else\n let localVertex = getPosition(vec3f(input.aPosition.xyz), input);\n #endif\n output.vModelVertex = (uniforms.modelMatrix * localVertex).xyz;\n let position = localPositionMatrix * localVertex;\n let viewVertex = uniforms.modelViewMatrix * position;\n output.vViewVertex = viewVertex;\n #ifdef HAS_MASK_EXTENT\n output.position = shaderUniforms.projMatrix * getMaskPosition(position, uniforms.modelMatrix);\n #else\n output.position = shaderUniforms.projMatrix * viewVertex;\n #endif\n #ifdef PICKING_MODE\n var alpha = 1.0;\n #if HAS_COLOR\n alpha *= f32(input.aColor.a);\n #endif\n #if HAS_COLOR0 && COLOR0_SIZE == 4\n alpha *= f32(input.aColor0.a);\n #endif\n fbo_picking_setData(input, &output, output.position.w, alpha != 0.0);\n #else\n #if HAS_MAP\n output.vTexCoord = transformTexcoord(input.aTexCoord.xy);\n #ifdef HAS_AO_MAP\n output.vTexCoord1 = transformTexcoord(input.aTexCoord1);\n #endif\n #ifdef HAS_I3S_UVREGION\n output.vUvRegion = input.uvRegion / 65535.0;\n #endif\n #endif\n #if HAS_TANGENT || HAS_NORMAL\n let positionNormalMatrix = mat3x3f(\n localPositionMatrix[0].xyz,\n localPositionMatrix[1].xyz,\n localPositionMatrix[2].xyz\n );\n let normalMatrix = uniforms.modelNormalMatrix * positionNormalMatrix;\n #if HAS_TANGENT\n let tangentFrame = toTangentFrameWithTangent(input.aTangent);\n Normal = tangentFrame.n;\n let t = tangentFrame.t;\n output.vModelTangent = vec4f(normalMatrix * t, input.aTangent.w);\n #else\n Normal = decode_getNormal(vec3f(input.aNormal.xyz));\n #endif\n let localNormal = Normal;\n output.vModelNormal = normalMatrix * localNormal;\n #else\n Normal = vec3f(0);\n output.vModelNormal = vec3f(0);\n #endif\n #if HAS_TANGENT\n output.vModelBiTangent = cross(output.vModelNormal, output.vModelTangent.xyz) * sign(input.aTangent.w);\n #endif\n #ifdef HAS_SSR\n let ssrNormalMatrix = uniforms.modelViewNormalMatrix * positionNormalMatrix;\n output.vViewNormal = ssrNormalMatrix * Normal;\n #if HAS_TANGENT\n let localTangent = vec4f(t, input.aTangent.w);\n output.vViewTangent = vec4f(ssrNormalMatrix * localTangent.xyz, localTangent.w);\n #endif\n #endif\n #if HAS_COLOR\n output.vColor = vec4f(input.aColor) / 255.0;\n #endif\n #ifdef HAS_OPACITY\n output.vOpacity = f32(input.aOpacity) / 255.0;\n #else\n output.vOpacity = 1.0;\n #endif\n #if HAS_HIGHLIGHT_OPACITY || HAS_HIGHLIGHT_COLOR\n highlight_setVarying(input, &output);\n #endif\n #if HAS_COLOR0\n #if COLOR0_SIZE == 3\n output.vColor0 = vec4f(vec3f(input.aColor0), 255.0) / 255.0;\n #else\n output.vColor0 = vec4f(input.aColor0) / 255.0;\n #endif\n #endif\n #if HAS_SHADOWING && !HAS_BLOOM\n shadow_computeShadowPars(position, &output);\n #endif\n #if HAS_BUMP_MAP && HAS_TANGENT\n let TBN = transposeMat3(mat3x3f(output.vModelTangent.xyz, output.vModelBiTangent, output.vModelNormal));\n output.vTangentViewPos = TBN * shaderUniforms.cameraPosition;\n output.vTangentFragPos = TBN * output.vModelVertex;\n #endif\n #ifdef HAS_VERTEX_COLOR\n vertexColor_update(input, &output);\n #endif\n #ifdef HAS_EXCAVATE_ANALYSIS\n output.vCoordinateTexcoord = getCoordinateTexcoord(position, uniforms.modelMatrix);\n output.vExcavateHeight = getWorldHeight(position, uniforms.modelMatrix);\n #endif\n #endif\n return output;\n}";
|
|
68
68
|
|
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
|
|
137
137
|
var layerVideoVideoVert = "#include <get_output>\nstruct Uniforms {\n modelMatrix: mat4x4f,\n positionMatrix: mat4x4f,\n projViewModelMatrix: mat4x4f,\n};\n@group(0) @binding($b) var<uniform> uniforms: Uniforms;\nstruct VertexInput {\n @location($i) aPosition: vec3f,\n @location($i) aTexCoord: vec2f,\n};\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location($o) vTexCoords: vec2f,\n};\n@vertex\nfn main(vertexInput: VertexInput) -> VertexOutput {\n var output: VertexOutput;\n let localPositionMatrix: mat4x4f = getPositionMatrix(vertexInput, &output, uniforms.positionMatrix);\n let localPosition: vec4f = getPosition(vec3f(vertexInput.aPosition.xyz), vertexInput);\n output.vTexCoords = vertexInput.aTexCoord;\n output.position = uniforms.projViewModelMatrix * localPositionMatrix * localPosition;\n return output;\n}";
|
|
138
138
|
|
|
139
|
-
var vtBillboardFrag = "struct BillboardFragmentUniforms {\n textureSize: vec2f,\n};\n@group(0) @binding($b) var<uniform> uniforms: BillboardFragmentUniforms;\n@group(0) @binding($b) var billTexture: texture_2d<f32>;\n@group(0) @binding($b) var billTextureSampler: sampler;\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n var fragColor: vec4f = textureSample(billTexture, billTextureSampler, vertexOutput.vTexCoord / uniforms.textureSize);\n #if HAS_SHADOWING && !HAS_BLOOM\n let shadowCoeff = shadow_computeShadow();\n fragColor.rgb = shadow_blend(fragColor.rgb, shadowCoeff);\n #endif\n return fragColor;\n}";
|
|
139
|
+
var vtBillboardFrag = "struct BillboardFragmentUniforms {\n textureSize: vec2f,\n};\n@group(0) @binding($b) var<uniform> uniforms: BillboardFragmentUniforms;\n@group(0) @binding($b) var billTexture: texture_2d<f32>;\n@group(0) @binding($b) var billTextureSampler: sampler;\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n var fragColor: vec4f = textureSample(billTexture, billTextureSampler, vertexOutput.vTexCoord / uniforms.textureSize);\n #if HAS_SHADOWING && !HAS_BLOOM\n let shadowCoeff = shadow_computeShadow(vertexOutput);\n fragColor.rgb = shadow_blend(fragColor.rgb, shadowCoeff);\n #endif\n return fragColor;\n}";
|
|
140
140
|
|
|
141
141
|
var vtBillboardVert = "#ifdef HAS_ALTITUDE\n struct VertexInput {\n @location($i) aPosition: vec2i,\n @location($i) aAltitude: f32,\n#else\n struct VertexInput {\n @location($i) aPosition: vec4i,\n#endif\n @location($i) aExtrude: vec2i,\n @location($i) aTexCoord: vec2i,\n @location($i) aQuat: vec4f,\n };\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n @location($o) vTexCoord: vec2f,\n};\nstruct BillboardUniforms {\n positionMatrix: mat4x4f,\n projViewModelMatrix: mat4x4f,\n extrudeScale: f32,\n};\n@group(0) @binding($b) var<uniform> uniforms: BillboardUniforms;\n#ifdef PICKING_MODE\n #include <fbo_picking_vert>\n#endif\n#include <vt_position_vert>\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_vert>\n#endif\nfn quatToMat4(q: vec4f) -> mat4x4f {\n let x = q.x;\n let y = q.y;\n let z = q.z;\n let w = q.w;\n let x2 = x * x;\n let y2 = y * y;\n let z2 = z * z;\n let xy = x * y;\n let xz = x * z;\n let yz = y * z;\n let wx = w * x;\n let wy = w * y;\n let wz = w * z;\n return mat4x4f(\n 1.0 - 2.0 * (y2 + z2), 2.0 * (xy - wz), 2.0 * (xz + wy), 0.0,\n 2.0 * (xy + wz), 1.0 - 2.0 * (x2 + z2), 2.0 * (yz - wx), 0.0,\n 2.0 * (xz - wy), 2.0 * (yz + wx), 1.0 - 2.0 * (x2 + y2), 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n}\n@vertex\nfn main(\n input: VertexInput\n) -> VertexOutput {\n var output: VertexOutput;\n let extrude = vec4f(f32(input.aExtrude.x) * uniforms.extrudeScale, 0.0, f32(input.aExtrude.y), 1.0);\n let rotationMat4 = quatToMat4(input.aQuat);\n let offset = (rotationMat4 * extrude).xyz;\n let position = unpackVTPositionOffset(input, offset);\n output.vTexCoord = vec2f(input.aTexCoord);\n output.position = uniforms.projViewModelMatrix * uniforms.positionMatrix * vec4f(position, 1.0);\n #ifdef PICKING_MODE\n fbo_picking_setData(output.position.w, true);\n #elif HAS_SHADOWING && !HAS_BLOOM\n shadow_computeShadowPars(vec4f(position, 1.0), &output);\n #endif\n return output;\n}";
|
|
142
142
|
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
|
|
151
151
|
var vtFillVert = "#define SHADER_NAME FILL\nstruct VertexInput {\n#ifdef HAS_ALTITUDE\n @location($i) aPosition: POSITION_TYPE_2,\n @location($i) aAltitude: f32,\n#else\n @location($i) aPosition: POSITION_TYPE_3,\n#endif\n#ifdef HAS_COLOR\n @location($i) aColor: vec4u,\n#endif\n#ifdef HAS_OPACITY\n @location($i) aOpacity: u32,\n#endif\n#ifdef HAS_PATTERN\n #ifdef HAS_TEX_COORD\n @location($i) aTexCoord: vec2f,\n #endif\n @location($i) aTexInfo: vec4u,\n #ifdef HAS_UV_SCALE\n @location($i) aUVScale: vec2u,\n #endif\n #ifdef HAS_UV_OFFSET\n @location($i) aUVOffset: vec2u,\n #endif\n #ifdef HAS_PATTERN_WIDTH\n @location($i) aPatternWidth: vec2f,\n #endif\n #ifdef HAS_PATTERN_ORIGIN\n @location($i) aPatternOrigin: vec2f,\n #endif\n #ifdef HAS_PATTERN_OFFSET\n @location($i) aPatternOffset: vec2f,\n #endif\n#endif\n}\nstruct VertexOutput {\n @builtin(position) position : vec4f,\n#ifdef HAS_COLOR\n @location($o) vColor: vec4f,\n#endif\n#ifdef HAS_OPACITY\n @location($o) vOpacity: f32,\n#endif\n#ifdef HAS_PATTERN\n @location($o) vTexCoord: vec2f,\n @location($o) vTexInfo: vec4f,\n #ifdef HAS_UV_SCALE\n @location($o) vUVScale: vec2f,\n #endif\n #ifdef HAS_UV_OFFSET\n @location($o) vUVOffset: vec2f,\n #endif\n#endif\n}\nstruct ModelUniforms {\n projViewModelMatrix: mat4x4f,\n positionMatrix: mat4x4f,\n#ifdef IS_VT\n#else\n modelMatrix: mat4x4f,\n#endif\n#ifdef HAS_PATTERN\n patternWidth: vec2f,\n patternOffset: vec2f,\n uvOrigin: vec2f,\n uvScale: vec2f,\n#ifdef IS_VT\n tileRatio: f32,\n tileScale: f32,\n#endif\n#endif\n};\n#ifdef HAS_PATTERN && IS_VT\n#else\nstruct Uniforms {\n glScale: f32,\n}\n#endif\n@group(0) @binding($b) var<uniform> uniforms: ModelUniforms;\n#ifdef HAS_PATTERN && IS_VT\n#else\n@group(0) @binding($b) var<uniform> shaderUniforms: Uniforms;\n#endif\n#ifdef HAS_PATTERN\n fn computeUV(input: VertexInput, vertex: vec2f, patternWidth: vec2f) -> vec2f {\n #ifdef IS_VT\n let u = vertex.x / patternWidth.x;\n let v = vertex.y / patternWidth.y;\n return vec2f(u, v);\n #else\n let glScale = shaderUniforms.glScale;\n var mapGLScale = glScale;\n #ifdef HAS_PATTERN_WIDTH\n let hasPatternWidth = sign(length(vec2f(input.aPatternWidth)));\n mapGLScale = mix(glScale, 1.0, hasPatternWidth);\n #endif\n var origin = uniforms.uvOrigin;\n #ifdef HAS_PATTERN_ORIGIN\n origin = vec2f(input.aPatternOrigin);\n #endif\n #ifdef HAS_PATTERN_OFFSET\n let myPatternOffset = vec2f(input.aPatternOffset);\n #else\n let myPatternOffset = uniforms.patternOffset;\n #endif\n origin += myPatternOffset;\n let u = (vertex.x - origin.x) * mapGLScale / patternWidth.x;\n let v = (vertex.y - origin.y) * mapGLScale / patternWidth.y;\n return vec2f(u, -v);\n #endif\n }\n fn computeTexCoord(input:VertexInput, localVertex: vec4f, patternSize: vec2f) -> vec2f {\n #ifdef HAS_PATTERN_WIDTH\n let aPatternWidth = vec2f(input.aPatternWidth);\n #endif\n #ifdef IS_VT\n #ifdef HAS_PATTERN_OFFSET\n let myPatternOffset = aPatternOffset;\n #else\n let myPatternOffset = uniforms.patternOffset;\n #endif\n var origin = uniforms.uvOrigin + myPatternOffset;\n #ifdef HAS_PATTERN_ORIGIN\n origin = origin - aPatternOrigin * uniforms.tileScale;\n #endif\n let hasPatternWidth = sign(length(uniforms.patternWidth));\n var myPatternWidth = mix(patternSize, uniforms.patternWidth, hasPatternWidth);\n #ifdef HAS_PATTERN_WIDTH\n myPatternWidth = aPatternWidth;\n #endif\n let originOffset = origin * vec2f(1.0, -1.0) / myPatternWidth;\n return (originOffset % 1.0) + computeUV(input, localVertex.xy * uniforms.tileScale / uniforms.tileRatio, myPatternWidth);\n #else\n var myPatternWidth = patternSize;\n #ifdef HAS_PATTERN_WIDTH\n let hasPatternWidth = sign(length(aPatternWidth));\n myPatternWidth = mix(patternSize, aPatternWidth, hasPatternWidth);\n #endif\n let position = uniforms.modelMatrix * localVertex;\n return computeUV(input, position.xy, myPatternWidth);\n #endif\n }\n#endif\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_vert>\n#endif\n#include <vt_position_vert>\n#include <highlight_vert>\n@vertex\nfn main(vertexInput: VertexInput) -> VertexOutput {\n let myPosition = unpackVTPosition(vertexInput);\n let localVertex = vec4f(myPosition, 1.0);\n var out: VertexOutput;\n var position = uniforms.projViewModelMatrix * uniforms.positionMatrix * localVertex;\n out.position = position;\n #ifdef HAS_PATTERN\n let aTexInfo: vec4f = vec4f(vertexInput.aTexInfo);\n let patternSize = aTexInfo.zw + 1.0;\n out.vTexInfo = vec4f(aTexInfo.xy, patternSize);\n #ifdef HAS_TEX_COORD\n if (vertexInput.aTexCoord.x == INVALID_TEX_COORD) {\n out.vTexCoord = computeTexCoord(vertexInput, localVertex, patternSize);\n } else {\n out.vTexCoord = vertexInput.aTexCoord;\n }\n #else\n out.vTexCoord = computeTexCoord(vertexInput, localVertex, patternSize);\n #endif\n #ifdef HAS_UV_SCALE\n out.vUVScale = vec2f(vertexInput.aUVScale) / 255.0;\n #endif\n #ifdef HAS_UV_OFFSET\n out.vUVOffset = vec2f(vertexInput.aUVOffset) / 255.0;\n #endif\n #endif\n #ifdef HAS_COLOR\n out.vColor = vec4f(vertexInput.aColor) / 255.0;\n #endif\n #if HAS_HIGHLIGHT_COLOR || HAS_HIGHLIGHT_OPACITY\n highlight_setVarying(vertexInput, &out);\n #endif\n #ifdef HAS_OPACITY\n out.vOpacity = f32(vertexInput.aOpacity) / 255.0;\n #endif\n #if HAS_SHADOWING && !HAS_BLOOM\n shadow_computeShadowPars(localVertex, &out);\n #endif\n return out;\n}";
|
|
152
152
|
|
|
153
|
-
var vtLineFrag = "#define DEVICE_PIXEL_RATIO 1.0\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\nstruct LineFragmentUniforms {\n lineBlur: f32,\n lineColor: vec4f,\n lineStrokeColor: vec4f,\n lineOpacity: f32,\n tileExtent: f32,\n lineDasharray: vec4f,\n lineDashColor: vec4f,\n #ifdef HAS_PATTERN\n atlasSize: vec2f,\n flipY: f32,\n linePatternAnimSpeed: f32,\n linePatternGap: f32,\n linePatterGapColor: vec4f,\n #endif\n}\nstruct ShaderUniforms {\n layerOpacity: f32,\n isRenderingTerrain: f32,\n trailSpeed: f32,\n trailLength: f32,\n trailCircle: f32,\n currentTime: f32,\n cameraPosition: vec3f,\n cameraToCenterDistance: f32,\n fogFactor: f32\n}\n@group(0) @binding($b) var<uniform> uniforms: LineFragmentUniforms;\n@group(0) @binding($b) var<uniform> shaderUniforms: ShaderUniforms;\n#ifdef HAS_PATTERN\n @group(0) @binding($b) var linePatternFile: texture_2d<f32>;\n @group(0) @binding($b) var linePatternFileSampler: sampler;\n#endif\n#include <highlight_frag>\n#ifdef HAS_PATTERN\nfn computeUV(texCoord: vec2f) -> vec2f {\n let uv = texCoord % 1.0;\n let uvStart = input.vTexInfo.xy;\n let uvSize = input.vTexInfo.zw;\n return (uvStart + uv * uvSize) / uniforms.atlasSize;\n}\n#endif\nfn dashAntialias(input: VertexOutput, dashMod: f32, dashWidth: f32) -> f32 {\n let dashHalf = dashWidth / 2.0;\n let dashDist = abs(dashMod - dashHalf);\n let blur2 = (0.1 + 1.0 / DEVICE_PIXEL_RATIO) * input.vGammaScale;\n return clamp(min(dashDist + blur2, dashHalf - dashDist) / blur2, 0.0, 1.0);\n}\n@fragment\nfn main(input: VertexOutput) -> @location(0) vec4f {\n #ifndef ENABLE_TILE_STENCIL\n let clip = sign(uniforms.tileExtent - min(uniforms.tileExtent, abs(input.vPosition.x))) *\n sign(1.0 + sign(input.vPosition.x)) *\n sign(uniforms.tileExtent - min(uniforms.tileExtent, abs(input.vPosition.y))) *\n sign(1.0 + sign(input.vPosition.y));\n if (clip == 0.0) {\n discard;\n }\n #endif\n #if HAS_PATTERN || HAS_DASHARRAY || HAS_GRADIENT || HAS_TRAIL\n let linesofar = input.vLinesofar;\n #endif\n let dist = length(input.vNormal) * input.vWidth.x;\n #ifdef HAS_PATTERN\n let uvSize = input.vTexInfo.zw;\n let hasPattern = sign(uvSize.x * uvSize.y);\n let blur = mix(uniforms.lineBlur, 0.0, hasPattern);\n #else\n let blur = uniforms.lineBlur;\n #endif\n let blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * input.vGammaScale;\n
|
|
153
|
+
var vtLineFrag = "#define DEVICE_PIXEL_RATIO 1.0\n#if HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\nstruct LineFragmentUniforms {\n lineBlur: f32,\n lineColor: vec4f,\n lineStrokeColor: vec4f,\n lineOpacity: f32,\n tileExtent: f32,\n lineDasharray: vec4f,\n lineDashColor: vec4f,\n #ifdef HAS_PATTERN\n atlasSize: vec2f,\n flipY: f32,\n linePatternAnimSpeed: f32,\n linePatternGap: f32,\n linePatterGapColor: vec4f,\n #endif\n}\nstruct ShaderUniforms {\n layerOpacity: f32,\n isRenderingTerrain: f32,\n trailSpeed: f32,\n trailLength: f32,\n trailCircle: f32,\n currentTime: f32,\n cameraPosition: vec3f,\n cameraToCenterDistance: f32,\n fogFactor: f32\n}\n@group(0) @binding($b) var<uniform> uniforms: LineFragmentUniforms;\n@group(0) @binding($b) var<uniform> shaderUniforms: ShaderUniforms;\n#ifdef HAS_PATTERN\n @group(0) @binding($b) var linePatternFile: texture_2d<f32>;\n @group(0) @binding($b) var linePatternFileSampler: sampler;\n#endif\n#include <highlight_frag>\n#ifdef HAS_PATTERN\nfn computeUV(texCoord: vec2f) -> vec2f {\n let uv = texCoord % 1.0;\n let uvStart = input.vTexInfo.xy;\n let uvSize = input.vTexInfo.zw;\n return (uvStart + uv * uvSize) / uniforms.atlasSize;\n}\n#endif\nfn dashAntialias(input: VertexOutput, dashMod: f32, dashWidth: f32) -> f32 {\n let dashHalf = dashWidth / 2.0;\n let dashDist = abs(dashMod - dashHalf);\n let blur2 = (0.1 + 1.0 / DEVICE_PIXEL_RATIO) * input.vGammaScale;\n return clamp(min(dashDist + blur2, dashHalf - dashDist) / blur2, 0.0, 1.0);\n}\n@fragment\nfn main(input: VertexOutput) -> @location(0) vec4f {\n #ifndef ENABLE_TILE_STENCIL\n let clip = sign(uniforms.tileExtent - min(uniforms.tileExtent, abs(input.vPosition.x))) *\n sign(1.0 + sign(input.vPosition.x)) *\n sign(uniforms.tileExtent - min(uniforms.tileExtent, abs(input.vPosition.y))) *\n sign(1.0 + sign(input.vPosition.y));\n if (clip == 0.0) {\n discard;\n }\n #endif\n #if HAS_PATTERN || HAS_DASHARRAY || HAS_GRADIENT || HAS_TRAIL\n let linesofar = input.vLinesofar;\n #endif\n let dist = length(input.vNormal) * input.vWidth.x;\n #ifdef HAS_PATTERN\n let uvSize = input.vTexInfo.zw;\n let hasPattern = sign(uvSize.x * uvSize.y);\n let blur = mix(uniforms.lineBlur, 0.0, hasPattern);\n #else\n let blur = uniforms.lineBlur;\n #endif\n let blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * input.vGammaScale;\n var alpha = clamp(min(dist - (input.vWidth.y - blur2), input.vWidth.x - dist) / blur2, 0.0, 1.0);\n if (uniforms.lineBlur == 0) {\n alpha = 1;\n }\n #ifdef HAS_COLOR\n var color = input.vColor / 255.0;\n #else\n var color = uniforms.lineColor;\n #endif\n #ifdef HAS_PATTERN\n if (hasPattern == 1.0) {\n #ifdef HAS_PATTERN_GAP\n let myGap = input.vLinePatternGap;\n #else\n let myGap = uniforms.linePatternGap;\n #endif\n #ifdef HAS_PATTERN_ANIM\n let myAnimSpeed = input.vLinePatternAnimSpeed;\n #else\n let myAnimSpeed = uniforms.linePatternAnimSpeed;\n #endif\n let patternWidth = uvSize.x * input.vWidth.x * 2.0 / uvSize.y;\n let plusGapWidth = patternWidth * (1.0 + myGap);\n let animatedLinesofar = linesofar + ((shaderUniforms.currentTime * -myAnimSpeed * 0.2) % plusGapWidth);\n let patternx = (animatedLinesofar / plusGapWidth) % 1.0;\n let patterny = ((uniforms.flipY * input.vNormal.y + 1.0) / 2.0) % 1.0;\n let patternColor = textureSample(\n linePatternFile,\n linePatternFileSampler,\n computeUV(vec2f(patternx * (1.0 + myGap), patterny))\n );\n let inGap = clamp(sign(1.0 / (1.0 + myGap) - patternx) + 0.000001, 0.0, 1.0);\n let finalPatternColor = mix(uniforms.linePatterGapColor, patternColor, inGap);\n color *= finalPatternColor;\n }\n #endif\n #ifdef HAS_DASHARRAY\n #ifdef HAS_DASHARRAY_ATTR\n let dasharray = input.vDasharray;\n #else\n let dasharray = uniforms.lineDasharray;\n #endif\n #ifdef HAS_DASHARRAY_COLOR\n let dashColor = input.vDashColor;\n #else\n let dashColor = uniforms.lineDashColor;\n #endif\n let dashWidth = dasharray[0] + dasharray[1] + dasharray[2] + dasharray[3];\n let dashMod = linesofar % dashWidth;\n let firstInDash = max(sign(dasharray[0] - dashMod), 0.0);\n let secondDashMod = dashMod - dasharray[0] - dasharray[1];\n let secondInDash = max(sign(secondDashMod), 0.0) * max(sign(dasharray[2] - secondDashMod), 0.0);\n let isInDash = firstInDash + secondInDash;\n let firstDashAlpha = dashAntialias(input, dashMod, dasharray[0]);\n let secondDashAlpha = dashAntialias(input, secondDashMod, dasharray[2]);\n let dashAlpha = firstDashAlpha * firstInDash + secondDashAlpha * secondInDash;\n color = color * (1.0 - dashAlpha) + dashColor * dashAlpha;\n #endif\n #ifdef HAS_STROKE_COLOR\n var strokeColor = input.vStrokeColor / 255.0;\n #else\n var strokeColor = uniforms.lineStrokeColor;\n #endif\n strokeColor = mix(color, strokeColor, sign(input.vWidth.y));\n color = strokeColor * alpha + max(sign(input.vWidth.y - dist), 0.0) * color * (1.0 - alpha);\n #ifdef HAS_TRAIL\n let trailMod = (linesofar - shaderUniforms.currentTime * shaderUniforms.trailSpeed * 0.1) % shaderUniforms.trailCircle;\n let trailAlpha = select(0.0, mix(0.0, 1.0, trailMod / shaderUniforms.trailLength), trailMod < shaderUniforms.trailLength);\n color *= trailAlpha;\n #endif\n #ifdef HAS_OPACITY\n let opacity = input.vOpacity;\n #else\n let opacity = uniforms.lineOpacity;\n #endif\n var fragColor = color * opacity * shaderUniforms.layerOpacity;\n #if HAS_SHADOWING && !HAS_BLOOM\n let shadowCoeff = shadow_computeShadow(input);\n fragColor = vec4(shadow_blend(fragColor.rgb, shadowCoeff), fragColor.a);\n #endif\n let cameraPosition = shaderUniforms.cameraPosition;\n let perspectiveAlpha = select(\n clamp(shaderUniforms.cameraToCenterDistance * 1.5 / distance(input.vVertex, cameraPosition), 0.0, 1.0),\n 1.0,\n shaderUniforms.isRenderingTerrain == 1.0\n );\n fragColor *= perspectiveAlpha;\n #if HAS_HIGHLIGHT_COLOR || HAS_HIGHLIGHT_OPACITY\n fragColor = highlight_blendColor(fragColor, input);\n #endif\n if (shaderUniforms.fogFactor > 0.0) {\n let dir = vec3f(input.vVertex.x - cameraPosition.x, input.vVertex.y - cameraPosition.y, input.vVertex.z - cameraPosition.z);\n let fog_dist = length(dir);\n let fog_alpha = clamp(1.0 - (fog_dist * 1.2) / shaderUniforms.fogFactor, 0.0, 1.0);\n fragColor *= fog_alpha;\n }\n return fragColor;\n}";
|
|
154
154
|
|
|
155
155
|
var vtLineGradientFrag = "#define SHADER_NAME LINE_GRADIENT\n#define DEVICE_PIXEL_RATIO 1.0\n#define MAX_LINE_COUNT 128.0\n#ifdef HAS_SHADOWING && !HAS_BLOOM\n #include <vsm_shadow_frag>\n#endif\n#include <highlight_frag>\nstruct LineGradientUniforms {\n layerOpacity: f32,\n #ifdef HAS_TRAIL\n trailSpeed: f32,\n trailLength: f32,\n trailCircle: f32,\n currentTime: f32,\n #endif\n};\nstruct LineFragmentUniforms {\n lineBlur: f32,\n tileExtent: f32,\n lineGradientTextureHeight: f32,\n #ifndef HAS_OPACITY\n lineOpacity: f32,\n #endif\n};\n@group(0) @binding($b) var<uniform> uniforms: LineGradientUniforms;\n@group(0) @binding($b) var<uniform> lineUniforms: LineFragmentUniforms;\n@group(0) @binding($b) var lineGradientTexture: texture_2d<f32>;\n@group(0) @binding($b) var lineGradientTextureSampler: sampler;\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n #ifndef ENABLE_TILE_STENCIL\n let tileExtent = lineUniforms.tileExtent;\n let clip = sign(tileExtent - min(tileExtent, abs(vertexOutput.vPosition.x))) *\n sign(1.0 + sign(vertexOutput.vPosition.x)) *\n sign(tileExtent - min(tileExtent, abs(vertexOutput.vPosition.y))) *\n sign(1.0 + sign(vertexOutput.vPosition.y));\n if clip == 0.0 {\n discard;\n }\n #endif\n let dist = length(vertexOutput.vNormal) * vertexOutput.vWidth.x;\n let blur2 = (lineUniforms.lineBlur + 1.0 / DEVICE_PIXEL_RATIO) * vertexOutput.vGammaScale;\n let alpha = clamp(min(dist - (vertexOutput.vWidth.y - blur2), vertexOutput.vWidth.x - dist) / blur2, 0.0, 1.0);\n let linesofar = vertexOutput.vLinesofar;\n let texCoord = vec2f(linesofar, (vertexOutput.vGradIndex * 2.0 + 0.5) / lineUniforms.lineGradientTextureHeight);\n var color = textureSample(lineGradientTexture, lineGradientTextureSampler, texCoord) * alpha;\n color = color * max(sign(MAX_LINE_COUNT - vertexOutput.vGradIndex), 0.0);\n #ifdef HAS_TRAIL\n let trailMod = mod(linesofar - uniforms.currentTime * uniforms.trailSpeed * 0.1, uniforms.trailCircle);\n let trailAlpha = select(0.0, mix(0.0, 1.0, trailMod / uniforms.trailLength), trailMod < uniforms.trailLength);\n color = color * trailAlpha;\n #endif\n #ifdef HAS_OPACITY\n let opacity = vertexOutput.vOpacity;\n #else\n let opacity = lineUniforms.lineOpacity;\n #endif\n var fragColor = color * opacity * uniforms.layerOpacity;\n #if HAS_SHADOWING && !HAS_BLOOM\n let shadowCoeff = shadow_computeShadow(vertexOutput);\n fragColor = vec4f(shadow_blend(fragColor.rgb, shadowCoeff).rgb, fragColor.a);\n #endif\n #if HAS_HIGHLIGHT_OPACITY || HAS_HIGHLIGHT_COLOR\n fragColor = highlight_blendColor(fragColor, vertexOutput);\n #endif\n return fragColor;\n}";
|
|
156
156
|
|
|
@@ -164,9 +164,9 @@
|
|
|
164
164
|
|
|
165
165
|
var vtNativeLineVert = "struct VertexInput {\n#ifdef HAS_ALTITUDE\n @location($i) aPosition: vec2i,\n @location($i) aAltitude: f32,\n#else\n @location($i) aPosition: vec4i,\n#endif\n#ifndef PICKING_MODE\n #if HAS_COLOR\n @location($i) aColor: vec4u,\n #endif\n#endif\n}\nstruct MyAppUniforms {\n projViewModelMatrix: mat4x4f,\n positionMatrix: mat4x4f,\n};\n@group(0) @binding($b) var<uniform> uniforms: MyAppUniforms;\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n#ifndef PICKING_MODE\n #if HAS_COLOR\n @location($o) vColor: vec4f,\n #endif\n#endif\n}\n#ifdef PICKING_MODE\n #include <fbo_picking_vert>\n#endif\n#include <vt_position_vert>\n@vertex\nfn main(\n vertexInput: VertexInput\n) -> VertexOutput {\n var out: VertexOutput;\n let position = unpackVTPosition(vertexInput);\n out.position = uniforms.projViewModelMatrix * uniforms.positionMatrix * vec4f(position, 1.0);\n #ifndef PICKING_MODE\n #if HAS_COLOR\n out.vColor = vertexInputWithColor.aColor / 255.0;\n #endif\n #else\n fbo_picking_setData(vertexInput, &out, out.position.w, true);\n #endif\n return out;\n}";
|
|
166
166
|
|
|
167
|
-
var vtNativePointFrag = "struct MarkerFragmentUniforms {\n markerOpacity: f32,\n #ifndef HAS_COLOR\n markerFill: vec3f,\n #endif\n}\n@group(0) @binding($b) var<uniform> uniforms: MarkerFragmentUniforms;\n@group(0) @binding($b) var<uniform> layerOpacity: f32;\n
|
|
167
|
+
var vtNativePointFrag = "struct MarkerFragmentUniforms {\n markerOpacity: f32,\n #ifndef HAS_COLOR\n markerFill: vec3f,\n #endif\n}\n@group(0) @binding($b) var<uniform> uniforms: MarkerFragmentUniforms;\n@group(0) @binding($b) var<uniform> layerOpacity: f32;\n@fragment\nfn main(\n vertexOutput: VertexOutput\n) -> @location(0) vec4f {\n var alpha: f32 = 1.0;\n #ifdef USE_CIRCLE\n let uv = vertexOutput.vUv;\n let center = vec2f(0.5, 0.5);\n let dist = distance(uv, center);\n let radius = 0.5;\n let smooth_width = 0.05;\n let alpha_circle = 1.0 - smoothstep(radius - smooth_width, radius, dist);\n alpha = alpha_circle;\n #endif\n var pointColor: vec4f;\n #ifdef HAS_COLOR\n pointColor = vertexOutput.vColor;\n #else\n pointColor = vec4f(uniforms.markerFill, 1.0);\n #endif\n let color = pointColor * uniforms.markerOpacity * alpha * layerOpacity;\n if (color.a <= 0.01) {\n discard;\n }\n return color;\n}";
|
|
168
168
|
|
|
169
|
-
var vtNativePointVert = "struct AttributeInput {\n @location($i) aPosition: vec2i,\n#ifdef HAS_ALTITUDE\n @location($i) instancePosition: vec2i,\n @location($i) instanceAltitude: f32,\n#else\n @location($i) instancePosition: vec4i,\n#endif\n#ifndef PICKING_MODE\n #ifdef HAS_COLOR\n @location($i) aColor: vec4u,\n #endif\n#endif\n};\nstruct VertexInput {\n#ifdef HAS_ALTITUDE\n aPosition: vec2i,\n aAltitude: f32,\n#else\n aPosition: vec4i,\n#endif\n aPickingId: f32,\n}\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n #ifndef PICKING_MODE\n #ifdef HAS_COLOR\n @location($o) vColor: vec4f,\n #endif\n #endif\n};\nstruct MarkerUniforms {\n positionMatrix: mat4x4f,\n projViewModelMatrix: mat4x4f,\n markerSize: f32,\n};\n@group(0) @binding($b) var<uniform> uniforms: MarkerUniforms;\n@group(0) @binding($b) var<uniform> resolution: vec2f;\n#ifdef PICKING_MODE\n #include <fbo_picking_vert>\n#endif\n#include <vt_position_vert>\n@vertex\nfn main(\n input: AttributeInput\n) -> VertexOutput {\n var out: VertexOutput;\n var inputVertex: VertexInput;\n inputVertex.aPosition = input.instancePosition;\n #ifdef HAS_ALTITUDE\n inputVertex.aAltitude = input.instanceAltitude;\n #endif\n let position = unpackVTPosition(inputVertex);\n out.position = uniforms.projViewModelMatrix * uniforms.positionMatrix * vec4f(position, 1.0);\n let markerSize = uniforms.markerSize / resolution;\n let w = out.position.w;\n out.position.x += f32(input.aPosition.x) * markerSize.x * w;\n out.position.y += f32(input.aPosition.y) * markerSize.y * w;\n #ifndef PICKING_MODE\n #ifdef HAS_COLOR\n out.vColor = vec4f(input.aColor) / 255.0;\n #endif\n #endif\n #ifdef PICKING_MODE\n inputVertex.aPickingId = input.aPickingId;\n fbo_picking_setData(inputVertex, &out, w, true);\n #endif\n return out;\n}";
|
|
169
|
+
var vtNativePointVert = "struct AttributeInput {\n @location($i) aPosition: vec2i,\n#ifdef HAS_ALTITUDE\n @location($i) instancePosition: vec2i,\n @location($i) instanceAltitude: f32,\n#else\n @location($i) instancePosition: vec4i,\n#endif\n#ifdef HAS_TERRAIN_ALTITUDE\n @location($i) aTerrainAltitude: f32,\n#endif\n#ifndef PICKING_MODE\n #ifdef HAS_COLOR\n @location($i) aColor: vec4u,\n #endif\n#endif\n};\nstruct VertexInput {\n#ifdef HAS_ALTITUDE\n aPosition: vec2i,\n aAltitude: f32,\n#else\n aPosition: vec4i,\n#endif\n aPickingId: f32,\n}\nstruct VertexOutput {\n @builtin(position) position: vec4f,\n #ifndef PICKING_MODE\n #ifdef HAS_COLOR\n @location($o) vColor: vec4f,\n #endif\n #endif\n @location($o) vUv: vec2f,\n};\nstruct MarkerUniforms {\n positionMatrix: mat4x4f,\n projViewModelMatrix: mat4x4f,\n markerSize: f32,\n};\n@group(0) @binding($b) var<uniform> uniforms: MarkerUniforms;\n@group(0) @binding($b) var<uniform> resolution: vec2f;\n#ifdef PICKING_MODE\n #include <fbo_picking_vert>\n#endif\n#include <vt_position_vert>\n@vertex\nfn main(\n input: AttributeInput\n) -> VertexOutput {\n var out: VertexOutput;\n var inputVertex: VertexInput;\n inputVertex.aPosition = input.instancePosition;\n #ifdef HAS_ALTITUDE\n inputVertex.aAltitude = input.instanceAltitude;\n #endif\n #ifdef HAS_TERRAIN_ALTITUDE\n inputVertex.aTerrainAltitude += input.aTerrainAltitude;\n #endif\n let position = unpackVTPosition(inputVertex);\n out.position = uniforms.projViewModelMatrix * uniforms.positionMatrix * vec4f(position, 1.0);\n let markerSize = uniforms.markerSize / resolution;\n let w = out.position.w;\n out.position.x += f32(input.aPosition.x) * markerSize.x * w;\n out.position.y += f32(input.aPosition.y) * markerSize.y * w;\n out.vUv = vec2f(input.aPosition + 1) / 2.0;\n #ifndef PICKING_MODE\n #ifdef HAS_COLOR\n out.vColor = vec4f(input.aColor) / 255.0;\n #endif\n #endif\n #ifdef PICKING_MODE\n inputVertex.aPickingId = input.aPickingId;\n fbo_picking_setData(inputVertex, &out, w, true);\n #endif\n return out;\n}";
|
|
170
170
|
|
|
171
171
|
var vtOutlineFrag = "struct OutlineUniforms {\n highlightPickingId: f32,\n}\n@group(0) @binding($b) var<uniform> uniforms: OutlineUniforms;\n@fragment\nfn main(vertexOutput: VertexOutput) -> @location(0) vec4f {\n if (uniforms.highlightPickingId < 0.0 ||\n floor(uniforms.highlightPickingId + 0.5) == floor(vertexOutput.vPickingId + 0.5)) {\n return vec4f(1.0);\n } else {\n discard;\n return vec4f(0.0);\n }\n}";
|
|
172
172
|
|
|
@@ -264,6 +264,6 @@
|
|
|
264
264
|
registerWGSLSource('vt_flat_mask_frag', vtFlatMaskFrag);
|
|
265
265
|
registerWGSLSource('vt_flat_mask_vert', vtFlatMaskVert);
|
|
266
266
|
|
|
267
|
-
typeof console !== 'undefined' && console.log('@maptalks/gpu v0.124.
|
|
267
|
+
typeof console !== 'undefined' && console.log('@maptalks/gpu v0.124.4');
|
|
268
268
|
|
|
269
269
|
}));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maptalks/gpu",
|
|
3
|
-
"version": "0.124.
|
|
3
|
+
"version": "0.124.4",
|
|
4
4
|
"description": "WebGL infrastrcture for maptalks",
|
|
5
5
|
"main": "dist/maptalksgpu.js",
|
|
6
6
|
"module": "dist/maptalksgpu.es.js",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"author": "fuzhenn",
|
|
18
18
|
"license": "UNLICENSED",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@maptalks/gl": "0.124.
|
|
20
|
+
"@maptalks/gl": "0.124.4"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@rollup/plugin-commonjs": "^25.0.7",
|