UNPKG

@babylonjs/viewer

Version:

The Babylon Viewer aims to simplify a specific but common Babylon.js use case: loading, viewing, and interacting with a 3D model.

3 lines (2 loc) 4.58 kB
import{M as t}from"./index-DFZFpUG-.esm.min.js";function e(){return`\nstruct LightEntry {\nvLightData: vec4<f32>,\nvLightDiffuse: vec4<f32>,\nvLightSpecular: vec4<f32>,\nvLightDirection: vec4<f32>,\n};\nstruct lightsUniforms {\ncount: u32, _p0: u32, _p1: u32, _p2: u32,\nlights: array<LightEntry, ${t}>,\n};\n`}const n="\nstruct PbrLightResult { L: vec3<f32>, NdotL: f32, atten: f32, color: vec3<f32>, specColor: vec3<f32>, isHemi: bool };\nfn computePbrLight(entry: LightEntry, N: vec3<f32>, worldPos: vec3<f32>, lightFalloffMode: f32) -> PbrLightResult {\nvar r: PbrLightResult;\nlet t = u32(entry.vLightData.w);\nr.isHemi = t == 3u;\nr.specColor = entry.vLightDiffuse.rgb;\nif (t == 3u) {\nr.L = normalize(entry.vLightData.xyz);\nr.NdotL = dot(N, r.L) * 0.5 + 0.5;\nr.atten = 1.0;\nr.color = mix(entry.vLightDirection.xyz, entry.vLightDiffuse.rgb, r.NdotL);\nreturn r;\n}\nif (t == 1u) {\nr.L = normalize(-entry.vLightData.xyz);\nr.atten = 1.0;\n} else {\nlet toLight = entry.vLightData.xyz - worldPos;\nlet d2 = dot(toLight, toLight);\nlet dist = sqrt(d2);\nr.L = toLight / max(dist, 0.0001);\n let physicalFalloff = lightFalloffMode >= 0.5;\n let rangeAtt = select(max(0.0, 1.0 - dist / entry.vLightDiffuse.a), 1.0 / max(d2, 0.0000001), physicalFalloff);\n if (t == 2u) {\n let cosHalfAngle = entry.vLightDirection.w;\n let c = dot(-entry.vLightDirection.xyz, r.L);\n let standardDirFalloff = select(0.0, max(0.0, pow(max(c, 0.0), entry.vLightSpecular.a)), c >= cosHalfAngle);\n let kappa = 6.64385618977 / max(1.0 - cosHalfAngle, 0.0001);\n let physicalDirFalloff = exp2(kappa * (c - 1.0));\n r.atten = rangeAtt * select(standardDirFalloff, physicalDirFalloff, physicalFalloff);\n } else {\n r.atten = rangeAtt;\n }\n}\nr.NdotL = max(dot(N, r.L), 0.0);\nr.color = entry.vLightDiffuse.rgb;\nreturn r;\n}\n";function l(){return`var directDiffuse = vec3<f32>(0.0);\nvar directSpecular = vec3<f32>(0.0);\n// BJS direct-light specular: roughness is clamped by the geometric AA factor\n// BEFORE being squared (matches BJS pbrDirectLightingFunctions.fx line 103).\n// The IBL-path alphaG already has AA_factor_y additively baked in; direct\n// specular uses its own squaring after max(roughness, AA_factor_x).\nlet directRoughness = max(roughness, AA_factor_x);\nlet directAlphaG = directRoughness * directRoughness + 0.0005;\nvar shadowFactors = array<f32, ${t}>(${new Array(t).fill("1.0").join(", ")});\nlet lightCount = min(mesh.lc, ${t}u);\n/*AS*/\n// First-light aliases — kept at directLightBlock scope so the AD slot below\n// (clearcoat / sheen / subsurface) sees the same single-light variable names\n// it was originally written against. Multi-light direct contributions\n// for those ancillary BRDFs are not yet supported (single-light parity only).\nlet lightIndex0 = mli(0u);\nlet entry0 = lights.lights[lightIndex0];\nlet pl0 = computePbrLight(entry0, N, input.worldPos, material.lightFalloffMode);\nlet L = pl0.L;\nlet NdotL = pl0.NdotL;\nlet lightColor = pl0.specColor;\nlet lightAtten = pl0.atten * shadowFactors[lightIndex0];\nlet H = normalize(V + L);\nlet NdotH = clamp(dot(N, H), 0.0000001, 1.0);\nlet VdotH = saturate(dot(V, H));\nfor (var li = 0u; li < lightCount; li++) {\nvar pl: PbrLightResult;\nlet lightIndex = mli(li);\nif (li == 0u) { pl = pl0; } else { pl = computePbrLight(lights.lights[lightIndex], N, input.worldPos, material.lightFalloffMode); }\nlet sf = shadowFactors[lightIndex];\nif (pl.isHemi) {\ndirectDiffuse += pl.color * surfaceAlbedo * material.directIntensity * sf;\n} else {\ndirectDiffuse += surfaceAlbedo * (1.0 / PI) * pl.NdotL * pl.color * pl.atten * material.directIntensity * sf;\n}\n// Specular uses pl.NdotL (hemispheric 0.5+0.5*dot for hemi, max(dot,0) for others)\n// and pl.specColor (un-mixed light diffuse — matches single-light fast path\n// and Std's LIGHTING_FN which uses vLightSpecular for the specular bounce).\nif (pl.NdotL > 0.0 && pl.atten > 0.0) {\nlet specH = normalize(V + pl.L);\nlet specNdotH = clamp(dot(N, specH), 0.0000001, 1.0);\nlet specVdotH = saturate(dot(V, specH));\nlet D = distributionGGX(specNdotH, directAlphaG);\nlet G = geometrySmithGGX(pl.NdotL, NdotV, directAlphaG);\nlet coloredFresnel = fresnelSchlick(specVdotH, colorF0, colorF90);\ndirectSpecular += coloredFresnel * D * G * pl.NdotL * pl.specColor * pl.atten * material.directIntensity * sf;\n}\n}\n/*AD*/`}export{n as COMPUTE_PBR_LIGHT,e as MULTI_LIGHT_STRUCTS,l as getMultiLightLoop}; //# sourceMappingURL=multilight-wgsl-jR97w0WP.esm.min.js.map