@flighthq/scene3d-gl 0.2.1-next.840.857425c
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/anisotropyPbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/anisotropyPbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/anisotropyPbrGlMeshMaterialRenderer.js +45 -0
- package/dist/anisotropyPbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/blinnPhongGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/blinnPhongGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/blinnPhongGlMeshMaterialRenderer.js +102 -0
- package/dist/blinnPhongGlMeshMaterialRenderer.js.map +1 -0
- package/dist/clearcoatPbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/clearcoatPbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/clearcoatPbrGlMeshMaterialRenderer.js +45 -0
- package/dist/clearcoatPbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/customShaderGlMeshMaterialRenderer.d.ts +6 -0
- package/dist/customShaderGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/customShaderGlMeshMaterialRenderer.js +136 -0
- package/dist/customShaderGlMeshMaterialRenderer.js.map +1 -0
- package/dist/depthGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/depthGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/depthGlMeshMaterialRenderer.js +36 -0
- package/dist/depthGlMeshMaterialRenderer.js.map +1 -0
- package/dist/drawGlScene3D.d.ts +3 -0
- package/dist/drawGlScene3D.d.ts.map +1 -0
- package/dist/drawGlScene3D.js +251 -0
- package/dist/drawGlScene3D.js.map +1 -0
- package/dist/emissiveGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/emissiveGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/emissiveGlMeshMaterialRenderer.js +49 -0
- package/dist/emissiveGlMeshMaterialRenderer.js.map +1 -0
- package/dist/enableGlScene3DColorSpaceGuards.d.ts +4 -0
- package/dist/enableGlScene3DColorSpaceGuards.d.ts.map +1 -0
- package/dist/enableGlScene3DColorSpaceGuards.js +22 -0
- package/dist/enableGlScene3DColorSpaceGuards.js.map +1 -0
- package/dist/enableGlScene3DCustomShaderGuards.d.ts +4 -0
- package/dist/enableGlScene3DCustomShaderGuards.d.ts.map +1 -0
- package/dist/enableGlScene3DCustomShaderGuards.js +71 -0
- package/dist/enableGlScene3DCustomShaderGuards.js.map +1 -0
- package/dist/enableGlScene3DDeformGuards.d.ts +4 -0
- package/dist/enableGlScene3DDeformGuards.d.ts.map +1 -0
- package/dist/enableGlScene3DDeformGuards.js +42 -0
- package/dist/enableGlScene3DDeformGuards.js.map +1 -0
- package/dist/enableGlScene3DForwardLightSelectionGuards.d.ts +4 -0
- package/dist/enableGlScene3DForwardLightSelectionGuards.d.ts.map +1 -0
- package/dist/enableGlScene3DForwardLightSelectionGuards.js +21 -0
- package/dist/enableGlScene3DForwardLightSelectionGuards.js.map +1 -0
- package/dist/explainGlScene3DForwardLightSelection.d.ts +3 -0
- package/dist/explainGlScene3DForwardLightSelection.d.ts.map +1 -0
- package/dist/explainGlScene3DForwardLightSelection.js +19 -0
- package/dist/explainGlScene3DForwardLightSelection.js.map +1 -0
- package/dist/glClassicPrelude.d.ts +9 -0
- package/dist/glClassicPrelude.d.ts.map +1 -0
- package/dist/glClassicPrelude.js +288 -0
- package/dist/glClassicPrelude.js.map +1 -0
- package/dist/glDebugPrelude.d.ts +9 -0
- package/dist/glDebugPrelude.d.ts.map +1 -0
- package/dist/glDebugPrelude.js +143 -0
- package/dist/glDebugPrelude.js.map +1 -0
- package/dist/glEnvironmentCube.d.ts +5 -0
- package/dist/glEnvironmentCube.d.ts.map +1 -0
- package/dist/glEnvironmentCube.js +65 -0
- package/dist/glEnvironmentCube.js.map +1 -0
- package/dist/glEnvironmentIblBake.d.ts +4 -0
- package/dist/glEnvironmentIblBake.d.ts.map +1 -0
- package/dist/glEnvironmentIblBake.js +365 -0
- package/dist/glEnvironmentIblBake.js.map +1 -0
- package/dist/glEnvironmentSkybox.d.ts +3 -0
- package/dist/glEnvironmentSkybox.d.ts.map +1 -0
- package/dist/glEnvironmentSkybox.js +95 -0
- package/dist/glEnvironmentSkybox.js.map +1 -0
- package/dist/glLitProgram.d.ts +5 -0
- package/dist/glLitProgram.d.ts.map +1 -0
- package/dist/glLitProgram.js +211 -0
- package/dist/glLitProgram.js.map +1 -0
- package/dist/glMatcapPrelude.d.ts +8 -0
- package/dist/glMatcapPrelude.d.ts.map +1 -0
- package/dist/glMatcapPrelude.js +118 -0
- package/dist/glMatcapPrelude.js.map +1 -0
- package/dist/glMeshMaterialRegistry.d.ts +5 -0
- package/dist/glMeshMaterialRegistry.d.ts.map +1 -0
- package/dist/glMeshMaterialRegistry.js +29 -0
- package/dist/glMeshMaterialRegistry.js.map +1 -0
- package/dist/glMeshProgram.d.ts +14 -0
- package/dist/glMeshProgram.d.ts.map +1 -0
- package/dist/glMeshProgram.js +193 -0
- package/dist/glMeshProgram.js.map +1 -0
- package/dist/glMeshUpload.d.ts +4 -0
- package/dist/glMeshUpload.d.ts.map +1 -0
- package/dist/glMeshUpload.js +190 -0
- package/dist/glMeshUpload.js.map +1 -0
- package/dist/glParticleEmitter3D.d.ts +4 -0
- package/dist/glParticleEmitter3D.d.ts.map +1 -0
- package/dist/glParticleEmitter3D.js +342 -0
- package/dist/glParticleEmitter3D.js.map +1 -0
- package/dist/glPbrPrelude.d.ts +8 -0
- package/dist/glPbrPrelude.d.ts.map +1 -0
- package/dist/glPbrPrelude.js +569 -0
- package/dist/glPbrPrelude.js.map +1 -0
- package/dist/glPbrProgramCache.d.ts +4 -0
- package/dist/glPbrProgramCache.d.ts.map +1 -0
- package/dist/glPbrProgramCache.js +63 -0
- package/dist/glPbrProgramCache.js.map +1 -0
- package/dist/glPbrStandardBlock.d.ts +13 -0
- package/dist/glPbrStandardBlock.d.ts.map +1 -0
- package/dist/glPbrStandardBlock.js +107 -0
- package/dist/glPbrStandardBlock.js.map +1 -0
- package/dist/glScene3DRuntime.d.ts +5 -0
- package/dist/glScene3DRuntime.d.ts.map +1 -0
- package/dist/glScene3DRuntime.js +99 -0
- package/dist/glScene3DRuntime.js.map +1 -0
- package/dist/glScene3DTestHelper.d.ts +20 -0
- package/dist/glScene3DTestHelper.d.ts.map +1 -0
- package/dist/glScene3DTestHelper.js +178 -0
- package/dist/glScene3DTestHelper.js.map +1 -0
- package/dist/glScene3DTime.d.ts +4 -0
- package/dist/glScene3DTime.d.ts.map +1 -0
- package/dist/glScene3DTime.js +18 -0
- package/dist/glScene3DTime.js.map +1 -0
- package/dist/glShadedBuiltInModifiers.d.ts +11 -0
- package/dist/glShadedBuiltInModifiers.d.ts.map +1 -0
- package/dist/glShadedBuiltInModifiers.js +386 -0
- package/dist/glShadedBuiltInModifiers.js.map +1 -0
- package/dist/glShadedModifierSnippet.d.ts +4 -0
- package/dist/glShadedModifierSnippet.d.ts.map +1 -0
- package/dist/glShadedModifierSnippet.js +24 -0
- package/dist/glShadedModifierSnippet.js.map +1 -0
- package/dist/glShadedPrelude.d.ts +5 -0
- package/dist/glShadedPrelude.d.ts.map +1 -0
- package/dist/glShadedPrelude.js +393 -0
- package/dist/glShadedPrelude.js.map +1 -0
- package/dist/glShadowMap.d.ts +3 -0
- package/dist/glShadowMap.d.ts.map +1 -0
- package/dist/glShadowMap.js +150 -0
- package/dist/glShadowMap.js.map +1 -0
- package/dist/glToonPrelude.d.ts +7 -0
- package/dist/glToonPrelude.d.ts.map +1 -0
- package/dist/glToonPrelude.js +172 -0
- package/dist/glToonPrelude.js.map +1 -0
- package/dist/glUnlitPrelude.d.ts +9 -0
- package/dist/glUnlitPrelude.d.ts.map +1 -0
- package/dist/glUnlitPrelude.js +160 -0
- package/dist/glUnlitPrelude.js.map +1 -0
- package/dist/glWireframePrelude.d.ts +6 -0
- package/dist/glWireframePrelude.d.ts.map +1 -0
- package/dist/glWireframePrelude.js +56 -0
- package/dist/glWireframePrelude.js.map +1 -0
- package/dist/glWireframeUpload.d.ts +4 -0
- package/dist/glWireframeUpload.d.ts.map +1 -0
- package/dist/glWireframeUpload.js +85 -0
- package/dist/glWireframeUpload.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/iridescencePbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/iridescencePbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/iridescencePbrGlMeshMaterialRenderer.js +54 -0
- package/dist/iridescencePbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/lambertGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/lambertGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/lambertGlMeshMaterialRenderer.js +70 -0
- package/dist/lambertGlMeshMaterialRenderer.js.map +1 -0
- package/dist/matcapGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/matcapGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/matcapGlMeshMaterialRenderer.js +49 -0
- package/dist/matcapGlMeshMaterialRenderer.js.map +1 -0
- package/dist/normalGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/normalGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/normalGlMeshMaterialRenderer.js +39 -0
- package/dist/normalGlMeshMaterialRenderer.js.map +1 -0
- package/dist/phongGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/phongGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/phongGlMeshMaterialRenderer.js +90 -0
- package/dist/phongGlMeshMaterialRenderer.js.map +1 -0
- package/dist/prepareGlScene3DForwardLights.d.ts +3 -0
- package/dist/prepareGlScene3DForwardLights.d.ts.map +1 -0
- package/dist/prepareGlScene3DForwardLights.js +117 -0
- package/dist/prepareGlScene3DForwardLights.js.map +1 -0
- package/dist/presentGlScene3D.d.ts +3 -0
- package/dist/presentGlScene3D.d.ts.map +1 -0
- package/dist/presentGlScene3D.js +21 -0
- package/dist/presentGlScene3D.js.map +1 -0
- package/dist/registerStandardPbrGlMaterial.d.ts +3 -0
- package/dist/registerStandardPbrGlMaterial.d.ts.map +1 -0
- package/dist/registerStandardPbrGlMaterial.js +11 -0
- package/dist/registerStandardPbrGlMaterial.js.map +1 -0
- package/dist/shadedGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/shadedGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/shadedGlMeshMaterialRenderer.js +135 -0
- package/dist/shadedGlMeshMaterialRenderer.js.map +1 -0
- package/dist/sheenPbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/sheenPbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/sheenPbrGlMeshMaterialRenderer.js +54 -0
- package/dist/sheenPbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/specularGlossinessPbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/specularGlossinessPbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/specularGlossinessPbrGlMeshMaterialRenderer.js +121 -0
- package/dist/specularGlossinessPbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/specularPbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/specularPbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/specularPbrGlMeshMaterialRenderer.js +55 -0
- package/dist/specularPbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/standardPbrGlMeshMaterialRenderer.d.ts +3 -0
- package/dist/standardPbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/standardPbrGlMeshMaterialRenderer.js +35 -0
- package/dist/standardPbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/subsurfacePbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/subsurfacePbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/subsurfacePbrGlMeshMaterialRenderer.js +57 -0
- package/dist/subsurfacePbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/toonGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/toonGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/toonGlMeshMaterialRenderer.js +81 -0
- package/dist/toonGlMeshMaterialRenderer.js.map +1 -0
- package/dist/transmissionVolumePbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/transmissionVolumePbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/transmissionVolumePbrGlMeshMaterialRenderer.js +62 -0
- package/dist/transmissionVolumePbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/unlitGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/unlitGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/unlitGlMeshMaterialRenderer.js +61 -0
- package/dist/unlitGlMeshMaterialRenderer.js.map +1 -0
- package/dist/vertexColorGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/vertexColorGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/vertexColorGlMeshMaterialRenderer.js +54 -0
- package/dist/vertexColorGlMeshMaterialRenderer.js.map +1 -0
- package/dist/wireframeGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/wireframeGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/wireframeGlMeshMaterialRenderer.js +50 -0
- package/dist/wireframeGlMeshMaterialRenderer.js.map +1 -0
- package/package.json +58 -0
- package/src/anisotropyPbrGlMeshMaterialRenderer.test.ts +86 -0
- package/src/blinnPhongGlMeshMaterialRenderer.test.ts +94 -0
- package/src/clearcoatPbrGlMeshMaterialRenderer.test.ts +81 -0
- package/src/customShaderGlMeshMaterialRenderer.test.ts +169 -0
- package/src/depthGlMeshMaterialRenderer.test.ts +69 -0
- package/src/drawGlScene3D.test.ts +304 -0
- package/src/emissiveGlMeshMaterialRenderer.test.ts +60 -0
- package/src/enableGlScene3DColorSpaceGuards.test.ts +63 -0
- package/src/enableGlScene3DCustomShaderGuards.test.ts +85 -0
- package/src/enableGlScene3DDeformGuards.test.ts +98 -0
- package/src/enableGlScene3DForwardLightSelectionGuards.test.ts +84 -0
- package/src/explainGlScene3DForwardLightSelection.test.ts +32 -0
- package/src/glClassicPrelude.test.ts +214 -0
- package/src/glDebugPrelude.test.ts +94 -0
- package/src/glEnvironmentCube.test.ts +71 -0
- package/src/glEnvironmentIblBake.test.ts +31 -0
- package/src/glEnvironmentSkybox.test.ts +24 -0
- package/src/glLitProgram.test.ts +181 -0
- package/src/glMatcapPrelude.test.ts +74 -0
- package/src/glMeshMaterialRegistry.test.ts +52 -0
- package/src/glMeshProgram.test.ts +406 -0
- package/src/glMeshUpload.test.ts +311 -0
- package/src/glParticleEmitter3D.test.ts +280 -0
- package/src/glPbrPrelude.test.ts +178 -0
- package/src/glPbrProgramCache.test.ts +116 -0
- package/src/glPbrStandardBlock.test.ts +85 -0
- package/src/glScene3DRuntime.test.ts +108 -0
- package/src/glScene3DTime.test.ts +31 -0
- package/src/glShadedBuiltInModifiers.test.ts +377 -0
- package/src/glShadedModifierSnippet.test.ts +46 -0
- package/src/glShadedPrelude.test.ts +177 -0
- package/src/glShadowMap.test.ts +219 -0
- package/src/glToonPrelude.test.ts +118 -0
- package/src/glUnlitPrelude.test.ts +156 -0
- package/src/glWireframePrelude.test.ts +46 -0
- package/src/glWireframeUpload.test.ts +50 -0
- package/src/iridescencePbrGlMeshMaterialRenderer.test.ts +86 -0
- package/src/lambertGlMeshMaterialRenderer.test.ts +92 -0
- package/src/matcapGlMeshMaterialRenderer.test.ts +70 -0
- package/src/normalGlMeshMaterialRenderer.test.ts +69 -0
- package/src/phongGlMeshMaterialRenderer.test.ts +94 -0
- package/src/prepareGlScene3DForwardLights.test.ts +106 -0
- package/src/presentGlScene3D.test.ts +98 -0
- package/src/registerStandardPbrGlMaterial.test.ts +14 -0
- package/src/shadedGlMeshMaterialRenderer.test.ts +106 -0
- package/src/sheenPbrGlMeshMaterialRenderer.test.ts +83 -0
- package/src/specularGlossinessPbrGlMeshMaterialRenderer.test.ts +96 -0
- package/src/specularPbrGlMeshMaterialRenderer.test.ts +83 -0
- package/src/standardPbrGlMeshMaterialRenderer.test.ts +88 -0
- package/src/subsurfacePbrGlMeshMaterialRenderer.test.ts +86 -0
- package/src/toonGlMeshMaterialRenderer.test.ts +92 -0
- package/src/transmissionVolumePbrGlMeshMaterialRenderer.test.ts +93 -0
- package/src/unlitGlMeshMaterialRenderer.test.ts +88 -0
- package/src/vertexColorGlMeshMaterialRenderer.test.ts +60 -0
- package/src/wireframeGlMeshMaterialRenderer.test.ts +69 -0
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
// The shared Gl PBR prelude: the GLSL 300 es vertex + fragment uber-shader for the StandardPbr
|
|
2
|
+
// forward-lit path and every PBR-extension variant. One source string is specialized per material
|
|
3
|
+
// at compile time by prepending a define block (see GlPbrDefineKey / buildGlPbrDefineSource), so
|
|
4
|
+
// the maps-present / double-sided / alpha-mode variants AND the extension lobes (clearcoat, sheen,
|
|
5
|
+
// anisotropy, iridescence, specular, subsurface, transmission) are all #ifdef branches of one
|
|
6
|
+
// shader, never separate files. An extension renderer sets exactly one extension define on top of
|
|
7
|
+
// the standard map flags drawn from `material.standard`, so the base StandardPbr path is byte-for-
|
|
8
|
+
// byte unchanged when no extension flag is set.
|
|
9
|
+
//
|
|
10
|
+
// The lighting model is Cook-Torrance: GGX normal distribution, Smith height-correlated
|
|
11
|
+
// visibility, and a Fresnel-Schlick approximation, evaluated over the interpolated world-space
|
|
12
|
+
// normal/tangent/uv for one directional + one ambient light read from the packed light block. The
|
|
13
|
+
// fragment shader outputs LINEAR HDR radiance (no tonemap / gamma here — the effect pipeline's
|
|
14
|
+
// resolve/tonemap pass owns that), matching the rgba16f scene target.
|
|
15
|
+
//
|
|
16
|
+
// The light block UBO mirrors Scene3DLightBlock.data exactly (std140): a directional term
|
|
17
|
+
// { direction.xyz, _pad, radiance.rgb, _pad } at offset 0 then an ambient term { radiance.rgb,
|
|
18
|
+
// _pad } — radiance is already linear and premultiplied by intensity at pack time, so the shader
|
|
19
|
+
// never decodes sRgb. u_directionalCount / u_ambientCount (0 or 1) gate each term's contribution.
|
|
20
|
+
//
|
|
21
|
+
// Color spaces: sampled albedo/color textures (baseColor, emissive, sheenColor, specularColor,
|
|
22
|
+
// subsurfaceColor) are sRgb-encoded and decoded in GLSL via srgbToLinear. Data maps (normal,
|
|
23
|
+
// metallic-roughness, occlusion, clearcoat, anisotropy, iridescence-thickness, thickness,
|
|
24
|
+
// transmission) are linear and read raw. Packed material colors are decoded to linear on the CPU
|
|
25
|
+
// with unpackColorToLinear before upload, so the shader never double-decodes them.
|
|
26
|
+
import { MAX_FORWARD_LIGHTS } from '@flighthq/types';
|
|
27
|
+
import { GL_SKIN_VERTEX_DECLARATIONS_GLSL, GL_UV_TRANSFORM_VERTEX_GLSL } from './glMeshProgram';
|
|
28
|
+
// A short, stable, order-independent string identity for a define key, used as the program-cache
|
|
29
|
+
// map key. Two keys with the same flags produce the same string and so share a compiled program.
|
|
30
|
+
// Standard map/alpha flags first, then one slot per extension lobe.
|
|
31
|
+
export function buildGlPbrDefineKey(key) {
|
|
32
|
+
return (`${key.alphaMaskEnabled ? 'm' : '-'}` +
|
|
33
|
+
`${key.hasBaseColorMap ? 'b' : '-'}` +
|
|
34
|
+
`${key.hasNormalMap ? 'n' : '-'}` +
|
|
35
|
+
`${key.hasMetallicRoughnessMap ? 'r' : '-'}` +
|
|
36
|
+
`${key.hasOcclusionMap ? 'o' : '-'}` +
|
|
37
|
+
`${key.hasEmissiveMap ? 'e' : '-'}` +
|
|
38
|
+
`${key.hasAlphaMap ? 'a' : '-'}` +
|
|
39
|
+
`${key.hasUvTransform ? 'u' : '-'}` +
|
|
40
|
+
`:${key.clearcoatEnabled ? 'C' : '-'}` +
|
|
41
|
+
`${key.sheenEnabled ? 'S' : '-'}` +
|
|
42
|
+
`${key.anisotropyEnabled ? 'A' : '-'}` +
|
|
43
|
+
`${key.iridescenceEnabled ? 'I' : '-'}` +
|
|
44
|
+
`${key.specularEnabled ? 'P' : '-'}` +
|
|
45
|
+
`${key.subsurfaceEnabled ? 'U' : '-'}` +
|
|
46
|
+
`${key.transmissionEnabled ? 'T' : '-'}` +
|
|
47
|
+
`${key.hasSkin ? 'k' : '-'}`);
|
|
48
|
+
}
|
|
49
|
+
// Builds the leading "#version 300 es\n#define ..." block for a define key, to be prepended to the
|
|
50
|
+
// vertex and fragment prelude bodies before compile. Pure string assembly; the same key always
|
|
51
|
+
// yields the same source, which is what makes the program cache by define key sound.
|
|
52
|
+
export function buildGlPbrDefineSource(key) {
|
|
53
|
+
let defines = `#version 300 es\n#define MAX_FORWARD_LIGHTS ${MAX_FORWARD_LIGHTS}\n`;
|
|
54
|
+
if (key.alphaMaskEnabled)
|
|
55
|
+
defines += '#define ALPHA_MASK\n';
|
|
56
|
+
if (key.hasBaseColorMap)
|
|
57
|
+
defines += '#define HAS_BASE_COLOR_MAP\n';
|
|
58
|
+
if (key.hasUvTransform)
|
|
59
|
+
defines += '#define HAS_UV_TRANSFORM\n';
|
|
60
|
+
if (key.hasNormalMap)
|
|
61
|
+
defines += '#define HAS_NORMAL_MAP\n';
|
|
62
|
+
if (key.hasMetallicRoughnessMap)
|
|
63
|
+
defines += '#define HAS_METALLIC_ROUGHNESS_MAP\n';
|
|
64
|
+
if (key.hasOcclusionMap)
|
|
65
|
+
defines += '#define HAS_OCCLUSION_MAP\n';
|
|
66
|
+
if (key.hasEmissiveMap)
|
|
67
|
+
defines += '#define HAS_EMISSIVE_MAP\n';
|
|
68
|
+
if (key.hasAlphaMap)
|
|
69
|
+
defines += '#define HAS_ALPHA_MAP\n';
|
|
70
|
+
if (key.clearcoatEnabled)
|
|
71
|
+
defines += '#define CLEARCOAT\n';
|
|
72
|
+
if (key.sheenEnabled)
|
|
73
|
+
defines += '#define SHEEN\n';
|
|
74
|
+
if (key.anisotropyEnabled)
|
|
75
|
+
defines += '#define ANISOTROPY\n';
|
|
76
|
+
if (key.iridescenceEnabled)
|
|
77
|
+
defines += '#define IRIDESCENCE\n';
|
|
78
|
+
if (key.specularEnabled)
|
|
79
|
+
defines += '#define SPECULAR_EXT\n';
|
|
80
|
+
if (key.subsurfaceEnabled)
|
|
81
|
+
defines += '#define SUBSURFACE\n';
|
|
82
|
+
if (key.transmissionEnabled)
|
|
83
|
+
defines += '#define TRANSMISSION\n';
|
|
84
|
+
if (key.hasSkin)
|
|
85
|
+
defines += '#define HAS_SKIN\n';
|
|
86
|
+
return defines;
|
|
87
|
+
}
|
|
88
|
+
// The fragment shader body (everything after the "#version 300 es" + defines block). Implements
|
|
89
|
+
// Cook-Torrance GGX/Smith/Fresnel-Schlick over one directional + one ambient light and writes
|
|
90
|
+
// linear HDR radiance to fragColor, plus the extension lobes behind their #ifdefs.
|
|
91
|
+
export function getGlPbrFragmentSource() {
|
|
92
|
+
return PBR_FRAGMENT_BODY;
|
|
93
|
+
}
|
|
94
|
+
// The full fragment source for a define key (define block + body), ready to hand to the GL
|
|
95
|
+
// compiler. Convenience over buildGlPbrDefineSource + getGlPbrFragmentSource.
|
|
96
|
+
export function getGlPbrFragmentSourceForKey(key) {
|
|
97
|
+
return buildGlPbrDefineSource(key) + PBR_FRAGMENT_BODY;
|
|
98
|
+
}
|
|
99
|
+
// The vertex shader body (everything after the "#version 300 es" + defines block). Transforms the
|
|
100
|
+
// canonical PBR vertex record (position/normal/tangent/uv0) by the model and view-projection
|
|
101
|
+
// matrices and passes world-space position, normal, tangent, and uv to the fragment scene2d.
|
|
102
|
+
export function getGlPbrVertexSource() {
|
|
103
|
+
return PBR_VERTEX_BODY;
|
|
104
|
+
}
|
|
105
|
+
// The full vertex source for a define key (define block + optional skin declarations + body), ready to
|
|
106
|
+
// hand to the GL compiler. The skin GLSL is vertex-only (its `in` attributes are illegal in a fragment
|
|
107
|
+
// shader), so it is spliced here rather than into the shared define block.
|
|
108
|
+
export function getGlPbrVertexSourceForKey(key) {
|
|
109
|
+
return buildGlPbrDefineSource(key) + (key.hasSkin ? GL_SKIN_VERTEX_DECLARATIONS_GLSL : '') + PBR_VERTEX_BODY;
|
|
110
|
+
}
|
|
111
|
+
const PBR_VERTEX_BODY = `
|
|
112
|
+
layout(location = 0) in vec3 a_position;
|
|
113
|
+
layout(location = 1) in vec3 a_normal;
|
|
114
|
+
layout(location = 2) in vec4 a_tangent;
|
|
115
|
+
layout(location = 3) in vec2 a_uv0;
|
|
116
|
+
|
|
117
|
+
uniform mat4 u_viewProjection;
|
|
118
|
+
uniform mat4 u_model;
|
|
119
|
+
uniform mat3 u_normalMatrix;
|
|
120
|
+
${GL_UV_TRANSFORM_VERTEX_GLSL}
|
|
121
|
+
out vec3 v_worldPosition;
|
|
122
|
+
out vec3 v_normal;
|
|
123
|
+
out vec4 v_tangent;
|
|
124
|
+
out vec2 v_uv0;
|
|
125
|
+
|
|
126
|
+
void main() {
|
|
127
|
+
#ifdef HAS_SKIN
|
|
128
|
+
mat4 skin = skinMatrix();
|
|
129
|
+
vec4 localPosition = skin * vec4(a_position, 1.0);
|
|
130
|
+
vec3 localNormal = mat3(skin) * a_normal;
|
|
131
|
+
vec3 localTangent = mat3(skin) * a_tangent.xyz;
|
|
132
|
+
#else
|
|
133
|
+
vec4 localPosition = vec4(a_position, 1.0);
|
|
134
|
+
vec3 localNormal = a_normal;
|
|
135
|
+
vec3 localTangent = a_tangent.xyz;
|
|
136
|
+
#endif
|
|
137
|
+
vec4 worldPosition = u_model * localPosition;
|
|
138
|
+
v_worldPosition = worldPosition.xyz;
|
|
139
|
+
v_normal = u_normalMatrix * localNormal;
|
|
140
|
+
v_tangent = vec4(u_normalMatrix * localTangent, a_tangent.w);
|
|
141
|
+
v_uv0 = applyUvTransform(a_uv0);
|
|
142
|
+
gl_Position = u_viewProjection * worldPosition;
|
|
143
|
+
}
|
|
144
|
+
`;
|
|
145
|
+
const PBR_FRAGMENT_BODY = `
|
|
146
|
+
precision highp float;
|
|
147
|
+
|
|
148
|
+
in vec3 v_worldPosition;
|
|
149
|
+
in vec3 v_normal;
|
|
150
|
+
in vec4 v_tangent;
|
|
151
|
+
in vec2 v_uv0;
|
|
152
|
+
|
|
153
|
+
uniform vec4 u_baseColor;
|
|
154
|
+
uniform float u_metallic;
|
|
155
|
+
uniform float u_roughness;
|
|
156
|
+
uniform float u_normalScale;
|
|
157
|
+
uniform vec3 u_emissive;
|
|
158
|
+
uniform float u_emissiveStrength;
|
|
159
|
+
uniform float u_occlusionStrength;
|
|
160
|
+
uniform float u_alphaCutoff;
|
|
161
|
+
uniform vec3 u_cameraPosition;
|
|
162
|
+
|
|
163
|
+
uniform vec4 u_directional;
|
|
164
|
+
uniform vec4 u_directionalRadiance;
|
|
165
|
+
uniform vec3 u_ambientRadiance;
|
|
166
|
+
uniform float u_directionalCount;
|
|
167
|
+
uniform float u_ambientCount;
|
|
168
|
+
|
|
169
|
+
// Punctual (point/spot/hemisphere) forward-light arrays — layout mirrors Scene3DLightBlock.data exactly
|
|
170
|
+
// (packScene3DLightBlock), matching GL_MESH_LIGHT_BLOCK_GLSL used by the classic prelude. Fixed
|
|
171
|
+
// MAX_FORWARD_LIGHTS-wide; each count bounds its loop.
|
|
172
|
+
// point[i] = u_pointLights[i*2+0]={pos.xyz,range}, [i*2+1]={radiance.rgb,invSqrRange}
|
|
173
|
+
// spot[i] = u_spotLights[i*4+0..1] as point, [i*4+2]={dir.xyz,_}, [i*4+3]={cosInner,cosOuter,_,_}
|
|
174
|
+
// hemisphere[i] = u_hemisphereLights[i*3+0]={sky.rgb,_}, [i*3+1]={ground.rgb,_}, [i*3+2]={up.xyz,_}
|
|
175
|
+
uniform vec4 u_pointLights[MAX_FORWARD_LIGHTS * 2];
|
|
176
|
+
uniform vec4 u_spotLights[MAX_FORWARD_LIGHTS * 4];
|
|
177
|
+
uniform vec4 u_hemisphereLights[MAX_FORWARD_LIGHTS * 3];
|
|
178
|
+
uniform int u_pointCount;
|
|
179
|
+
uniform int u_spotCount;
|
|
180
|
+
uniform int u_hemisphereCount;
|
|
181
|
+
|
|
182
|
+
uniform sampler2D u_shadowMap; // directional shadow depth map
|
|
183
|
+
uniform mat4 u_shadowMatrix; // world -> shadow light-clip
|
|
184
|
+
uniform float u_shadowEnabled; // 0 or 1 — gates shadow sampling
|
|
185
|
+
|
|
186
|
+
// Directional shadow factor (1.0 = lit, 0.0 = shadowed) with 3x3 PCF; fragments outside the shadow
|
|
187
|
+
// frustum read as lit. Multiplied into the directional term below.
|
|
188
|
+
float sampleDirectionalShadow(vec3 worldPos) {
|
|
189
|
+
if (u_shadowEnabled < 0.5) return 1.0;
|
|
190
|
+
vec4 clip = u_shadowMatrix * vec4(worldPos, 1.0);
|
|
191
|
+
vec3 ndc = clip.xyz / clip.w;
|
|
192
|
+
vec3 uvz = ndc * 0.5 + 0.5;
|
|
193
|
+
if (uvz.x < 0.0 || uvz.x > 1.0 || uvz.y < 0.0 || uvz.y > 1.0 || uvz.z > 1.0) return 1.0;
|
|
194
|
+
float current = uvz.z - 0.0025;
|
|
195
|
+
vec2 texel = 1.0 / vec2(textureSize(u_shadowMap, 0));
|
|
196
|
+
float sum = 0.0;
|
|
197
|
+
for (int x = -1; x <= 1; ++x) {
|
|
198
|
+
for (int y = -1; y <= 1; ++y) {
|
|
199
|
+
float closest = texture(u_shadowMap, uvz.xy + vec2(float(x), float(y)) * texel).r;
|
|
200
|
+
sum += current <= closest ? 1.0 : 0.0;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return sum / 9.0;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
uniform samplerCube u_iblIrradiance; // diffuse irradiance cubemap
|
|
207
|
+
uniform samplerCube u_iblPrefiltered; // roughness-mipped prefiltered specular cubemap
|
|
208
|
+
uniform sampler2D u_iblBrdf; // split-sum BRDF integration LUT (RG)
|
|
209
|
+
uniform float u_iblEnabled; // 0 or 1 — gates image-based ambient
|
|
210
|
+
uniform float u_iblIntensity; // environment contribution scale
|
|
211
|
+
uniform float u_iblMaxMip; // highest prefiltered mip index (roughness 1.0)
|
|
212
|
+
|
|
213
|
+
// Roughness-aware Fresnel for the IBL specular term (Sébastien Lagarde): rougher surfaces reflect less
|
|
214
|
+
// at grazing angles than the smooth Schlick approximation.
|
|
215
|
+
vec3 fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness) {
|
|
216
|
+
return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Image-based ambient via the split-sum approximation: diffuse irradiance over the albedo plus
|
|
220
|
+
// prefiltered specular weighted by the BRDF LUT. Replaces the flat ambient term when an environment
|
|
221
|
+
// is baked (bakeGlEnvironmentIbl). All three cubemap/LUT samples are already linear (baked from
|
|
222
|
+
// sRGB-decoded sources), so no decode here.
|
|
223
|
+
vec3 sampleIblAmbient(vec3 N, vec3 V, float rough, vec3 F0, vec3 diffuseColor, float occ) {
|
|
224
|
+
float nv = max(dot(N, V), 1e-4);
|
|
225
|
+
vec3 F = fresnelSchlickRoughness(nv, F0, rough);
|
|
226
|
+
vec3 diffuse = texture(u_iblIrradiance, N).rgb * diffuseColor;
|
|
227
|
+
vec3 R = reflect(-V, N);
|
|
228
|
+
vec3 prefiltered = textureLod(u_iblPrefiltered, R, rough * u_iblMaxMip).rgb;
|
|
229
|
+
vec2 brdf = texture(u_iblBrdf, vec2(nv, rough)).rg;
|
|
230
|
+
vec3 specular = prefiltered * (F * brdf.x + brdf.y);
|
|
231
|
+
return ((vec3(1.0) - F) * diffuse + specular) * occ * u_iblIntensity;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
#ifdef HAS_BASE_COLOR_MAP
|
|
235
|
+
uniform sampler2D u_baseColorMap;
|
|
236
|
+
#endif
|
|
237
|
+
#ifdef HAS_NORMAL_MAP
|
|
238
|
+
uniform sampler2D u_normalMap;
|
|
239
|
+
#endif
|
|
240
|
+
#ifdef HAS_METALLIC_ROUGHNESS_MAP
|
|
241
|
+
uniform sampler2D u_metallicRoughnessMap;
|
|
242
|
+
#endif
|
|
243
|
+
#ifdef HAS_OCCLUSION_MAP
|
|
244
|
+
uniform sampler2D u_occlusionMap;
|
|
245
|
+
#endif
|
|
246
|
+
#ifdef HAS_EMISSIVE_MAP
|
|
247
|
+
uniform sampler2D u_emissiveMap;
|
|
248
|
+
#endif
|
|
249
|
+
#ifdef HAS_ALPHA_MAP
|
|
250
|
+
uniform sampler2D u_alphaMap;
|
|
251
|
+
#endif
|
|
252
|
+
|
|
253
|
+
#ifdef CLEARCOAT
|
|
254
|
+
uniform float u_clearcoat;
|
|
255
|
+
uniform float u_clearcoatRoughness;
|
|
256
|
+
#endif
|
|
257
|
+
#ifdef SHEEN
|
|
258
|
+
uniform vec3 u_sheenColor;
|
|
259
|
+
uniform float u_sheenRoughness;
|
|
260
|
+
#endif
|
|
261
|
+
#ifdef ANISOTROPY
|
|
262
|
+
uniform float u_anisotropyStrength;
|
|
263
|
+
uniform float u_anisotropyRotation;
|
|
264
|
+
#endif
|
|
265
|
+
#ifdef IRIDESCENCE
|
|
266
|
+
uniform float u_iridescence;
|
|
267
|
+
uniform float u_iridescenceIor;
|
|
268
|
+
uniform float u_iridescenceThickness;
|
|
269
|
+
#endif
|
|
270
|
+
#ifdef SPECULAR_EXT
|
|
271
|
+
uniform float u_specular;
|
|
272
|
+
uniform vec3 u_specularColor;
|
|
273
|
+
#endif
|
|
274
|
+
#ifdef SUBSURFACE
|
|
275
|
+
uniform float u_subsurface;
|
|
276
|
+
uniform vec3 u_subsurfaceColor;
|
|
277
|
+
uniform float u_thickness;
|
|
278
|
+
#endif
|
|
279
|
+
#ifdef TRANSMISSION
|
|
280
|
+
uniform float u_transmission;
|
|
281
|
+
uniform vec3 u_attenuationColor;
|
|
282
|
+
#endif
|
|
283
|
+
|
|
284
|
+
uniform float u_objectAlpha;
|
|
285
|
+
|
|
286
|
+
out vec4 fragColor;
|
|
287
|
+
|
|
288
|
+
const float PI = 3.14159265359;
|
|
289
|
+
|
|
290
|
+
// sRgb albedo texels are gamma-encoded; decode to linear before lighting.
|
|
291
|
+
vec3 srgbToLinear(vec3 c) {
|
|
292
|
+
vec3 lo = c / 12.92;
|
|
293
|
+
vec3 hi = pow((c + 0.055) / 1.055, vec3(2.4));
|
|
294
|
+
return mix(lo, hi, step(0.04045, c));
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
float distributionGgx(float nDotH, float roughness) {
|
|
298
|
+
float a = roughness * roughness;
|
|
299
|
+
float a2 = a * a;
|
|
300
|
+
float d = nDotH * nDotH * (a2 - 1.0) + 1.0;
|
|
301
|
+
return a2 / max(PI * d * d, 1e-7);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
float visibilitySmith(float nDotV, float nDotL, float roughness) {
|
|
305
|
+
float a = roughness * roughness;
|
|
306
|
+
float k = a * 0.5;
|
|
307
|
+
float gv = nDotV / (nDotV * (1.0 - k) + k);
|
|
308
|
+
float gl = nDotL / (nDotL * (1.0 - k) + k);
|
|
309
|
+
return gv * gl;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
vec3 fresnelSchlick(float cosTheta, vec3 f0) {
|
|
313
|
+
return f0 + (1.0 - f0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
#ifdef ANISOTROPY
|
|
317
|
+
// Anisotropic GGX distribution (Burley): an elliptical lobe along the tangent (at) vs bitangent
|
|
318
|
+
// (ab) roughness axes. tDotH/bDotH are the half-vector projections onto the rotated tangent frame.
|
|
319
|
+
float distributionGgxAnisotropic(float nDotH, float tDotH, float bDotH, float at, float ab) {
|
|
320
|
+
float d = tDotH * tDotH / (at * at) + bDotH * bDotH / (ab * ab) + nDotH * nDotH;
|
|
321
|
+
return 1.0 / max(PI * at * ab * d * d, 1e-7);
|
|
322
|
+
}
|
|
323
|
+
#endif
|
|
324
|
+
|
|
325
|
+
#ifdef SHEEN
|
|
326
|
+
// Charlie ("inverted GGX") sheen distribution from Estevez & Kulla — a soft retroreflective lobe
|
|
327
|
+
// for cloth. Approximated visibility keeps the lobe energy-plausible without a lookup table.
|
|
328
|
+
float distributionCharlie(float nDotH, float roughness) {
|
|
329
|
+
float r = clamp(roughness, 0.07, 1.0);
|
|
330
|
+
float invR = 1.0 / r;
|
|
331
|
+
float cos2h = nDotH * nDotH;
|
|
332
|
+
float sin2h = max(1.0 - cos2h, 1e-4);
|
|
333
|
+
return (2.0 + invR) * pow(sin2h, invR * 0.5) / (2.0 * PI);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
float visibilitySheen(float nDotV, float nDotL) {
|
|
337
|
+
return 1.0 / max(4.0 * (nDotL + nDotV - nDotL * nDotV), 1e-4);
|
|
338
|
+
}
|
|
339
|
+
#endif
|
|
340
|
+
|
|
341
|
+
#ifdef IRIDESCENCE
|
|
342
|
+
// Thin-film interference: shift F0 toward a view-/thickness-dependent hue. A compact sinusoidal
|
|
343
|
+
// approximation of the optical-path-difference phase per RGB band (sample-viewer style), enough to
|
|
344
|
+
// produce a plausible soap-bubble rainbow without the full Airy summation.
|
|
345
|
+
vec3 iridescentFresnel(float cosTheta, vec3 f0, float thicknessNm, float filmIor) {
|
|
346
|
+
float opd = 2.0 * filmIor * thicknessNm * cosTheta;
|
|
347
|
+
vec3 bands = vec3(580.0, 540.0, 460.0); // approximate R/G/B wavelengths (nm)
|
|
348
|
+
vec3 phase = 2.0 * PI * opd / bands;
|
|
349
|
+
vec3 shift = 0.5 + 0.5 * cos(phase);
|
|
350
|
+
vec3 base = fresnelSchlick(cosTheta, f0);
|
|
351
|
+
return mix(base, shift, clamp(thicknessNm / 1000.0, 0.0, 1.0));
|
|
352
|
+
}
|
|
353
|
+
#endif
|
|
354
|
+
|
|
355
|
+
// Smooth inverse-square range window (glTF/UE4): 1 near the light, eased to 0 at the range. invSqrRange
|
|
356
|
+
// is 1/range^2 (0 = infinite range, no cutoff); dist2 is the squared surface->light distance.
|
|
357
|
+
float rangeWindow(float dist2, float invSqrRange) {
|
|
358
|
+
float factor = dist2 * invSqrRange;
|
|
359
|
+
float windowed = clamp(1.0 - factor * factor, 0.0, 1.0);
|
|
360
|
+
return windowed * windowed;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// The full Cook-Torrance shading (plus every enabled extension lobe) for ONE light. Directional,
|
|
364
|
+
// point, and spot lights all route through this one BRDF so punctual lights never fork the shading
|
|
365
|
+
// model — the caller passes the surface->light direction L and that light's (attenuated, cone-scaled)
|
|
366
|
+
// radiance. The anisotropic tangent frame is rebuilt here per light from the surface tangent frame so
|
|
367
|
+
// the function stays self-contained; f0/diffuseColor/roughness/metallic are the finalized surface
|
|
368
|
+
// values from main. Returns the light's linear radiance contribution (shadowing applied by the caller).
|
|
369
|
+
vec3 shadePbrPunctual(vec3 N, vec3 V, vec3 tangentDir, vec3 bitangentDir, vec3 L, vec3 lightColor,
|
|
370
|
+
vec3 f0, vec3 diffuseColor, float roughness, float metallic) {
|
|
371
|
+
float nDotV = max(dot(N, V), 1e-4);
|
|
372
|
+
vec3 halfVec = normalize(V + L);
|
|
373
|
+
float nDotL = max(dot(N, L), 0.0);
|
|
374
|
+
float nDotH = max(dot(N, halfVec), 0.0);
|
|
375
|
+
float vDotH = max(dot(V, halfVec), 0.0);
|
|
376
|
+
|
|
377
|
+
#ifdef ANISOTROPY
|
|
378
|
+
float cosR = cos(u_anisotropyRotation);
|
|
379
|
+
float sinR = sin(u_anisotropyRotation);
|
|
380
|
+
vec3 anisoT = normalize(cosR * tangentDir + sinR * bitangentDir);
|
|
381
|
+
vec3 anisoB = normalize(cross(N, anisoT));
|
|
382
|
+
float aniso = clamp(u_anisotropyStrength, 0.0, 1.0);
|
|
383
|
+
float at = max(roughness * roughness * (1.0 + aniso), 1e-3);
|
|
384
|
+
float ab = max(roughness * roughness * (1.0 - aniso), 1e-3);
|
|
385
|
+
float tDotH = dot(anisoT, halfVec);
|
|
386
|
+
float bDotH = dot(anisoB, halfVec);
|
|
387
|
+
float d = distributionGgxAnisotropic(nDotH, tDotH, bDotH, at, ab);
|
|
388
|
+
#else
|
|
389
|
+
float d = distributionGgx(nDotH, roughness);
|
|
390
|
+
#endif
|
|
391
|
+
float vis = visibilitySmith(nDotV, nDotL, roughness);
|
|
392
|
+
vec3 fresnel = fresnelSchlick(vDotH, f0);
|
|
393
|
+
|
|
394
|
+
vec3 specular = d * vis * fresnel;
|
|
395
|
+
vec3 kd = (1.0 - fresnel) * (1.0 - metallic);
|
|
396
|
+
vec3 brdf = kd * diffuseColor / PI + specular;
|
|
397
|
+
vec3 direct = brdf * lightColor * nDotL;
|
|
398
|
+
|
|
399
|
+
#ifdef SUBSURFACE
|
|
400
|
+
// Wrapped-diffuse subsurface approximation (non-interop): a soft back-/side-lit wrap term tinted by
|
|
401
|
+
// the subsurface color, scaled by thickness (thinner = more translucency).
|
|
402
|
+
float wrap = clamp((dot(N, L) + 0.5) / 2.25, 0.0, 1.0);
|
|
403
|
+
float translucency = u_subsurface / (1.0 + u_thickness);
|
|
404
|
+
direct += translucency * wrap * u_subsurfaceColor * diffuseColor * lightColor;
|
|
405
|
+
#endif
|
|
406
|
+
|
|
407
|
+
#ifdef SHEEN
|
|
408
|
+
// Charlie sheen lobe added on top of the base specular for cloth/fabric retroreflection.
|
|
409
|
+
float sheenD = distributionCharlie(nDotH, u_sheenRoughness);
|
|
410
|
+
float sheenV = visibilitySheen(nDotV, nDotL);
|
|
411
|
+
direct += u_sheenColor * sheenD * sheenV * lightColor * nDotL;
|
|
412
|
+
#endif
|
|
413
|
+
|
|
414
|
+
#ifdef CLEARCOAT
|
|
415
|
+
// A second, always-dielectric GGX lobe (F0 = 0.04) over the base layer, with its own roughness.
|
|
416
|
+
// Energy from the clearcoat reflection attenuates the layers beneath it.
|
|
417
|
+
float ccRough = clamp(u_clearcoatRoughness, 0.04, 1.0);
|
|
418
|
+
float ccD = distributionGgx(nDotH, ccRough);
|
|
419
|
+
float ccVis = visibilitySmith(nDotV, nDotL, ccRough);
|
|
420
|
+
vec3 ccF = fresnelSchlick(vDotH, vec3(0.04)) * u_clearcoat;
|
|
421
|
+
vec3 ccSpec = ccD * ccVis * ccF * lightColor * nDotL;
|
|
422
|
+
direct = direct * (1.0 - ccF) + ccSpec;
|
|
423
|
+
#endif
|
|
424
|
+
|
|
425
|
+
return direct;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
void main() {
|
|
429
|
+
vec4 baseColor = u_baseColor;
|
|
430
|
+
#ifdef HAS_BASE_COLOR_MAP
|
|
431
|
+
vec4 sampled = texture(u_baseColorMap, v_uv0);
|
|
432
|
+
baseColor.rgb *= srgbToLinear(sampled.rgb);
|
|
433
|
+
baseColor.a *= sampled.a;
|
|
434
|
+
#endif
|
|
435
|
+
|
|
436
|
+
// Dedicated coverage (opacity) map: its green channel is linear data, multiplied into alpha before
|
|
437
|
+
// the alpha-mask cutoff so 'mask' cutout and 'blend' transparency both see the combined coverage.
|
|
438
|
+
#ifdef HAS_ALPHA_MAP
|
|
439
|
+
baseColor.a *= texture(u_alphaMap, v_uv0).g;
|
|
440
|
+
#endif
|
|
441
|
+
|
|
442
|
+
#ifdef ALPHA_MASK
|
|
443
|
+
if (baseColor.a < u_alphaCutoff) discard;
|
|
444
|
+
#endif
|
|
445
|
+
|
|
446
|
+
vec3 geometricNormal = normalize(v_normal);
|
|
447
|
+
if (!gl_FrontFacing) geometricNormal = -geometricNormal;
|
|
448
|
+
|
|
449
|
+
#if defined(HAS_NORMAL_MAP) || defined(ANISOTROPY)
|
|
450
|
+
vec3 tangent = normalize(v_tangent.xyz - geometricNormal * dot(v_tangent.xyz, geometricNormal));
|
|
451
|
+
vec3 bitangent = cross(geometricNormal, tangent) * v_tangent.w;
|
|
452
|
+
#else
|
|
453
|
+
vec3 tangent = vec3(1.0, 0.0, 0.0);
|
|
454
|
+
vec3 bitangent = vec3(0.0, 1.0, 0.0);
|
|
455
|
+
#endif
|
|
456
|
+
|
|
457
|
+
vec3 normal = geometricNormal;
|
|
458
|
+
#ifdef HAS_NORMAL_MAP
|
|
459
|
+
vec3 tangentNormal = texture(u_normalMap, v_uv0).xyz * 2.0 - 1.0;
|
|
460
|
+
tangentNormal.xy *= u_normalScale;
|
|
461
|
+
mat3 tbn = mat3(tangent, bitangent, geometricNormal);
|
|
462
|
+
normal = normalize(tbn * tangentNormal);
|
|
463
|
+
#endif
|
|
464
|
+
|
|
465
|
+
vec3 viewDir = normalize(u_cameraPosition - v_worldPosition);
|
|
466
|
+
float nDotV = max(dot(normal, viewDir), 1e-4);
|
|
467
|
+
|
|
468
|
+
float roughness = clamp(u_roughness, 0.04, 1.0);
|
|
469
|
+
float metallic = clamp(u_metallic, 0.0, 1.0);
|
|
470
|
+
#ifdef HAS_METALLIC_ROUGHNESS_MAP
|
|
471
|
+
// glTF packing: roughness in G, metallic in B (R is occlusion if combined, ignored here).
|
|
472
|
+
vec4 mr = texture(u_metallicRoughnessMap, v_uv0);
|
|
473
|
+
roughness = clamp(roughness * mr.g, 0.04, 1.0);
|
|
474
|
+
metallic = clamp(metallic * mr.b, 0.0, 1.0);
|
|
475
|
+
#endif
|
|
476
|
+
|
|
477
|
+
float occlusion = 1.0;
|
|
478
|
+
#ifdef HAS_OCCLUSION_MAP
|
|
479
|
+
// Occlusion in R; strength lerps between full ambient (1.0) and the sampled value.
|
|
480
|
+
float ao = texture(u_occlusionMap, v_uv0).r;
|
|
481
|
+
occlusion = mix(1.0, ao, clamp(u_occlusionStrength, 0.0, 1.0));
|
|
482
|
+
#endif
|
|
483
|
+
|
|
484
|
+
vec3 albedo = baseColor.rgb;
|
|
485
|
+
vec3 f0 = mix(vec3(0.04), albedo, metallic);
|
|
486
|
+
|
|
487
|
+
#ifdef SPECULAR_EXT
|
|
488
|
+
// KHR_materials_specular: scale and tint the dielectric F0 (metals keep their albedo F0).
|
|
489
|
+
vec3 dielectricF0 = min(0.04 * u_specularColor, vec3(1.0)) * u_specular;
|
|
490
|
+
f0 = mix(dielectricF0, albedo, metallic);
|
|
491
|
+
#endif
|
|
492
|
+
|
|
493
|
+
#ifdef IRIDESCENCE
|
|
494
|
+
f0 = mix(f0, iridescentFresnel(nDotV, f0, u_iridescenceThickness, u_iridescenceIor), u_iridescence);
|
|
495
|
+
#endif
|
|
496
|
+
|
|
497
|
+
vec3 diffuseColor = albedo * (1.0 - metallic);
|
|
498
|
+
|
|
499
|
+
vec3 radiance = vec3(0.0);
|
|
500
|
+
|
|
501
|
+
// Directional light: -direction is the surface-to-light vector (light travels along direction).
|
|
502
|
+
if (u_directionalCount > 0.5) {
|
|
503
|
+
vec3 lightDir = normalize(-u_directional.xyz);
|
|
504
|
+
vec3 direct = shadePbrPunctual(normal, viewDir, tangent, bitangent, lightDir,
|
|
505
|
+
u_directionalRadiance.rgb, f0, diffuseColor, roughness, metallic);
|
|
506
|
+
radiance += direct * sampleDirectionalShadow(v_worldPosition);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// Point lights: surface->light direction with a smooth inverse-square range falloff, same BRDF.
|
|
510
|
+
for (int i = 0; i < MAX_FORWARD_LIGHTS; i++) {
|
|
511
|
+
if (i >= u_pointCount) break;
|
|
512
|
+
vec3 toLight = u_pointLights[i * 2 + 0].xyz - v_worldPosition;
|
|
513
|
+
float dist2 = dot(toLight, toLight);
|
|
514
|
+
vec3 lightDir = toLight * inversesqrt(max(dist2, 1e-8));
|
|
515
|
+
float atten = rangeWindow(dist2, u_pointLights[i * 2 + 1].w) / max(dist2, 1e-4);
|
|
516
|
+
radiance += shadePbrPunctual(normal, viewDir, tangent, bitangent, lightDir,
|
|
517
|
+
u_pointLights[i * 2 + 1].rgb * atten, f0, diffuseColor, roughness, metallic);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// Spot lights: point attenuation times a smooth cone falloff between the inner/outer cosines.
|
|
521
|
+
for (int i = 0; i < MAX_FORWARD_LIGHTS; i++) {
|
|
522
|
+
if (i >= u_spotCount) break;
|
|
523
|
+
vec3 toLight = u_spotLights[i * 4 + 0].xyz - v_worldPosition;
|
|
524
|
+
float dist2 = dot(toLight, toLight);
|
|
525
|
+
vec3 lightDir = toLight * inversesqrt(max(dist2, 1e-8));
|
|
526
|
+
float atten = rangeWindow(dist2, u_spotLights[i * 4 + 1].w) / max(dist2, 1e-4);
|
|
527
|
+
float cone = smoothstep(u_spotLights[i * 4 + 3].y, u_spotLights[i * 4 + 3].x,
|
|
528
|
+
dot(normalize(u_spotLights[i * 4 + 2].xyz), -lightDir));
|
|
529
|
+
radiance += shadePbrPunctual(normal, viewDir, tangent, bitangent, lightDir,
|
|
530
|
+
u_spotLights[i * 4 + 1].rgb * atten * cone, f0, diffuseColor, roughness, metallic);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// Ambient term: image-based lighting (diffuse irradiance + prefiltered specular) when an environment
|
|
534
|
+
// is baked, else the flat ambient irradiance over the diffuse albedo. Both are attenuated by AO.
|
|
535
|
+
if (u_iblEnabled > 0.5) {
|
|
536
|
+
radiance += sampleIblAmbient(normal, viewDir, roughness, f0, diffuseColor, occlusion);
|
|
537
|
+
} else if (u_ambientCount > 0.5) {
|
|
538
|
+
radiance += diffuseColor * u_ambientRadiance * occlusion;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Hemisphere fill: sky/ground gradient blended by the normal's vertical component, AO-attenuated.
|
|
542
|
+
for (int i = 0; i < MAX_FORWARD_LIGHTS; i++) {
|
|
543
|
+
if (i >= u_hemisphereCount) break;
|
|
544
|
+
float f = 0.5 + 0.5 * dot(normal, u_hemisphereLights[i * 3 + 2].xyz);
|
|
545
|
+
radiance += mix(u_hemisphereLights[i * 3 + 1].rgb, u_hemisphereLights[i * 3 + 0].rgb, f)
|
|
546
|
+
* diffuseColor * occlusion;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
vec3 emissive = u_emissive;
|
|
550
|
+
#ifdef HAS_EMISSIVE_MAP
|
|
551
|
+
emissive *= srgbToLinear(texture(u_emissiveMap, v_uv0).rgb);
|
|
552
|
+
#endif
|
|
553
|
+
radiance += emissive * u_emissiveStrength;
|
|
554
|
+
|
|
555
|
+
float alpha = baseColor.a;
|
|
556
|
+
#ifdef TRANSMISSION
|
|
557
|
+
// Phase-5 approximation: a true refractive path needs the opaque-scene-color capture pass to
|
|
558
|
+
// sample what lies behind the surface. Until then, model transmission as added translucency —
|
|
559
|
+
// attenuate coverage by the transmission factor and tint the surface by the attenuation color.
|
|
560
|
+
// TODO Phase 5: replace with a refracted background sample + Beer-Lambert volume absorption.
|
|
561
|
+
radiance *= mix(vec3(1.0), u_attenuationColor, u_transmission);
|
|
562
|
+
alpha *= (1.0 - u_transmission);
|
|
563
|
+
#endif
|
|
564
|
+
|
|
565
|
+
fragColor = vec4(radiance, alpha);
|
|
566
|
+
fragColor.a *= u_objectAlpha;
|
|
567
|
+
}
|
|
568
|
+
`;
|
|
569
|
+
//# sourceMappingURL=glPbrPrelude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glPbrPrelude.js","sourceRoot":"","sources":["../src/glPbrPrelude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlPbrProgram, GlRenderState, GlPbrDefineKey } from '@flighthq/types';
|
|
2
|
+
export declare function compileGlPbrProgram(gl: WebGL2RenderingContext, key: Readonly<GlPbrDefineKey>): GlPbrProgram;
|
|
3
|
+
export declare function ensureGlPbrProgram(state: GlRenderState, key: Readonly<GlPbrDefineKey>): GlPbrProgram;
|
|
4
|
+
//# sourceMappingURL=glPbrProgramCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glPbrProgramCache.d.ts","sourceRoot":"","sources":["../src/glPbrProgramCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AASnF,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,sBAAsB,EAAE,GAAG,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,YAAY,CA0C3G;AAKD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,YAAY,CAQpG"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { resolveGlLitLocations } from './glLitProgram';
|
|
2
|
+
import { compileGlProgram, ensureGlScene3DProgram } from './glMeshProgram';
|
|
3
|
+
import { buildGlPbrDefineKey, getGlPbrFragmentSourceForKey, getGlPbrVertexSourceForKey } from './glPbrPrelude';
|
|
4
|
+
import { getGlScene3DRuntime } from './glScene3DRuntime';
|
|
5
|
+
// Compiles the StandardPbr uber-shader for a define key, links it, and resolves its uniform
|
|
6
|
+
// locations. Pure GL work — no caching — used by ensureGlPbrProgram. Throws on a compile/link
|
|
7
|
+
// failure, which is a programmer error (a malformed prelude), not an expected runtime condition.
|
|
8
|
+
export function compileGlPbrProgram(gl, key) {
|
|
9
|
+
const vertexSource = getGlPbrVertexSourceForKey(key);
|
|
10
|
+
const fragmentSource = getGlPbrFragmentSourceForKey(key);
|
|
11
|
+
const program = compileGlProgram(gl, vertexSource, fragmentSource);
|
|
12
|
+
return {
|
|
13
|
+
...resolveGlLitLocations(gl, program),
|
|
14
|
+
program,
|
|
15
|
+
locAlphaCutoff: gl.getUniformLocation(program, 'u_alphaCutoff'),
|
|
16
|
+
locAlphaMap: gl.getUniformLocation(program, 'u_alphaMap'),
|
|
17
|
+
locAnisotropyRotation: gl.getUniformLocation(program, 'u_anisotropyRotation'),
|
|
18
|
+
locAnisotropyStrength: gl.getUniformLocation(program, 'u_anisotropyStrength'),
|
|
19
|
+
locAttenuationColor: gl.getUniformLocation(program, 'u_attenuationColor'),
|
|
20
|
+
locBaseColor: gl.getUniformLocation(program, 'u_baseColor'),
|
|
21
|
+
locBaseColorMap: gl.getUniformLocation(program, 'u_baseColorMap'),
|
|
22
|
+
locClearcoat: gl.getUniformLocation(program, 'u_clearcoat'),
|
|
23
|
+
locClearcoatRoughness: gl.getUniformLocation(program, 'u_clearcoatRoughness'),
|
|
24
|
+
locEmissive: gl.getUniformLocation(program, 'u_emissive'),
|
|
25
|
+
locEmissiveMap: gl.getUniformLocation(program, 'u_emissiveMap'),
|
|
26
|
+
locEmissiveStrength: gl.getUniformLocation(program, 'u_emissiveStrength'),
|
|
27
|
+
locIridescence: gl.getUniformLocation(program, 'u_iridescence'),
|
|
28
|
+
locIridescenceIor: gl.getUniformLocation(program, 'u_iridescenceIor'),
|
|
29
|
+
locIridescenceThickness: gl.getUniformLocation(program, 'u_iridescenceThickness'),
|
|
30
|
+
locJointTexture: gl.getUniformLocation(program, 'u_jointTexture'),
|
|
31
|
+
locMetallic: gl.getUniformLocation(program, 'u_metallic'),
|
|
32
|
+
locMetallicRoughnessMap: gl.getUniformLocation(program, 'u_metallicRoughnessMap'),
|
|
33
|
+
locModel: gl.getUniformLocation(program, 'u_model'),
|
|
34
|
+
locNormalMap: gl.getUniformLocation(program, 'u_normalMap'),
|
|
35
|
+
locNormalMatrix: gl.getUniformLocation(program, 'u_normalMatrix'),
|
|
36
|
+
locNormalScale: gl.getUniformLocation(program, 'u_normalScale'),
|
|
37
|
+
locOcclusionMap: gl.getUniformLocation(program, 'u_occlusionMap'),
|
|
38
|
+
locOcclusionStrength: gl.getUniformLocation(program, 'u_occlusionStrength'),
|
|
39
|
+
locRoughness: gl.getUniformLocation(program, 'u_roughness'),
|
|
40
|
+
locSheenColor: gl.getUniformLocation(program, 'u_sheenColor'),
|
|
41
|
+
locSheenRoughness: gl.getUniformLocation(program, 'u_sheenRoughness'),
|
|
42
|
+
locSpecular: gl.getUniformLocation(program, 'u_specular'),
|
|
43
|
+
locSpecularColor: gl.getUniformLocation(program, 'u_specularColor'),
|
|
44
|
+
locSubsurface: gl.getUniformLocation(program, 'u_subsurface'),
|
|
45
|
+
locSubsurfaceColor: gl.getUniformLocation(program, 'u_subsurfaceColor'),
|
|
46
|
+
locThickness: gl.getUniformLocation(program, 'u_thickness'),
|
|
47
|
+
locTransmission: gl.getUniformLocation(program, 'u_transmission'),
|
|
48
|
+
locViewProjection: gl.getUniformLocation(program, 'u_viewProjection'),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Resolves the StandardPbr program for a define key, compiling and caching it on first use through
|
|
52
|
+
// the shared scene program cache under the `pbr:` family namespace, so each variant is compiled at
|
|
53
|
+
// most once per state and reused every frame.
|
|
54
|
+
export function ensureGlPbrProgram(state, key) {
|
|
55
|
+
// Fold the render-state skinned-run flag into the variant so a skinned draw of an otherwise-identical
|
|
56
|
+
// material compiles + caches its own HAS_SKIN program, without the material renderer knowing.
|
|
57
|
+
const fullKey = {
|
|
58
|
+
...key,
|
|
59
|
+
hasSkin: getGlScene3DRuntime(state).activeSkinnedRun,
|
|
60
|
+
};
|
|
61
|
+
return ensureGlScene3DProgram(state, `pbr:${buildGlPbrDefineKey(fullKey)}`, (gl) => compileGlPbrProgram(gl, fullKey));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=glPbrProgramCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glPbrProgramCache.js","sourceRoot":"","sources":["../src/glPbrProgramCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { GlRenderState, StandardPbrMaterialProperties, SurfaceMaterial, Texture, GlPbrDefineKey, GlPbrProgram } from '@flighthq/types';
|
|
2
|
+
export declare const GL_PBR_BASE_COLOR_TEXTURE_UNIT = 0;
|
|
3
|
+
export declare const GL_PBR_NORMAL_TEXTURE_UNIT = 1;
|
|
4
|
+
export declare const GL_PBR_METALLIC_ROUGHNESS_TEXTURE_UNIT = 2;
|
|
5
|
+
export declare const GL_PBR_OCCLUSION_TEXTURE_UNIT = 3;
|
|
6
|
+
export declare const GL_PBR_EMISSIVE_TEXTURE_UNIT = 4;
|
|
7
|
+
export declare const GL_PBR_ALPHA_TEXTURE_UNIT = 5;
|
|
8
|
+
export declare const GL_PBR_EXTENSION_TEXTURE_UNIT = 6;
|
|
9
|
+
export declare function bindGlPbrStandardBlock(state: GlRenderState, program: Readonly<GlPbrProgram>, standard: Readonly<StandardPbrMaterialProperties> | null): void;
|
|
10
|
+
export declare function bindGlPbrStandardTexture(state: GlRenderState, texture: Readonly<Texture> | null, location: WebGLUniformLocation | null, unit: number): void;
|
|
11
|
+
export declare function buildGlPbrStandardDefineKey(standard: Readonly<StandardPbrMaterialProperties> | null, surface: Readonly<SurfaceMaterial> | null): GlPbrDefineKey;
|
|
12
|
+
export declare function isGlTextureReady(texture: Readonly<Texture> | null): boolean;
|
|
13
|
+
//# sourceMappingURL=glPbrStandardBlock.d.ts.map
|