@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,365 @@
|
|
|
1
|
+
import { createGlProgram } from '@flighthq/render-gl';
|
|
2
|
+
import { ensureGlEnvironmentSourceCube, getGlCubeFaceTarget } from './glEnvironmentCube';
|
|
3
|
+
import { getGlScene3DRuntime } from './glScene3DRuntime';
|
|
4
|
+
// Bakes an Environment's source radiance cubemap into the split-sum image-based-lighting set —
|
|
5
|
+
// a diffuse irradiance cubemap, a roughness-mipped prefiltered specular cubemap, and the 2D BRDF
|
|
6
|
+
// integration LUT — and stores it on the scene runtime as `runtime.ibl`. The PBR ambient bind reads
|
|
7
|
+
// that to light every PBR draw from the environment (see glPbrPrelude's IBL term). This is an
|
|
8
|
+
// explicit pass the app sequences once when the environment is set (the bake is the substantial cost);
|
|
9
|
+
// it is a no-op when the environment has no complete source cube. Re-baking replaces the prior set.
|
|
10
|
+
//
|
|
11
|
+
// Resolutions are deliberately modest (the bake runs in software under the headless capture harness);
|
|
12
|
+
// they are the technique, tunable upward for production. The BRDF LUT is environment-independent, so
|
|
13
|
+
// it is baked once per state and reused across re-bakes.
|
|
14
|
+
export function bakeGlEnvironmentIbl(state, environment) {
|
|
15
|
+
const sourceCube = ensureGlEnvironmentSourceCube(state, environment);
|
|
16
|
+
if (sourceCube === null)
|
|
17
|
+
return;
|
|
18
|
+
const gl = state.gl;
|
|
19
|
+
gl.getExtension('EXT_color_buffer_float');
|
|
20
|
+
gl.getExtension('OES_texture_float_linear');
|
|
21
|
+
const runtime = getGlScene3DRuntime(state);
|
|
22
|
+
if (runtime.iblBakeFramebuffer === null)
|
|
23
|
+
runtime.iblBakeFramebuffer = gl.createFramebuffer();
|
|
24
|
+
const fbo = runtime.iblBakeFramebuffer;
|
|
25
|
+
const prevFramebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);
|
|
26
|
+
const prevViewport = gl.getParameter(gl.VIEWPORT);
|
|
27
|
+
gl.disable(gl.DEPTH_TEST);
|
|
28
|
+
gl.disable(gl.CULL_FACE);
|
|
29
|
+
gl.disable(gl.BLEND);
|
|
30
|
+
const irradianceCube = bakeGlIrradiance(state, fbo, sourceCube);
|
|
31
|
+
const { prefilteredCube, prefilteredMipCount } = bakeGlPrefiltered(state, fbo, sourceCube);
|
|
32
|
+
const brdfLut = runtime.ibl?.brdfLut ?? bakeGlBrdfLut(state, fbo);
|
|
33
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, prevFramebuffer);
|
|
34
|
+
gl.viewport(prevViewport[0], prevViewport[1], prevViewport[2], prevViewport[3]);
|
|
35
|
+
gl.bindVertexArray(null);
|
|
36
|
+
runtime.ibl = {
|
|
37
|
+
brdfLut,
|
|
38
|
+
intensity: environment.intensity,
|
|
39
|
+
irradianceCube,
|
|
40
|
+
prefilteredCube,
|
|
41
|
+
prefilteredMipCount,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Frees the IBL bake shader programs cached for `state` — the irradiance / prefilter / BRDF pass
|
|
45
|
+
// programs and each one's fullscreen-quad VAO + vertex buffer. These are module-local (keyed by
|
|
46
|
+
// state), so they cannot be reached from the scene runtime; destroyGlScene3DRuntime calls this to fold
|
|
47
|
+
// them into the one-call teardown. A no-op when no bake has run for the state. The baked result
|
|
48
|
+
// textures (runtime.ibl) are freed separately by destroyGlScene3DRuntime.
|
|
49
|
+
export function destroyGlEnvironmentIblBakePrograms(state) {
|
|
50
|
+
const byState = _bakePrograms.get(state);
|
|
51
|
+
if (byState === undefined)
|
|
52
|
+
return;
|
|
53
|
+
const gl = state.gl;
|
|
54
|
+
for (const baked of byState.values()) {
|
|
55
|
+
gl.deleteProgram(baked.program);
|
|
56
|
+
gl.deleteVertexArray(baked.vao);
|
|
57
|
+
gl.deleteBuffer(baked.buffer);
|
|
58
|
+
}
|
|
59
|
+
_bakePrograms.delete(state);
|
|
60
|
+
}
|
|
61
|
+
function bakeGlIrradiance(state, fbo, sourceCube) {
|
|
62
|
+
const gl = state.gl;
|
|
63
|
+
const cube = createGlBakeCube(gl, IRRADIANCE_SIZE, false);
|
|
64
|
+
const program = ensureGlBakeProgram(state, 'irradiance', IRRADIANCE_FRAGMENT);
|
|
65
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
|
|
66
|
+
gl.useProgram(program.program);
|
|
67
|
+
bindGlBakeSourceCube(gl, program, sourceCube);
|
|
68
|
+
renderGlBakeCubeFaces(state, fbo, program, cube, IRRADIANCE_SIZE, 0);
|
|
69
|
+
return cube;
|
|
70
|
+
}
|
|
71
|
+
function bakeGlPrefiltered(state, fbo, sourceCube) {
|
|
72
|
+
const gl = state.gl;
|
|
73
|
+
const cube = createGlBakeCube(gl, PREFILTERED_SIZE, true);
|
|
74
|
+
const program = ensureGlBakeProgram(state, 'prefiltered', PREFILTERED_FRAGMENT);
|
|
75
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
|
|
76
|
+
gl.useProgram(program.program);
|
|
77
|
+
bindGlBakeSourceCube(gl, program, sourceCube);
|
|
78
|
+
const mipCount = PREFILTERED_MIPS;
|
|
79
|
+
for (let mip = 0; mip < mipCount; mip++) {
|
|
80
|
+
const mipSize = Math.max(1, PREFILTERED_SIZE >> mip);
|
|
81
|
+
const roughness = mipCount > 1 ? mip / (mipCount - 1) : 0;
|
|
82
|
+
gl.uniform1f(program.locRoughness, roughness);
|
|
83
|
+
renderGlBakeCubeFaces(state, fbo, program, cube, mipSize, mip);
|
|
84
|
+
}
|
|
85
|
+
return { prefilteredCube: cube, prefilteredMipCount: mipCount };
|
|
86
|
+
}
|
|
87
|
+
function bakeGlBrdfLut(state, fbo) {
|
|
88
|
+
const gl = state.gl;
|
|
89
|
+
const texture = gl.createTexture();
|
|
90
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
91
|
+
// RGBA16F (not RG16F): RG render targets are not reliably color-renderable across drivers (notably
|
|
92
|
+
// headless SwiftShader); the LUT uses only the R/G channels but stores them in a full RGBA target.
|
|
93
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA16F, BRDF_LUT_SIZE, BRDF_LUT_SIZE, 0, gl.RGBA, gl.HALF_FLOAT, null);
|
|
94
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
95
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
96
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
97
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
98
|
+
const program = ensureGlBakeProgram(state, 'brdf', BRDF_LUT_FRAGMENT);
|
|
99
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
|
|
100
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
|
|
101
|
+
gl.viewport(0, 0, BRDF_LUT_SIZE, BRDF_LUT_SIZE);
|
|
102
|
+
gl.useProgram(program.program);
|
|
103
|
+
drawGlBakeQuad(state, program);
|
|
104
|
+
return texture;
|
|
105
|
+
}
|
|
106
|
+
// Renders all six faces of `cube` at mip `mipLevel` (size `size`) through `program`, setting the
|
|
107
|
+
// per-face direction basis so the fragment shader reconstructs each texel's world direction.
|
|
108
|
+
function renderGlBakeCubeFaces(state, fbo, program, cube, size, mipLevel) {
|
|
109
|
+
const gl = state.gl;
|
|
110
|
+
gl.viewport(0, 0, size, size);
|
|
111
|
+
for (let face = 0; face < 6; face++) {
|
|
112
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, getGlCubeFaceTarget(gl, face), cube, mipLevel);
|
|
113
|
+
const b = CUBE_FACE_BASIS[face];
|
|
114
|
+
gl.uniform3f(program.locFaceForward, b[0], b[1], b[2]);
|
|
115
|
+
gl.uniform3f(program.locFaceRight, b[3], b[4], b[5]);
|
|
116
|
+
gl.uniform3f(program.locFaceUp, b[6], b[7], b[8]);
|
|
117
|
+
drawGlBakeQuad(state, program);
|
|
118
|
+
}
|
|
119
|
+
void fbo;
|
|
120
|
+
}
|
|
121
|
+
function createGlBakeCube(gl, size, mipped) {
|
|
122
|
+
const texture = gl.createTexture();
|
|
123
|
+
gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);
|
|
124
|
+
// Allocate the full mip chain up front: a cube with a mip-aware min filter is "incomplete" (samples
|
|
125
|
+
// as black) until every level it can reach has storage, so each prefiltered roughness level must be
|
|
126
|
+
// texImage2D'd here before the bake renders into it.
|
|
127
|
+
const levels = mipped ? PREFILTERED_MIPS : 1;
|
|
128
|
+
for (let mip = 0; mip < levels; mip++) {
|
|
129
|
+
const mipSize = Math.max(1, size >> mip);
|
|
130
|
+
for (let face = 0; face < 6; face++) {
|
|
131
|
+
gl.texImage2D(getGlCubeFaceTarget(gl, face), mip, gl.RGBA16F, mipSize, mipSize, 0, gl.RGBA, gl.HALF_FLOAT, null);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const minFilter = mipped ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR;
|
|
135
|
+
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, minFilter);
|
|
136
|
+
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
137
|
+
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
138
|
+
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
139
|
+
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE);
|
|
140
|
+
if (mipped)
|
|
141
|
+
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAX_LEVEL, PREFILTERED_MIPS - 1);
|
|
142
|
+
return texture;
|
|
143
|
+
}
|
|
144
|
+
function bindGlBakeSourceCube(gl, program, sourceCube) {
|
|
145
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
146
|
+
gl.bindTexture(gl.TEXTURE_CUBE_MAP, sourceCube);
|
|
147
|
+
gl.uniform1i(program.locEnvCube, 0);
|
|
148
|
+
}
|
|
149
|
+
function ensureGlBakeProgram(state, key, fragment) {
|
|
150
|
+
const gl = state.gl;
|
|
151
|
+
let byState = _bakePrograms.get(state);
|
|
152
|
+
if (byState === undefined) {
|
|
153
|
+
byState = new Map();
|
|
154
|
+
_bakePrograms.set(state, byState);
|
|
155
|
+
}
|
|
156
|
+
let baked = byState.get(key);
|
|
157
|
+
if (baked !== undefined)
|
|
158
|
+
return baked;
|
|
159
|
+
const program = linkGlBakeProgram(gl, fragment);
|
|
160
|
+
const vao = gl.createVertexArray();
|
|
161
|
+
gl.bindVertexArray(vao);
|
|
162
|
+
const buffer = gl.createBuffer();
|
|
163
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
164
|
+
gl.bufferData(gl.ARRAY_BUFFER, _quad, gl.STATIC_DRAW);
|
|
165
|
+
gl.enableVertexAttribArray(0);
|
|
166
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
167
|
+
gl.bindVertexArray(null);
|
|
168
|
+
baked = {
|
|
169
|
+
buffer,
|
|
170
|
+
locEnvCube: gl.getUniformLocation(program, 'u_envCube'),
|
|
171
|
+
locFaceForward: gl.getUniformLocation(program, 'u_faceForward'),
|
|
172
|
+
locFaceRight: gl.getUniformLocation(program, 'u_faceRight'),
|
|
173
|
+
locFaceUp: gl.getUniformLocation(program, 'u_faceUp'),
|
|
174
|
+
locRoughness: gl.getUniformLocation(program, 'u_roughness'),
|
|
175
|
+
program,
|
|
176
|
+
vao,
|
|
177
|
+
};
|
|
178
|
+
byState.set(key, baked);
|
|
179
|
+
return baked;
|
|
180
|
+
}
|
|
181
|
+
function drawGlBakeQuad(state, program) {
|
|
182
|
+
const gl = state.gl;
|
|
183
|
+
gl.bindVertexArray(program.vao);
|
|
184
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
185
|
+
}
|
|
186
|
+
function linkGlBakeProgram(gl, fragment) {
|
|
187
|
+
return createGlProgram(gl, BAKE_VERTEX, fragment, 'IBL bake');
|
|
188
|
+
}
|
|
189
|
+
const IRRADIANCE_SIZE = 16;
|
|
190
|
+
const PREFILTERED_SIZE = 64;
|
|
191
|
+
const PREFILTERED_MIPS = 5;
|
|
192
|
+
const BRDF_LUT_SIZE = 128;
|
|
193
|
+
// Per-face direction basis (forward = face normal, plus right/up spanning the face) in CubeTexture
|
|
194
|
+
// face order, following the standard cubemap sampling convention (up = -Y on the side/Z faces because
|
|
195
|
+
// cube faces store top-left-origin). A fragment's world direction is
|
|
196
|
+
// normalize(forward + uv.x*right + uv.y*up) with uv in [-1, 1].
|
|
197
|
+
const CUBE_FACE_BASIS = [
|
|
198
|
+
[1, 0, 0, 0, 0, -1, 0, -1, 0], // +X
|
|
199
|
+
[-1, 0, 0, 0, 0, 1, 0, -1, 0], // -X
|
|
200
|
+
[0, 1, 0, 1, 0, 0, 0, 0, 1], // +Y
|
|
201
|
+
[0, -1, 0, 1, 0, 0, 0, 0, -1], // -Y
|
|
202
|
+
[0, 0, 1, 1, 0, 0, 0, -1, 0], // +Z
|
|
203
|
+
[0, 0, -1, -1, 0, 0, 0, -1, 0], // -Z
|
|
204
|
+
];
|
|
205
|
+
const _quad = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]);
|
|
206
|
+
const _bakePrograms = new WeakMap();
|
|
207
|
+
// The bake vertex shader emits the clip-space quad and forwards the [-1,1] face coordinate so the
|
|
208
|
+
// fragment can build its sampling direction from the per-face basis.
|
|
209
|
+
const BAKE_VERTEX = `#version 300 es
|
|
210
|
+
layout(location = 0) in vec2 a_position;
|
|
211
|
+
out vec2 v_uv;
|
|
212
|
+
void main() {
|
|
213
|
+
v_uv = a_position;
|
|
214
|
+
gl_Position = vec4(a_position, 0.0, 1.0);
|
|
215
|
+
}
|
|
216
|
+
`;
|
|
217
|
+
const BAKE_COMMON = `precision highp float;
|
|
218
|
+
in vec2 v_uv;
|
|
219
|
+
uniform samplerCube u_envCube;
|
|
220
|
+
uniform vec3 u_faceForward;
|
|
221
|
+
uniform vec3 u_faceRight;
|
|
222
|
+
uniform vec3 u_faceUp;
|
|
223
|
+
out vec4 fragColor;
|
|
224
|
+
const float PI = 3.14159265359;
|
|
225
|
+
|
|
226
|
+
vec3 faceDirection() {
|
|
227
|
+
return normalize(u_faceForward + v_uv.x * u_faceRight + v_uv.y * u_faceUp);
|
|
228
|
+
}
|
|
229
|
+
vec3 srgbToLinear(vec3 c) {
|
|
230
|
+
return mix(c / 12.92, pow((c + 0.055) / 1.055, vec3(2.4)), step(0.04045, c));
|
|
231
|
+
}
|
|
232
|
+
`;
|
|
233
|
+
// Diffuse irradiance: cosine-weighted hemisphere integral of the environment around the texel normal.
|
|
234
|
+
const IRRADIANCE_FRAGMENT = `#version 300 es
|
|
235
|
+
${BAKE_COMMON}
|
|
236
|
+
void main() {
|
|
237
|
+
vec3 N = faceDirection();
|
|
238
|
+
vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
|
|
239
|
+
vec3 right = normalize(cross(up, N));
|
|
240
|
+
up = normalize(cross(N, right));
|
|
241
|
+
|
|
242
|
+
vec3 irradiance = vec3(0.0);
|
|
243
|
+
float samples = 0.0;
|
|
244
|
+
const float delta = 0.15;
|
|
245
|
+
for (float phi = 0.0; phi < 2.0 * PI; phi += delta) {
|
|
246
|
+
for (float theta = 0.0; theta < 0.5 * PI; theta += delta) {
|
|
247
|
+
vec3 tangent = vec3(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta));
|
|
248
|
+
vec3 sampleVec = tangent.x * right + tangent.y * up + tangent.z * N;
|
|
249
|
+
irradiance += srgbToLinear(texture(u_envCube, sampleVec).rgb) * cos(theta) * sin(theta);
|
|
250
|
+
samples += 1.0;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
fragColor = vec4(PI * irradiance / samples, 1.0);
|
|
254
|
+
}
|
|
255
|
+
`;
|
|
256
|
+
// Prefiltered specular: GGX importance-sampled environment for the mip's roughness.
|
|
257
|
+
const PREFILTERED_FRAGMENT = `#version 300 es
|
|
258
|
+
${BAKE_COMMON}
|
|
259
|
+
uniform float u_roughness;
|
|
260
|
+
|
|
261
|
+
float radicalInverse(uint bits) {
|
|
262
|
+
bits = (bits << 16u) | (bits >> 16u);
|
|
263
|
+
bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
|
|
264
|
+
bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
|
|
265
|
+
bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
|
|
266
|
+
bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
|
|
267
|
+
return float(bits) * 2.3283064365386963e-10;
|
|
268
|
+
}
|
|
269
|
+
vec2 hammersley(uint i, uint n) {
|
|
270
|
+
return vec2(float(i) / float(n), radicalInverse(i));
|
|
271
|
+
}
|
|
272
|
+
vec3 importanceSampleGGX(vec2 Xi, vec3 N, float roughness) {
|
|
273
|
+
float a = roughness * roughness;
|
|
274
|
+
float phi = 2.0 * PI * Xi.x;
|
|
275
|
+
float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a * a - 1.0) * Xi.y));
|
|
276
|
+
float sinTheta = sqrt(1.0 - cosTheta * cosTheta);
|
|
277
|
+
vec3 H = vec3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta);
|
|
278
|
+
vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
|
|
279
|
+
vec3 tangent = normalize(cross(up, N));
|
|
280
|
+
vec3 bitangent = cross(N, tangent);
|
|
281
|
+
return normalize(tangent * H.x + bitangent * H.y + N * H.z);
|
|
282
|
+
}
|
|
283
|
+
void main() {
|
|
284
|
+
vec3 N = faceDirection();
|
|
285
|
+
vec3 V = N;
|
|
286
|
+
const uint SAMPLE_COUNT = 48u;
|
|
287
|
+
vec3 prefiltered = vec3(0.0);
|
|
288
|
+
float totalWeight = 0.0;
|
|
289
|
+
for (uint i = 0u; i < SAMPLE_COUNT; i++) {
|
|
290
|
+
vec2 Xi = hammersley(i, SAMPLE_COUNT);
|
|
291
|
+
vec3 H = importanceSampleGGX(Xi, N, u_roughness);
|
|
292
|
+
vec3 L = normalize(2.0 * dot(V, H) * H - V);
|
|
293
|
+
float nDotL = max(dot(N, L), 0.0);
|
|
294
|
+
if (nDotL > 0.0) {
|
|
295
|
+
prefiltered += srgbToLinear(texture(u_envCube, L).rgb) * nDotL;
|
|
296
|
+
totalWeight += nDotL;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
fragColor = vec4(totalWeight > 0.0 ? prefiltered / totalWeight : srgbToLinear(texture(u_envCube, N).rgb), 1.0);
|
|
300
|
+
}
|
|
301
|
+
`;
|
|
302
|
+
// BRDF integration LUT (split-sum): x = N·V, y = roughness; output RG = scale/bias for F0.
|
|
303
|
+
const BRDF_LUT_FRAGMENT = `#version 300 es
|
|
304
|
+
precision highp float;
|
|
305
|
+
in vec2 v_uv;
|
|
306
|
+
out vec4 fragColor;
|
|
307
|
+
const float PI = 3.14159265359;
|
|
308
|
+
|
|
309
|
+
float radicalInverse(uint bits) {
|
|
310
|
+
bits = (bits << 16u) | (bits >> 16u);
|
|
311
|
+
bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
|
|
312
|
+
bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
|
|
313
|
+
bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
|
|
314
|
+
bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
|
|
315
|
+
return float(bits) * 2.3283064365386963e-10;
|
|
316
|
+
}
|
|
317
|
+
vec2 hammersley(uint i, uint n) {
|
|
318
|
+
return vec2(float(i) / float(n), radicalInverse(i));
|
|
319
|
+
}
|
|
320
|
+
vec3 importanceSampleGGX(vec2 Xi, vec3 N, float roughness) {
|
|
321
|
+
float a = roughness * roughness;
|
|
322
|
+
float phi = 2.0 * PI * Xi.x;
|
|
323
|
+
float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a * a - 1.0) * Xi.y));
|
|
324
|
+
float sinTheta = sqrt(1.0 - cosTheta * cosTheta);
|
|
325
|
+
vec3 H = vec3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta);
|
|
326
|
+
vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
|
|
327
|
+
vec3 tangent = normalize(cross(up, N));
|
|
328
|
+
vec3 bitangent = cross(N, tangent);
|
|
329
|
+
return normalize(tangent * H.x + bitangent * H.y + N * H.z);
|
|
330
|
+
}
|
|
331
|
+
float geometrySchlickGGX(float nDotV, float roughness) {
|
|
332
|
+
float k = roughness * roughness / 2.0;
|
|
333
|
+
return nDotV / (nDotV * (1.0 - k) + k);
|
|
334
|
+
}
|
|
335
|
+
float geometrySmith(vec3 N, vec3 V, vec3 L, float roughness) {
|
|
336
|
+
return geometrySchlickGGX(max(dot(N, L), 0.0), roughness) * geometrySchlickGGX(max(dot(N, V), 0.0), roughness);
|
|
337
|
+
}
|
|
338
|
+
void main() {
|
|
339
|
+
vec2 uv = v_uv * 0.5 + 0.5;
|
|
340
|
+
float nDotV = max(uv.x, 0.001);
|
|
341
|
+
float roughness = uv.y;
|
|
342
|
+
vec3 V = vec3(sqrt(1.0 - nDotV * nDotV), 0.0, nDotV);
|
|
343
|
+
vec3 N = vec3(0.0, 0.0, 1.0);
|
|
344
|
+
float A = 0.0;
|
|
345
|
+
float B = 0.0;
|
|
346
|
+
const uint SAMPLE_COUNT = 256u;
|
|
347
|
+
for (uint i = 0u; i < SAMPLE_COUNT; i++) {
|
|
348
|
+
vec2 Xi = hammersley(i, SAMPLE_COUNT);
|
|
349
|
+
vec3 H = importanceSampleGGX(Xi, N, roughness);
|
|
350
|
+
vec3 L = normalize(2.0 * dot(V, H) * H - V);
|
|
351
|
+
float nDotL = max(L.z, 0.0);
|
|
352
|
+
float nDotH = max(H.z, 0.0);
|
|
353
|
+
float vDotH = max(dot(V, H), 0.0);
|
|
354
|
+
if (nDotL > 0.0) {
|
|
355
|
+
float G = geometrySmith(N, V, L, roughness);
|
|
356
|
+
float gVis = (G * vDotH) / (nDotH * nDotV);
|
|
357
|
+
float Fc = pow(1.0 - vDotH, 5.0);
|
|
358
|
+
A += (1.0 - Fc) * gVis;
|
|
359
|
+
B += Fc * gVis;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
fragColor = vec4(A / float(SAMPLE_COUNT), B / float(SAMPLE_COUNT), 0.0, 1.0);
|
|
363
|
+
}
|
|
364
|
+
`;
|
|
365
|
+
//# sourceMappingURL=glEnvironmentIblBake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glEnvironmentIblBake.js","sourceRoot":"","sources":["../src/glEnvironmentIblBake.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Camera3D, Environment, GlRenderState } from '@flighthq/types';
|
|
2
|
+
export declare function drawGlEnvironmentSkybox(state: GlRenderState, environment: Readonly<Environment>, camera: Readonly<Camera3D>, aspect: number): void;
|
|
3
|
+
//# sourceMappingURL=glEnvironmentSkybox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glEnvironmentSkybox.d.ts","sourceRoot":"","sources":["../src/glEnvironmentSkybox.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAW,MAAM,iBAAiB,CAAC;AAUrF,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,EAClC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC1B,MAAM,EAAE,MAAM,GACb,IAAI,CA2BN"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { getCamera3DInverseViewProjectionMatrix4 } from '@flighthq/camera';
|
|
2
|
+
import { createMatrix4 } from '@flighthq/geometry';
|
|
3
|
+
import { createGlProgram } from '@flighthq/render-gl';
|
|
4
|
+
import { ensureGlEnvironmentSourceCube } from './glEnvironmentCube';
|
|
5
|
+
// Draws the environment's radiance cubemap as the scene backdrop: a screen-filling pass that, per
|
|
6
|
+
// pixel, reconstructs the world-space view ray from the inverse view-projection and samples the cube.
|
|
7
|
+
// The quad is emitted at the far plane (clip z = w) with depth writes off, so it fills only pixels the
|
|
8
|
+
// opaque scene has not yet covered and never occludes geometry. Call it once, after the color target
|
|
9
|
+
// is bound and cleared and before drawGlScene3D. A no-op when the environment has no complete source
|
|
10
|
+
// cube. `aspect` is the viewport width / height (matches the camera aspect drawGlScene3D uses).
|
|
11
|
+
export function drawGlEnvironmentSkybox(state, environment, camera, aspect) {
|
|
12
|
+
const cube = ensureGlEnvironmentSourceCube(state, environment);
|
|
13
|
+
if (cube === null)
|
|
14
|
+
return;
|
|
15
|
+
const gl = state.gl;
|
|
16
|
+
const sky = ensureGlSkybox(state);
|
|
17
|
+
getCamera3DInverseViewProjectionMatrix4(_inverseViewProjection, camera, aspect);
|
|
18
|
+
const prevDepthTest = gl.getParameter(gl.DEPTH_TEST);
|
|
19
|
+
gl.depthMask(false);
|
|
20
|
+
gl.disable(gl.DEPTH_TEST);
|
|
21
|
+
gl.disable(gl.BLEND);
|
|
22
|
+
gl.useProgram(sky.program);
|
|
23
|
+
gl.uniformMatrix4fv(sky.locInverseViewProjection, false, _inverseViewProjection.m);
|
|
24
|
+
gl.uniform1f(sky.locIntensity, environment.intensity);
|
|
25
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
26
|
+
gl.bindTexture(gl.TEXTURE_CUBE_MAP, cube);
|
|
27
|
+
gl.uniform1i(sky.locEnvCube, 0);
|
|
28
|
+
gl.bindVertexArray(sky.vao);
|
|
29
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
30
|
+
gl.bindVertexArray(null);
|
|
31
|
+
gl.depthMask(true);
|
|
32
|
+
if (prevDepthTest)
|
|
33
|
+
gl.enable(gl.DEPTH_TEST);
|
|
34
|
+
}
|
|
35
|
+
function ensureGlSkybox(state) {
|
|
36
|
+
const gl = state.gl;
|
|
37
|
+
let sky = _skyboxes.get(state);
|
|
38
|
+
if (sky !== undefined)
|
|
39
|
+
return sky;
|
|
40
|
+
const program = linkGlSkyboxProgram(gl);
|
|
41
|
+
const vao = gl.createVertexArray();
|
|
42
|
+
gl.bindVertexArray(vao);
|
|
43
|
+
const buffer = gl.createBuffer();
|
|
44
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
45
|
+
gl.bufferData(gl.ARRAY_BUFFER, _quad, gl.STATIC_DRAW);
|
|
46
|
+
gl.enableVertexAttribArray(0);
|
|
47
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
48
|
+
gl.bindVertexArray(null);
|
|
49
|
+
sky = {
|
|
50
|
+
locEnvCube: gl.getUniformLocation(program, 'u_envCube'),
|
|
51
|
+
locInverseViewProjection: gl.getUniformLocation(program, 'u_inverseViewProjection'),
|
|
52
|
+
locIntensity: gl.getUniformLocation(program, 'u_intensity'),
|
|
53
|
+
program,
|
|
54
|
+
vao,
|
|
55
|
+
};
|
|
56
|
+
_skyboxes.set(state, sky);
|
|
57
|
+
return sky;
|
|
58
|
+
}
|
|
59
|
+
function linkGlSkyboxProgram(gl) {
|
|
60
|
+
return createGlProgram(gl, SKYBOX_VERTEX, SKYBOX_FRAGMENT, 'Skybox');
|
|
61
|
+
}
|
|
62
|
+
const _inverseViewProjection = createMatrix4();
|
|
63
|
+
const _quad = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]);
|
|
64
|
+
const _skyboxes = new WeakMap();
|
|
65
|
+
const SKYBOX_VERTEX = `#version 300 es
|
|
66
|
+
layout(location = 0) in vec2 a_position;
|
|
67
|
+
out vec2 v_ndc;
|
|
68
|
+
void main() {
|
|
69
|
+
v_ndc = a_position;
|
|
70
|
+
// Emit at the far plane (z = w) so the backdrop sits behind every drawn fragment.
|
|
71
|
+
gl_Position = vec4(a_position, 1.0, 1.0);
|
|
72
|
+
}
|
|
73
|
+
`;
|
|
74
|
+
const SKYBOX_FRAGMENT = `#version 300 es
|
|
75
|
+
precision highp float;
|
|
76
|
+
in vec2 v_ndc;
|
|
77
|
+
uniform samplerCube u_envCube;
|
|
78
|
+
uniform mat4 u_inverseViewProjection;
|
|
79
|
+
uniform float u_intensity;
|
|
80
|
+
out vec4 fragColor;
|
|
81
|
+
|
|
82
|
+
vec3 srgbToLinear(vec3 c) {
|
|
83
|
+
return mix(c / 12.92, pow((c + 0.055) / 1.055, vec3(2.4)), step(0.04045, c));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
void main() {
|
|
87
|
+
// Reconstruct the world-space ray through this pixel from the near- and far-plane unprojections.
|
|
88
|
+
vec4 nearW = u_inverseViewProjection * vec4(v_ndc, -1.0, 1.0);
|
|
89
|
+
vec4 farW = u_inverseViewProjection * vec4(v_ndc, 1.0, 1.0);
|
|
90
|
+
vec3 dir = normalize(farW.xyz / farW.w - nearW.xyz / nearW.w);
|
|
91
|
+
vec3 color = srgbToLinear(texture(u_envCube, dir).rgb) * u_intensity;
|
|
92
|
+
fragColor = vec4(color, 1.0);
|
|
93
|
+
}
|
|
94
|
+
`;
|
|
95
|
+
//# sourceMappingURL=glEnvironmentSkybox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glEnvironmentSkybox.js","sourceRoot":"","sources":["../src/glEnvironmentSkybox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { GlLitProgram, GlRenderState, Scene3DLightBlock, GlMeshProgram } from '@flighthq/types';
|
|
2
|
+
export declare function bindGlMeshLightBlock(state: GlRenderState, program: Readonly<GlLitProgram>, lights: Readonly<Scene3DLightBlock>): void;
|
|
3
|
+
export declare function resolveGlLitLocations(gl: WebGL2RenderingContext, program: WebGLProgram): Omit<GlLitProgram, keyof GlMeshProgram>;
|
|
4
|
+
export declare const GL_MESH_LIGHT_BLOCK_GLSL = "\nuniform vec4 u_directional; // xyz = light travel direction (surface->light is -xyz)\nuniform vec4 u_directionalRadiance; // rgb = linear radiance, premultiplied by intensity\nuniform vec3 u_ambientRadiance; // linear ambient irradiance\nuniform float u_directionalCount; // 0 or 1 \u2014 gates the directional term\nuniform float u_ambientCount; // 0 or 1 \u2014 gates the ambient term\nuniform vec3 u_cameraPosition; // world-space camera position for view-dependent terms\nuniform sampler2D u_shadowMap; // directional shadow depth map\nuniform mat4 u_shadowMatrix; // world -> shadow light-clip\nuniform float u_shadowEnabled; // 0 or 1 \u2014 gates shadow sampling\n\n// Punctual (point/spot/hemisphere) forward-light arrays. Fixed MAX_FORWARD_LIGHTS-wide; each count\n// uniform bounds its loop. Layout matches Scene3DLightBlock.data (packScene3DLightBlock) byte-for-byte:\n// point[i] = u_pointLights[i*2+0]={pos.xyz,range}, [i*2+1]={radiance.rgb,invSqrRange}\n// spot[i] = u_spotLights[i*4+0..1] as point, [i*4+2]={dir.xyz,_}, [i*4+3]={cosInner,cosOuter,_,_}\n// hemisphere[i] = u_hemisphereLights[i*3+0]={sky.rgb,_}, [i*3+1]={ground.rgb,_}, [i*3+2]={up.xyz,_}\nuniform vec4 u_pointLights[MAX_FORWARD_LIGHTS * 2];\nuniform vec4 u_spotLights[MAX_FORWARD_LIGHTS * 4];\nuniform vec4 u_hemisphereLights[MAX_FORWARD_LIGHTS * 3];\nuniform int u_pointCount;\nuniform int u_spotCount;\nuniform int u_hemisphereCount;\n\n// Smooth inverse-square range window (glTF/UE4): 1 near the light, eased to 0 at the range. invSqrRange\n// is 1/range^2 (0 = infinite range, no cutoff). dist2 is the squared surface->light distance.\nfloat rangeWindow(float dist2, float invSqrRange) {\n float factor = dist2 * invSqrRange;\n float windowed = clamp(1.0 - factor * factor, 0.0, 1.0);\n return windowed * windowed;\n}\n\n// Directional shadow factor at a world position: 1.0 fully lit, 0.0 fully shadowed, with 3x3 PCF.\n// Fragments outside the shadow frustum are treated as lit.\nfloat sampleDirectionalShadow(vec3 worldPos) {\n if (u_shadowEnabled < 0.5) return 1.0;\n vec4 clip = u_shadowMatrix * vec4(worldPos, 1.0);\n vec3 ndc = clip.xyz / clip.w;\n vec3 uvz = ndc * 0.5 + 0.5;\n if (uvz.x < 0.0 || uvz.x > 1.0 || uvz.y < 0.0 || uvz.y > 1.0 || uvz.z > 1.0) return 1.0;\n float current = uvz.z - 0.0025;\n vec2 texel = 1.0 / vec2(textureSize(u_shadowMap, 0));\n float sum = 0.0;\n for (int x = -1; x <= 1; ++x) {\n for (int y = -1; y <= 1; ++y) {\n float closest = texture(u_shadowMap, uvz.xy + vec2(float(x), float(y)) * texel).r;\n sum += current <= closest ? 1.0 : 0.0;\n }\n }\n return sum / 9.0;\n}\n";
|
|
5
|
+
//# sourceMappingURL=glLitProgram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glLitProgram.d.ts","sourceRoot":"","sources":["../src/glLitProgram.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAsCrG,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC/B,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAClC,IAAI,CA2FN;AAsCD,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,sBAAsB,EAC1B,OAAO,EAAE,YAAY,GACpB,IAAI,CAAC,YAAY,EAAE,MAAM,aAAa,CAAC,CAwBzC;AAMD,eAAO,MAAM,wBAAwB,6oFAkDpC,CAAC"}
|