@shapediver/viewer.rendering-engine.rendering-engine-threejs 3.0.0
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/LICENSE +73 -0
- package/README.md +3 -0
- package/dist/RenderingEngine.d.ts +296 -0
- package/dist/RenderingEngine.d.ts.map +1 -0
- package/dist/RenderingEngine.js +1079 -0
- package/dist/RenderingEngine.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/injectors/Tag3dGeometryCreationInjector.d.ts +11 -0
- package/dist/injectors/Tag3dGeometryCreationInjector.d.ts.map +1 -0
- package/dist/injectors/Tag3dGeometryCreationInjector.js +169 -0
- package/dist/injectors/Tag3dGeometryCreationInjector.js.map +1 -0
- package/dist/injectors/TextureUnifierInjector.d.ts +14 -0
- package/dist/injectors/TextureUnifierInjector.d.ts.map +1 -0
- package/dist/injectors/TextureUnifierInjector.js +227 -0
- package/dist/injectors/TextureUnifierInjector.js.map +1 -0
- package/dist/interfaces/ILoader.d.ts +4 -0
- package/dist/interfaces/ILoader.d.ts.map +1 -0
- package/dist/interfaces/ILoader.js +3 -0
- package/dist/interfaces/ILoader.js.map +1 -0
- package/dist/interfaces/IPostProcessingEffectDefinitions.d.ts +307 -0
- package/dist/interfaces/IPostProcessingEffectDefinitions.d.ts.map +1 -0
- package/dist/interfaces/IPostProcessingEffectDefinitions.js +31 -0
- package/dist/interfaces/IPostProcessingEffectDefinitions.js.map +1 -0
- package/dist/interfaces/IRenderingEngine.d.ts +43 -0
- package/dist/interfaces/IRenderingEngine.d.ts.map +1 -0
- package/dist/interfaces/IRenderingEngine.js +3 -0
- package/dist/interfaces/IRenderingEngine.js.map +1 -0
- package/dist/loaders/EnvironmentMapLoader.d.ts +98 -0
- package/dist/loaders/EnvironmentMapLoader.d.ts.map +1 -0
- package/dist/loaders/EnvironmentMapLoader.js +348 -0
- package/dist/loaders/EnvironmentMapLoader.js.map +1 -0
- package/dist/loaders/GeometryLoader.d.ts +38 -0
- package/dist/loaders/GeometryLoader.d.ts.map +1 -0
- package/dist/loaders/GeometryLoader.js +505 -0
- package/dist/loaders/GeometryLoader.js.map +1 -0
- package/dist/loaders/HTMLElementAnchorLoader.d.ts +17 -0
- package/dist/loaders/HTMLElementAnchorLoader.d.ts.map +1 -0
- package/dist/loaders/HTMLElementAnchorLoader.js +84 -0
- package/dist/loaders/HTMLElementAnchorLoader.js.map +1 -0
- package/dist/loaders/LightLoader.d.ts +19 -0
- package/dist/loaders/LightLoader.d.ts.map +1 -0
- package/dist/loaders/LightLoader.js +152 -0
- package/dist/loaders/LightLoader.js.map +1 -0
- package/dist/loaders/MaterialLoader.d.ts +99 -0
- package/dist/loaders/MaterialLoader.d.ts.map +1 -0
- package/dist/loaders/MaterialLoader.js +1175 -0
- package/dist/loaders/MaterialLoader.js.map +1 -0
- package/dist/managers/CameraManager.d.ts +20 -0
- package/dist/managers/CameraManager.d.ts.map +1 -0
- package/dist/managers/CameraManager.js +195 -0
- package/dist/managers/CameraManager.js.map +1 -0
- package/dist/managers/EnvironmentGeometryManager.d.ts +43 -0
- package/dist/managers/EnvironmentGeometryManager.d.ts.map +1 -0
- package/dist/managers/EnvironmentGeometryManager.js +210 -0
- package/dist/managers/EnvironmentGeometryManager.js.map +1 -0
- package/dist/managers/PostProcessingManager.d.ts +1014 -0
- package/dist/managers/PostProcessingManager.d.ts.map +1 -0
- package/dist/managers/PostProcessingManager.js +1013 -0
- package/dist/managers/PostProcessingManager.js.map +1 -0
- package/dist/managers/RenderingManager.d.ts +83 -0
- package/dist/managers/RenderingManager.d.ts.map +1 -0
- package/dist/managers/RenderingManager.js +567 -0
- package/dist/managers/RenderingManager.js.map +1 -0
- package/dist/managers/SceneTracingManager.d.ts +26 -0
- package/dist/managers/SceneTracingManager.d.ts.map +1 -0
- package/dist/managers/SceneTracingManager.js +122 -0
- package/dist/managers/SceneTracingManager.js.map +1 -0
- package/dist/managers/SceneTreeManager.d.ts +55 -0
- package/dist/managers/SceneTreeManager.d.ts.map +1 -0
- package/dist/managers/SceneTreeManager.js +501 -0
- package/dist/managers/SceneTreeManager.js.map +1 -0
- package/dist/managers/postprocessing/GodRaysManager.d.ts +13 -0
- package/dist/managers/postprocessing/GodRaysManager.d.ts.map +1 -0
- package/dist/managers/postprocessing/GodRaysManager.js +64 -0
- package/dist/managers/postprocessing/GodRaysManager.js.map +1 -0
- package/dist/managers/postprocessing/OutlineManager.d.ts +15 -0
- package/dist/managers/postprocessing/OutlineManager.d.ts.map +1 -0
- package/dist/managers/postprocessing/OutlineManager.js +67 -0
- package/dist/managers/postprocessing/OutlineManager.js.map +1 -0
- package/dist/managers/postprocessing/SSAARenderPass.d.ts +54 -0
- package/dist/managers/postprocessing/SSAARenderPass.d.ts.map +1 -0
- package/dist/managers/postprocessing/SSAARenderPass.js +234 -0
- package/dist/managers/postprocessing/SSAARenderPass.js.map +1 -0
- package/dist/managers/postprocessing/SelectiveBloomManager.d.ts +15 -0
- package/dist/managers/postprocessing/SelectiveBloomManager.d.ts.map +1 -0
- package/dist/managers/postprocessing/SelectiveBloomManager.js +67 -0
- package/dist/managers/postprocessing/SelectiveBloomManager.js.map +1 -0
- package/dist/managers/postprocessing/ao/ao/AOEffect.d.ts +47 -0
- package/dist/managers/postprocessing/ao/ao/AOEffect.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/ao/AOEffect.js +134 -0
- package/dist/managers/postprocessing/ao/ao/AOEffect.js.map +1 -0
- package/dist/managers/postprocessing/ao/ao/AOPass.d.ts +13 -0
- package/dist/managers/postprocessing/ao/ao/AOPass.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/ao/AOPass.js +78 -0
- package/dist/managers/postprocessing/ao/ao/AOPass.js.map +1 -0
- package/dist/managers/postprocessing/ao/ao/shader/ao_compose.d.ts +2 -0
- package/dist/managers/postprocessing/ao/ao/shader/ao_compose.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/ao/shader/ao_compose.js +23 -0
- package/dist/managers/postprocessing/ao/ao/shader/ao_compose.js.map +1 -0
- package/dist/managers/postprocessing/ao/hbao/HBAOEffect.d.ts +15 -0
- package/dist/managers/postprocessing/ao/hbao/HBAOEffect.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/hbao/HBAOEffect.js +25 -0
- package/dist/managers/postprocessing/ao/hbao/HBAOEffect.js.map +1 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao.d.ts +2 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao.js +102 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao.js.map +1 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.d.ts +2 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.js +99 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.js.map +1 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.d.ts +37 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js +171 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js.map +1 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.d.ts +2 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.js +131 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.js.map +1 -0
- package/dist/managers/postprocessing/ao/ssao/SSAOEffect.d.ts +15 -0
- package/dist/managers/postprocessing/ao/ssao/SSAOEffect.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js +76 -0
- package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js.map +1 -0
- package/dist/managers/postprocessing/ao/ssao/shader/ssao.d.ts +2 -0
- package/dist/managers/postprocessing/ao/ssao/shader/ssao.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/ssao/shader/ssao.js +134 -0
- package/dist/managers/postprocessing/ao/ssao/shader/ssao.js.map +1 -0
- package/dist/managers/postprocessing/ao/utils/shader/basic.d.ts +2 -0
- package/dist/managers/postprocessing/ao/utils/shader/basic.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/utils/shader/basic.js +12 -0
- package/dist/managers/postprocessing/ao/utils/shader/basic.js.map +1 -0
- package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.d.ts +2 -0
- package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.js +42 -0
- package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.js.map +1 -0
- package/dist/managers/postprocessing/utils/CopyMaterial.d.ts +38 -0
- package/dist/managers/postprocessing/utils/CopyMaterial.d.ts.map +1 -0
- package/dist/managers/postprocessing/utils/CopyMaterial.js +106 -0
- package/dist/managers/postprocessing/utils/CopyMaterial.js.map +1 -0
- package/dist/managers/postprocessing/utils/CopyShader.d.ts +14 -0
- package/dist/managers/postprocessing/utils/CopyShader.d.ts.map +1 -0
- package/dist/managers/postprocessing/utils/CopyShader.js +36 -0
- package/dist/managers/postprocessing/utils/CopyShader.js.map +1 -0
- package/dist/managers/postprocessing/utils/FullScreenQuad.d.ts +10 -0
- package/dist/managers/postprocessing/utils/FullScreenQuad.d.ts.map +1 -0
- package/dist/managers/postprocessing/utils/FullScreenQuad.js +29 -0
- package/dist/managers/postprocessing/utils/FullScreenQuad.js.map +1 -0
- package/dist/managers/postprocessing/utils/NormalPass.d.ts +88 -0
- package/dist/managers/postprocessing/utils/NormalPass.d.ts.map +1 -0
- package/dist/managers/postprocessing/utils/NormalPass.js +157 -0
- package/dist/managers/postprocessing/utils/NormalPass.js.map +1 -0
- package/dist/managers/postprocessing/utils/RenderPass.d.ts +115 -0
- package/dist/managers/postprocessing/utils/RenderPass.d.ts.map +1 -0
- package/dist/managers/postprocessing/utils/RenderPass.js +251 -0
- package/dist/managers/postprocessing/utils/RenderPass.js.map +1 -0
- package/dist/materials/GemMaterial.d.ts +38 -0
- package/dist/materials/GemMaterial.d.ts.map +1 -0
- package/dist/materials/GemMaterial.js +253 -0
- package/dist/materials/GemMaterial.js.map +1 -0
- package/dist/materials/MeshUnlitMaterialParameters.d.ts +4 -0
- package/dist/materials/MeshUnlitMaterialParameters.d.ts.map +1 -0
- package/dist/materials/MeshUnlitMaterialParameters.js +3 -0
- package/dist/materials/MeshUnlitMaterialParameters.js.map +1 -0
- package/dist/materials/MultiPointsMaterial.d.ts +94 -0
- package/dist/materials/MultiPointsMaterial.d.ts.map +1 -0
- package/dist/materials/MultiPointsMaterial.js +567 -0
- package/dist/materials/MultiPointsMaterial.js.map +1 -0
- package/dist/materials/SpecularGlossinessMaterial.d.ts +14 -0
- package/dist/materials/SpecularGlossinessMaterial.d.ts.map +1 -0
- package/dist/materials/SpecularGlossinessMaterial.js +162 -0
- package/dist/materials/SpecularGlossinessMaterial.js.map +1 -0
- package/dist/objects/SDBone.d.ts +13 -0
- package/dist/objects/SDBone.d.ts.map +1 -0
- package/dist/objects/SDBone.js +75 -0
- package/dist/objects/SDBone.js.map +1 -0
- package/dist/objects/SDColor.d.ts +17 -0
- package/dist/objects/SDColor.d.ts.map +1 -0
- package/dist/objects/SDColor.js +49 -0
- package/dist/objects/SDColor.js.map +1 -0
- package/dist/objects/SDData.d.ts +19 -0
- package/dist/objects/SDData.d.ts.map +1 -0
- package/dist/objects/SDData.js +48 -0
- package/dist/objects/SDData.js.map +1 -0
- package/dist/objects/SDObject.d.ts +14 -0
- package/dist/objects/SDObject.d.ts.map +1 -0
- package/dist/objects/SDObject.js +81 -0
- package/dist/objects/SDObject.js.map +1 -0
- package/dist/shaders/PCSS.d.ts +3 -0
- package/dist/shaders/PCSS.d.ts.map +1 -0
- package/dist/shaders/PCSS.js +127 -0
- package/dist/shaders/PCSS.js.map +1 -0
- package/dist/shaders/gem.d.ts +3 -0
- package/dist/shaders/gem.d.ts.map +1 -0
- package/dist/shaders/gem.js +578 -0
- package/dist/shaders/gem.js.map +1 -0
- package/dist/shaders/multi_points.d.ts +3 -0
- package/dist/shaders/multi_points.d.ts.map +1 -0
- package/dist/shaders/multi_points.js +294 -0
- package/dist/shaders/multi_points.js.map +1 -0
- package/dist/styling/viewport-css.d.ts +2 -0
- package/dist/styling/viewport-css.d.ts.map +1 -0
- package/dist/styling/viewport-css.js +117 -0
- package/dist/styling/viewport-css.js.map +1 -0
- package/dist/three/font.d.ts +2365 -0
- package/dist/three/font.d.ts.map +1 -0
- package/dist/three/font.js +6 -0
- package/dist/three/font.js.map +1 -0
- package/dist/three/geometries/TextGeometry.d.ts +22 -0
- package/dist/three/geometries/TextGeometry.d.ts.map +1 -0
- package/dist/three/geometries/TextGeometry.js +45 -0
- package/dist/three/geometries/TextGeometry.js.map +1 -0
- package/dist/three/loaders/FontLoader.d.ts +15 -0
- package/dist/three/loaders/FontLoader.d.ts.map +1 -0
- package/dist/three/loaders/FontLoader.js +118 -0
- package/dist/three/loaders/FontLoader.js.map +1 -0
- package/dist/three/loaders/RGBELoader.d.ts +24 -0
- package/dist/three/loaders/RGBELoader.d.ts.map +1 -0
- package/dist/three/loaders/RGBELoader.js +299 -0
- package/dist/three/loaders/RGBELoader.js.map +1 -0
- package/dist/types/IThreejsData.d.ts +7 -0
- package/dist/types/IThreejsData.d.ts.map +1 -0
- package/dist/types/IThreejsData.js +3 -0
- package/dist/types/IThreejsData.js.map +1 -0
- package/dist/types/ThreejsData.d.ts +11 -0
- package/dist/types/ThreejsData.d.ts.map +1 -0
- package/dist/types/ThreejsData.js +42 -0
- package/dist/types/ThreejsData.js.map +1 -0
- package/package.json +65 -0
- package/src/RenderingEngine.ts +1342 -0
- package/src/index.ts +23 -0
- package/src/injectors/Tag3dGeometryCreationInjector.ts +170 -0
- package/src/injectors/TextureUnifierInjector.ts +224 -0
- package/src/interfaces/ILoader.ts +3 -0
- package/src/interfaces/IPostProcessingEffectDefinitions.ts +402 -0
- package/src/interfaces/IRenderingEngine.ts +48 -0
- package/src/loaders/EnvironmentMapLoader.ts +355 -0
- package/src/loaders/GeometryLoader.ts +565 -0
- package/src/loaders/HTMLElementAnchorLoader.ts +107 -0
- package/src/loaders/LightLoader.ts +171 -0
- package/src/loaders/MaterialLoader.ts +1418 -0
- package/src/managers/CameraManager.ts +178 -0
- package/src/managers/EnvironmentGeometryManager.ts +224 -0
- package/src/managers/PostProcessingManager.ts +1169 -0
- package/src/managers/RenderingManager.ts +657 -0
- package/src/managers/SceneTracingManager.ts +120 -0
- package/src/managers/SceneTreeManager.ts +569 -0
- package/src/managers/postprocessing/GodRaysManager.ts +52 -0
- package/src/managers/postprocessing/OutlineManager.ts +58 -0
- package/src/managers/postprocessing/SSAARenderPass.ts +339 -0
- package/src/managers/postprocessing/SelectiveBloomManager.ts +58 -0
- package/src/managers/postprocessing/ao/ao/AOEffect.ts +180 -0
- package/src/managers/postprocessing/ao/ao/AOPass.ts +128 -0
- package/src/managers/postprocessing/ao/ao/shader/ao_compose.glsl +17 -0
- package/src/managers/postprocessing/ao/ao/shader/ao_compose.ts +19 -0
- package/src/managers/postprocessing/ao/hbao/HBAOEffect.ts +41 -0
- package/src/managers/postprocessing/ao/hbao/shader/hbao.glsl +96 -0
- package/src/managers/postprocessing/ao/hbao/shader/hbao.ts +98 -0
- package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.glsl +92 -0
- package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.ts +95 -0
- package/src/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.ts +245 -0
- package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.glsl +125 -0
- package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.ts +127 -0
- package/src/managers/postprocessing/ao/ssao/SSAOEffect.ts +106 -0
- package/src/managers/postprocessing/ao/ssao/shader/ssao.glsl +128 -0
- package/src/managers/postprocessing/ao/ssao/shader/ssao.ts +130 -0
- package/src/managers/postprocessing/ao/utils/shader/basic.glsl +6 -0
- package/src/managers/postprocessing/ao/utils/shader/basic.ts +8 -0
- package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.glsl +36 -0
- package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.ts +38 -0
- package/src/managers/postprocessing/utils/CopyMaterial.ts +130 -0
- package/src/managers/postprocessing/utils/CopyShader.ts +39 -0
- package/src/managers/postprocessing/utils/FullScreenQuad.ts +47 -0
- package/src/managers/postprocessing/utils/NormalPass.ts +222 -0
- package/src/managers/postprocessing/utils/RenderPass.ts +366 -0
- package/src/materials/GemMaterial.ts +268 -0
- package/src/materials/MeshUnlitMaterialParameters.ts +4 -0
- package/src/materials/MultiPointsMaterial.ts +646 -0
- package/src/materials/SpecularGlossinessMaterial.ts +182 -0
- package/src/objects/SDBone.ts +51 -0
- package/src/objects/SDColor.ts +54 -0
- package/src/objects/SDData.ts +44 -0
- package/src/objects/SDObject.ts +58 -0
- package/src/shaders/PCSS.ts +124 -0
- package/src/shaders/gem.ts +575 -0
- package/src/shaders/gem_frag.glsl +517 -0
- package/src/shaders/gem_vert.glsl +53 -0
- package/src/shaders/multi_points.ts +291 -0
- package/src/shaders/multi_points_frag.glsl +166 -0
- package/src/shaders/multi_points_vert.glsl +120 -0
- package/src/styling/viewport-css.ts +113 -0
- package/src/styling/viewport.css +111 -0
- package/src/three/font.ts +2 -0
- package/src/three/geometries/TextGeometry.ts +58 -0
- package/src/three/loaders/FontLoader.ts +205 -0
- package/src/three/loaders/RGBELoader.ts +496 -0
- package/src/types/IThreejsData.ts +16 -0
- package/src/types/ThreejsData.ts +43 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Pass } from 'postprocessing';
|
|
2
|
+
import {
|
|
3
|
+
Camera,
|
|
4
|
+
HalfFloatType,
|
|
5
|
+
Matrix4,
|
|
6
|
+
NearestFilter,
|
|
7
|
+
NoBlending,
|
|
8
|
+
NoColorSpace,
|
|
9
|
+
PerspectiveCamera,
|
|
10
|
+
RepeatWrapping,
|
|
11
|
+
Scene,
|
|
12
|
+
ShaderMaterial,
|
|
13
|
+
TextureLoader,
|
|
14
|
+
Vector2,
|
|
15
|
+
WebGLRenderTarget,
|
|
16
|
+
WebGLRenderer
|
|
17
|
+
} from 'three';
|
|
18
|
+
import { basic as vertexShader } from '../utils/shader/basic';
|
|
19
|
+
import { sampleBlueNoise } from '../utils/shader/sampleBlueNoise';
|
|
20
|
+
import { PoissionDenoisePass } from '../poissionDenoise/PoissionDenoisePass';
|
|
21
|
+
|
|
22
|
+
// a general AO pass that can be used for any AO algorithm
|
|
23
|
+
class AOPass extends Pass {
|
|
24
|
+
// #region Properties (3)
|
|
25
|
+
|
|
26
|
+
private _camera: PerspectiveCamera;
|
|
27
|
+
private _scene: Scene;
|
|
28
|
+
|
|
29
|
+
public renderTarget: WebGLRenderTarget;
|
|
30
|
+
|
|
31
|
+
// #endregion Properties (3)
|
|
32
|
+
|
|
33
|
+
// #region Constructors (1)
|
|
34
|
+
|
|
35
|
+
constructor(camera: Camera, scene: Scene, fragmentShader: string) {
|
|
36
|
+
super();
|
|
37
|
+
this._camera = camera as PerspectiveCamera;
|
|
38
|
+
this._scene = scene;
|
|
39
|
+
|
|
40
|
+
this.renderTarget = new WebGLRenderTarget(1, 1, {
|
|
41
|
+
type: HalfFloatType,
|
|
42
|
+
depthBuffer: false
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const finalFragmentShader = fragmentShader.replace('#include <sampleBlueNoise>', sampleBlueNoise);
|
|
46
|
+
|
|
47
|
+
this.fullscreenMaterial = new ShaderMaterial({
|
|
48
|
+
fragmentShader: finalFragmentShader,
|
|
49
|
+
vertexShader,
|
|
50
|
+
|
|
51
|
+
uniforms: {
|
|
52
|
+
depthTexture: { value: null },
|
|
53
|
+
normalTexture: { value: null },
|
|
54
|
+
cameraNear: { value: 0 },
|
|
55
|
+
cameraFar: { value: 0 },
|
|
56
|
+
viewMatrix: { value: this._camera.matrixWorldInverse },
|
|
57
|
+
projectionViewMatrix: { value: new Matrix4() },
|
|
58
|
+
projectionMatrixInverse: { value: this._camera.projectionMatrixInverse },
|
|
59
|
+
cameraMatrixWorld: { value: this._camera.matrixWorld },
|
|
60
|
+
texSize: { value: new Vector2() },
|
|
61
|
+
blueNoiseTexture: { value: null },
|
|
62
|
+
blueNoiseRepeat: { value: new Vector2() },
|
|
63
|
+
aoDistance: { value: 0 },
|
|
64
|
+
distancePower: { value: 0 },
|
|
65
|
+
bias: { value: 0 },
|
|
66
|
+
thickness: { value: 0 },
|
|
67
|
+
power: { value: 0 },
|
|
68
|
+
frame: { value: 0 }
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
blending: NoBlending,
|
|
72
|
+
depthWrite: false,
|
|
73
|
+
depthTest: false,
|
|
74
|
+
toneMapped: false
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
(this.fullscreenMaterial as ShaderMaterial).uniforms.blueNoiseTexture.value = PoissionDenoisePass.blueNoiseTexture;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// #endregion Constructors (1)
|
|
81
|
+
|
|
82
|
+
// #region Public Accessors (1)
|
|
83
|
+
|
|
84
|
+
public get texture() {
|
|
85
|
+
return this.renderTarget.texture;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// #endregion Public Accessors (1)
|
|
89
|
+
|
|
90
|
+
// #region Public Methods (2)
|
|
91
|
+
|
|
92
|
+
public render(renderer: WebGLRenderer) {
|
|
93
|
+
const spp = +(this.fullscreenMaterial as ShaderMaterial).defines.spp;
|
|
94
|
+
|
|
95
|
+
(this.fullscreenMaterial as ShaderMaterial).uniforms.frame.value = ((this.fullscreenMaterial as ShaderMaterial).uniforms.frame.value + spp) % 65536;
|
|
96
|
+
|
|
97
|
+
(this.fullscreenMaterial as ShaderMaterial).uniforms.cameraNear.value = this._camera.near;
|
|
98
|
+
(this.fullscreenMaterial as ShaderMaterial).uniforms.cameraFar.value = this._camera.far;
|
|
99
|
+
|
|
100
|
+
(this.fullscreenMaterial as ShaderMaterial).uniforms.projectionViewMatrix.value.multiplyMatrices(
|
|
101
|
+
this._camera.projectionMatrix,
|
|
102
|
+
this._camera.matrixWorldInverse
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
const noiseTexture = (this.fullscreenMaterial as ShaderMaterial).uniforms.blueNoiseTexture.value;
|
|
106
|
+
if (noiseTexture) {
|
|
107
|
+
const { width, height } = noiseTexture.source.data;
|
|
108
|
+
|
|
109
|
+
(this.fullscreenMaterial as ShaderMaterial).uniforms.blueNoiseRepeat.value.set(
|
|
110
|
+
this.renderTarget.width / width,
|
|
111
|
+
this.renderTarget.height / height
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
renderer.setRenderTarget(this.renderTarget);
|
|
116
|
+
renderer.render(this.scene, this.camera);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public setSize(width: number, height: number) {
|
|
120
|
+
this.renderTarget.setSize(width, height);
|
|
121
|
+
|
|
122
|
+
(this.fullscreenMaterial as ShaderMaterial).uniforms.texSize.value.set(this.renderTarget.width, this.renderTarget.height);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// #endregion Public Methods (2)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export { AOPass };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
uniform sampler2D inputTexture;
|
|
2
|
+
uniform sampler2D depthTexture;
|
|
3
|
+
uniform float power;
|
|
4
|
+
uniform vec3 color;
|
|
5
|
+
|
|
6
|
+
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
7
|
+
float unpackedDepth = textureLod(depthTexture, uv, 0.).r;
|
|
8
|
+
|
|
9
|
+
float ao = unpackedDepth > 0.9999 ? 1.0 : textureLod(inputTexture, uv, 0.0).a;
|
|
10
|
+
ao = pow(ao, power);
|
|
11
|
+
|
|
12
|
+
vec3 aoColor = mix(color, vec3(1.), ao);
|
|
13
|
+
|
|
14
|
+
aoColor *= inputColor.rgb;
|
|
15
|
+
|
|
16
|
+
outputColor = vec4(aoColor, inputColor.a);
|
|
17
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const ao_compose = `
|
|
2
|
+
uniform sampler2D inputTexture;
|
|
3
|
+
uniform highp sampler2D depthTexture;
|
|
4
|
+
uniform float power;
|
|
5
|
+
uniform vec3 color;
|
|
6
|
+
|
|
7
|
+
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
8
|
+
float unpackedDepth = textureLod(depthTexture, uv, 0.).r;
|
|
9
|
+
|
|
10
|
+
float ao = unpackedDepth > 0.9999 ? 1.0 : textureLod(inputTexture, uv, 0.0).a;
|
|
11
|
+
ao = pow(ao, power);
|
|
12
|
+
|
|
13
|
+
vec3 aoColor = mix(color, vec3(1.), ao);
|
|
14
|
+
|
|
15
|
+
aoColor *= inputColor.rgb;
|
|
16
|
+
|
|
17
|
+
outputColor = vec4(aoColor, inputColor.a);
|
|
18
|
+
}
|
|
19
|
+
`
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { EffectComposer } from 'postprocessing';
|
|
2
|
+
import { Camera, Scene } from 'three';
|
|
3
|
+
import { AOEffect } from '../ao/AOEffect';
|
|
4
|
+
|
|
5
|
+
import { AOPass } from '../ao/AOPass';
|
|
6
|
+
import { hbao as fragmentShader } from './shader/hbao';
|
|
7
|
+
import { hbao_utils } from './shader/hbao_utils';
|
|
8
|
+
|
|
9
|
+
const finalFragmentShader = fragmentShader.replace('#include <hbao_utils>', hbao_utils);
|
|
10
|
+
|
|
11
|
+
class HBAOPass extends AOPass {
|
|
12
|
+
// #region Constructors (1)
|
|
13
|
+
|
|
14
|
+
constructor(camera: Camera, scene: Scene) {
|
|
15
|
+
super(camera, scene, finalFragmentShader);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// #endregion Constructors (1)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
class HBAOEffect extends AOEffect {
|
|
22
|
+
// #region Properties (1)
|
|
23
|
+
|
|
24
|
+
public lastSize = { width: 0, height: 0, resolutionScale: 0 };
|
|
25
|
+
|
|
26
|
+
// #endregion Properties (1)
|
|
27
|
+
|
|
28
|
+
// #region Constructors (1)
|
|
29
|
+
|
|
30
|
+
constructor(composer: EffectComposer, camera: Camera, scene: Scene, options: { [key: string]: unknown } = AOEffect.DefaultOptions) {
|
|
31
|
+
super(composer, camera, scene, new HBAOPass(camera, scene), {
|
|
32
|
+
...AOEffect.DefaultOptions,
|
|
33
|
+
...HBAOEffect.DefaultOptions,
|
|
34
|
+
...options
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// #endregion Constructors (1)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { HBAOEffect };
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
varying vec2 vUv;
|
|
2
|
+
|
|
3
|
+
uniform sampler2D depthTexture;
|
|
4
|
+
|
|
5
|
+
uniform mat4 projectionViewMatrix;
|
|
6
|
+
uniform int frame;
|
|
7
|
+
|
|
8
|
+
uniform sampler2D blueNoiseTexture;
|
|
9
|
+
uniform vec2 blueNoiseRepeat;
|
|
10
|
+
uniform vec2 texSize;
|
|
11
|
+
|
|
12
|
+
uniform float aoDistance;
|
|
13
|
+
uniform float distancePower;
|
|
14
|
+
uniform float bias;
|
|
15
|
+
uniform float thickness;
|
|
16
|
+
|
|
17
|
+
#include <packing>
|
|
18
|
+
// HBAO Utils
|
|
19
|
+
#include <hbao_utils>
|
|
20
|
+
|
|
21
|
+
float getOcclusion(const vec3 cameraPosition, const vec3 worldPos, const vec3 worldNormal, const float depth, const int seed, inout float totalWeight) {
|
|
22
|
+
vec4 blueNoise = sampleBlueNoise(blueNoiseTexture, seed, blueNoiseRepeat, texSize);
|
|
23
|
+
|
|
24
|
+
vec3 sampleWorldDir = cosineSampleHemisphere(worldNormal, blueNoise.rg);
|
|
25
|
+
|
|
26
|
+
vec3 sampleWorldPos = worldPos + aoDistance * pow(blueNoise.b, distancePower + 1.0) * sampleWorldDir;
|
|
27
|
+
|
|
28
|
+
// Project the sample position to screen space
|
|
29
|
+
vec4 sampleUv = projectionViewMatrix * vec4(sampleWorldPos, 1.);
|
|
30
|
+
sampleUv.xy /= sampleUv.w;
|
|
31
|
+
sampleUv.xy = sampleUv.xy * 0.5 + 0.5;
|
|
32
|
+
|
|
33
|
+
// Get the depth of the sample position
|
|
34
|
+
float sampleDepth = textureLod(depthTexture, sampleUv.xy, 0.0).r;
|
|
35
|
+
|
|
36
|
+
// Compute the horizon line
|
|
37
|
+
float deltaDepth = depth - sampleDepth;
|
|
38
|
+
|
|
39
|
+
// distance based bias
|
|
40
|
+
float d = distance(sampleWorldPos, cameraPosition) / aoDistance;
|
|
41
|
+
deltaDepth *= 0.001 * d * d;
|
|
42
|
+
|
|
43
|
+
float th = thickness * 0.01;
|
|
44
|
+
|
|
45
|
+
float theta = dot(worldNormal, sampleWorldDir);
|
|
46
|
+
totalWeight += theta;
|
|
47
|
+
|
|
48
|
+
if (deltaDepth < th) {
|
|
49
|
+
float horizon = sampleDepth + deltaDepth * bias * 1000.;
|
|
50
|
+
|
|
51
|
+
float occlusion = max(0.0, horizon - depth) * theta;
|
|
52
|
+
|
|
53
|
+
float m = max(0., 1. - deltaDepth / th);
|
|
54
|
+
occlusion = 10. * occlusion * m / d;
|
|
55
|
+
|
|
56
|
+
occlusion = max(0.0, occlusion);
|
|
57
|
+
occlusion = sqrt(occlusion);
|
|
58
|
+
return occlusion;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return 0.;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
void main() {
|
|
65
|
+
float depth = textureLod(depthTexture, vUv, 0.0).r;
|
|
66
|
+
|
|
67
|
+
// filter out background
|
|
68
|
+
if (depth == 1.0) {
|
|
69
|
+
discard;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
vec4 cameraPosition = cameraMatrixWorld * vec4(0.0, 0.0, 0.0, 1.0);
|
|
74
|
+
|
|
75
|
+
vec3 worldPos = getWorldPos(depth, vUv);
|
|
76
|
+
vec3 worldNormal = getWorldNormal(vUv);
|
|
77
|
+
|
|
78
|
+
float ao = 0.0, totalWeight = 0.0;
|
|
79
|
+
|
|
80
|
+
for (int i = 0; i < spp; i++) {
|
|
81
|
+
int seed = i;
|
|
82
|
+
#ifdef animatedNoise
|
|
83
|
+
seed += frame;
|
|
84
|
+
#endif
|
|
85
|
+
|
|
86
|
+
float occlusion = getOcclusion(cameraPosition.xyz, worldPos, worldNormal, depth, seed, totalWeight);
|
|
87
|
+
ao += occlusion;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (totalWeight > 0.) ao /= totalWeight;
|
|
91
|
+
|
|
92
|
+
// clamp ao to [0, 1]
|
|
93
|
+
ao = clamp(1. - ao, 0., 1.);
|
|
94
|
+
|
|
95
|
+
gl_FragColor = vec4(worldNormal, ao);
|
|
96
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export const hbao = `
|
|
2
|
+
varying vec2 vUv;
|
|
3
|
+
|
|
4
|
+
uniform highp sampler2D depthTexture;
|
|
5
|
+
|
|
6
|
+
uniform mat4 projectionViewMatrix;
|
|
7
|
+
uniform int frame;
|
|
8
|
+
|
|
9
|
+
uniform sampler2D blueNoiseTexture;
|
|
10
|
+
uniform vec2 blueNoiseRepeat;
|
|
11
|
+
uniform vec2 texSize;
|
|
12
|
+
|
|
13
|
+
uniform float aoDistance;
|
|
14
|
+
uniform float distancePower;
|
|
15
|
+
uniform float bias;
|
|
16
|
+
uniform float thickness;
|
|
17
|
+
|
|
18
|
+
#include <packing>
|
|
19
|
+
// HBAO Utils
|
|
20
|
+
#include <hbao_utils>
|
|
21
|
+
|
|
22
|
+
float getOcclusion(const vec3 cameraPosition, const vec3 worldPos, const vec3 worldNormal, const float depth, const int seed, inout float totalWeight) {
|
|
23
|
+
vec4 blueNoise = sampleBlueNoise(blueNoiseTexture, seed, blueNoiseRepeat, texSize);
|
|
24
|
+
|
|
25
|
+
vec3 sampleWorldDir = cosineSampleHemisphere(worldNormal, blueNoise.rg);
|
|
26
|
+
|
|
27
|
+
vec3 sampleWorldPos = worldPos + aoDistance * pow(blueNoise.b, distancePower + 1.0) * sampleWorldDir;
|
|
28
|
+
|
|
29
|
+
// Project the sample position to screen space
|
|
30
|
+
vec4 sampleUv = projectionViewMatrix * vec4(sampleWorldPos, 1.);
|
|
31
|
+
sampleUv.xy /= sampleUv.w;
|
|
32
|
+
sampleUv.xy = sampleUv.xy * 0.5 + 0.5;
|
|
33
|
+
|
|
34
|
+
// Get the depth of the sample position
|
|
35
|
+
float sampleDepth = textureLod(depthTexture, sampleUv.xy, 0.0).r;
|
|
36
|
+
|
|
37
|
+
// Compute the horizon line
|
|
38
|
+
float deltaDepth = depth - sampleDepth;
|
|
39
|
+
|
|
40
|
+
// distance based bias
|
|
41
|
+
float d = distance(sampleWorldPos, cameraPosition) / aoDistance;
|
|
42
|
+
deltaDepth *= 0.001 * d * d;
|
|
43
|
+
|
|
44
|
+
float th = thickness * 0.01;
|
|
45
|
+
|
|
46
|
+
float theta = dot(worldNormal, sampleWorldDir);
|
|
47
|
+
totalWeight += theta;
|
|
48
|
+
|
|
49
|
+
if (deltaDepth < th) {
|
|
50
|
+
float horizon = sampleDepth + deltaDepth * bias * 1000.;
|
|
51
|
+
|
|
52
|
+
float occlusion = max(0.0, horizon - depth) * theta;
|
|
53
|
+
|
|
54
|
+
float m = max(0., 1. - deltaDepth / th);
|
|
55
|
+
occlusion = 10. * occlusion * m / d;
|
|
56
|
+
|
|
57
|
+
occlusion = max(0.0, occlusion);
|
|
58
|
+
occlusion = sqrt(occlusion);
|
|
59
|
+
return occlusion;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return 0.;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
void main() {
|
|
66
|
+
float depth = textureLod(depthTexture, vUv, 0.0).r;
|
|
67
|
+
|
|
68
|
+
// filter out background
|
|
69
|
+
if (depth == 1.0) {
|
|
70
|
+
discard;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
vec4 cameraPosition = cameraMatrixWorld * vec4(0.0, 0.0, 0.0, 1.0);
|
|
75
|
+
|
|
76
|
+
vec3 worldPos = getWorldPos(depth, vUv);
|
|
77
|
+
vec3 worldNormal = getWorldNormal(vUv);
|
|
78
|
+
|
|
79
|
+
float ao = 0.0, totalWeight = 0.0;
|
|
80
|
+
|
|
81
|
+
for (int i = 0; i < spp; i++) {
|
|
82
|
+
int seed = i;
|
|
83
|
+
#ifdef animatedNoise
|
|
84
|
+
seed += frame;
|
|
85
|
+
#endif
|
|
86
|
+
|
|
87
|
+
float occlusion = getOcclusion(cameraPosition.xyz, worldPos, worldNormal, depth, seed, totalWeight);
|
|
88
|
+
ao += occlusion;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (totalWeight > 0.) ao /= totalWeight;
|
|
92
|
+
|
|
93
|
+
// clamp ao to [0, 1]
|
|
94
|
+
ao = clamp(1. - ao, 0., 1.);
|
|
95
|
+
|
|
96
|
+
gl_FragColor = vec4(worldNormal, ao);
|
|
97
|
+
}
|
|
98
|
+
`
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#include <sampleBlueNoise>
|
|
2
|
+
|
|
3
|
+
uniform sampler2D normalTexture;
|
|
4
|
+
uniform float cameraNear;
|
|
5
|
+
uniform float cameraFar;
|
|
6
|
+
uniform mat4 projectionMatrixInverse;
|
|
7
|
+
uniform mat4 cameraMatrixWorld;
|
|
8
|
+
|
|
9
|
+
// source: https://github.com/mrdoob/three.js/blob/342946c8392639028da439b6dc0597e58209c696/examples/js/shaders/SAOShader.js#L123
|
|
10
|
+
float getViewZ(const float depth) {
|
|
11
|
+
#ifdef PERSPECTIVE_CAMERA
|
|
12
|
+
return perspectiveDepthToViewZ(depth, cameraNear, cameraFar);
|
|
13
|
+
#else
|
|
14
|
+
return orthographicDepthToViewZ(depth, cameraNear, cameraFar);
|
|
15
|
+
#endif
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// source: https://github.com/N8python/ssao/blob/master/EffectShader.js#L52
|
|
19
|
+
vec3 getWorldPos(const float depth, const vec2 coord) {
|
|
20
|
+
float z = depth * 2.0 - 1.0;
|
|
21
|
+
vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);
|
|
22
|
+
vec4 viewSpacePosition = projectionMatrixInverse * clipSpacePosition;
|
|
23
|
+
|
|
24
|
+
// Perspective division
|
|
25
|
+
vec4 worldSpacePosition = cameraMatrixWorld * viewSpacePosition;
|
|
26
|
+
worldSpacePosition.xyz /= worldSpacePosition.w;
|
|
27
|
+
|
|
28
|
+
return worldSpacePosition.xyz;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
vec3 slerp(const vec3 a, const vec3 b, const float t) {
|
|
32
|
+
float cosAngle = dot(a, b);
|
|
33
|
+
float angle = acos(cosAngle);
|
|
34
|
+
|
|
35
|
+
if (abs(angle) < 0.001) {
|
|
36
|
+
return mix(a, b, t);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
float sinAngle = sin(angle);
|
|
40
|
+
float t1 = sin((1.0 - t) * angle) / sinAngle;
|
|
41
|
+
float t2 = sin(t * angle) / sinAngle;
|
|
42
|
+
|
|
43
|
+
return (a * t1) + (b * t2);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
vec3 computeWorldNormal() {
|
|
47
|
+
vec2 size = vec2(textureSize(depthTexture, 0));
|
|
48
|
+
ivec2 p = ivec2(vUv * size);
|
|
49
|
+
float c0 = texelFetch(depthTexture, p, 0).x;
|
|
50
|
+
float l2 = texelFetch(depthTexture, p - ivec2(2, 0), 0).x;
|
|
51
|
+
float l1 = texelFetch(depthTexture, p - ivec2(1, 0), 0).x;
|
|
52
|
+
float r1 = texelFetch(depthTexture, p + ivec2(1, 0), 0).x;
|
|
53
|
+
float r2 = texelFetch(depthTexture, p + ivec2(2, 0), 0).x;
|
|
54
|
+
float b2 = texelFetch(depthTexture, p - ivec2(0, 2), 0).x;
|
|
55
|
+
float b1 = texelFetch(depthTexture, p - ivec2(0, 1), 0).x;
|
|
56
|
+
float t1 = texelFetch(depthTexture, p + ivec2(0, 1), 0).x;
|
|
57
|
+
float t2 = texelFetch(depthTexture, p + ivec2(0, 2), 0).x;
|
|
58
|
+
float dl = abs((2.0 * l1 - l2) - c0);
|
|
59
|
+
float dr = abs((2.0 * r1 - r2) - c0);
|
|
60
|
+
float db = abs((2.0 * b1 - b2) - c0);
|
|
61
|
+
float dt = abs((2.0 * t1 - t2) - c0);
|
|
62
|
+
vec3 ce = getWorldPos(c0, vUv).xyz;
|
|
63
|
+
vec3 dpdx = (dl < dr) ? ce - getWorldPos(l1, (vUv - vec2(1.0 / size.x, 0.0))).xyz
|
|
64
|
+
: -ce + getWorldPos(r1, (vUv + vec2(1.0 / size.x, 0.0))).xyz;
|
|
65
|
+
vec3 dpdy = (db < dt) ? ce - getWorldPos(b1, (vUv - vec2(0.0, 1.0 / size.y))).xyz
|
|
66
|
+
: -ce + getWorldPos(t1, (vUv + vec2(0.0, 1.0 / size.y))).xyz;
|
|
67
|
+
return normalize(cross(dpdx, dpdy));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
vec3 getWorldNormal(const vec2 uv) {
|
|
71
|
+
#ifdef useNormalTexture
|
|
72
|
+
vec3 worldNormal = unpackRGBToNormal(textureLod(normalTexture, uv, 0.).rgb);
|
|
73
|
+
|
|
74
|
+
worldNormal = (vec4(worldNormal, 1.) * viewMatrix).xyz; // view-space to world-space
|
|
75
|
+
return normalize(worldNormal);
|
|
76
|
+
#else
|
|
77
|
+
return computeWorldNormal(); // compute world normal from depth
|
|
78
|
+
#endif
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
#define PI 3.14159265358979323846264338327950288
|
|
82
|
+
|
|
83
|
+
// source: https://www.shadertoy.com/view/cll3R4
|
|
84
|
+
vec3 cosineSampleHemisphere(const vec3 n, const vec2 u) {
|
|
85
|
+
float r = sqrt(u.x);
|
|
86
|
+
float theta = 2.0 * PI * u.y;
|
|
87
|
+
|
|
88
|
+
vec3 b = normalize(cross(n, vec3(0.0, 1.0, 1.0)));
|
|
89
|
+
vec3 t = cross(b, n);
|
|
90
|
+
|
|
91
|
+
return normalize(r * sin(theta) * b + sqrt(1.0 - u.x) * n + r * cos(theta) * t);
|
|
92
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export const hbao_utils = `
|
|
2
|
+
#include <sampleBlueNoise>
|
|
3
|
+
|
|
4
|
+
uniform sampler2D normalTexture;
|
|
5
|
+
uniform float cameraNear;
|
|
6
|
+
uniform float cameraFar;
|
|
7
|
+
uniform mat4 projectionMatrixInverse;
|
|
8
|
+
uniform mat4 cameraMatrixWorld;
|
|
9
|
+
|
|
10
|
+
// source: https://github.com/mrdoob/three.js/blob/342946c8392639028da439b6dc0597e58209c696/examples/js/shaders/SAOShader.js#L123
|
|
11
|
+
float getViewZ(const float depth) {
|
|
12
|
+
#ifdef PERSPECTIVE_CAMERA
|
|
13
|
+
return perspectiveDepthToViewZ(depth, cameraNear, cameraFar);
|
|
14
|
+
#else
|
|
15
|
+
return orthographicDepthToViewZ(depth, cameraNear, cameraFar);
|
|
16
|
+
#endif
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// source: https://github.com/N8python/ssao/blob/master/EffectShader.js#L52
|
|
20
|
+
vec3 getWorldPos(const float depth, const vec2 coord) {
|
|
21
|
+
float z = depth * 2.0 - 1.0;
|
|
22
|
+
vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);
|
|
23
|
+
vec4 viewSpacePosition = projectionMatrixInverse * clipSpacePosition;
|
|
24
|
+
|
|
25
|
+
// Perspective division
|
|
26
|
+
vec4 worldSpacePosition = cameraMatrixWorld * viewSpacePosition;
|
|
27
|
+
worldSpacePosition.xyz /= worldSpacePosition.w;
|
|
28
|
+
|
|
29
|
+
return worldSpacePosition.xyz;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
vec3 slerp(const vec3 a, const vec3 b, const float t) {
|
|
33
|
+
float cosAngle = dot(a, b);
|
|
34
|
+
float angle = acos(cosAngle);
|
|
35
|
+
|
|
36
|
+
if (abs(angle) < 0.001) {
|
|
37
|
+
return mix(a, b, t);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
float sinAngle = sin(angle);
|
|
41
|
+
float t1 = sin((1.0 - t) * angle) / sinAngle;
|
|
42
|
+
float t2 = sin(t * angle) / sinAngle;
|
|
43
|
+
|
|
44
|
+
return (a * t1) + (b * t2);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
vec3 computeWorldNormal() {
|
|
48
|
+
vec2 size = vec2(textureSize(depthTexture, 0));
|
|
49
|
+
ivec2 p = ivec2(vUv * size);
|
|
50
|
+
float c0 = texelFetch(depthTexture, p, 0).x;
|
|
51
|
+
float l2 = texelFetch(depthTexture, p - ivec2(2, 0), 0).x;
|
|
52
|
+
float l1 = texelFetch(depthTexture, p - ivec2(1, 0), 0).x;
|
|
53
|
+
float r1 = texelFetch(depthTexture, p + ivec2(1, 0), 0).x;
|
|
54
|
+
float r2 = texelFetch(depthTexture, p + ivec2(2, 0), 0).x;
|
|
55
|
+
float b2 = texelFetch(depthTexture, p - ivec2(0, 2), 0).x;
|
|
56
|
+
float b1 = texelFetch(depthTexture, p - ivec2(0, 1), 0).x;
|
|
57
|
+
float t1 = texelFetch(depthTexture, p + ivec2(0, 1), 0).x;
|
|
58
|
+
float t2 = texelFetch(depthTexture, p + ivec2(0, 2), 0).x;
|
|
59
|
+
float dl = abs((2.0 * l1 - l2) - c0);
|
|
60
|
+
float dr = abs((2.0 * r1 - r2) - c0);
|
|
61
|
+
float db = abs((2.0 * b1 - b2) - c0);
|
|
62
|
+
float dt = abs((2.0 * t1 - t2) - c0);
|
|
63
|
+
vec3 ce = getWorldPos(c0, vUv).xyz;
|
|
64
|
+
vec3 dpdx = (dl < dr) ? ce - getWorldPos(l1, (vUv - vec2(1.0 / size.x, 0.0))).xyz
|
|
65
|
+
: -ce + getWorldPos(r1, (vUv + vec2(1.0 / size.x, 0.0))).xyz;
|
|
66
|
+
vec3 dpdy = (db < dt) ? ce - getWorldPos(b1, (vUv - vec2(0.0, 1.0 / size.y))).xyz
|
|
67
|
+
: -ce + getWorldPos(t1, (vUv + vec2(0.0, 1.0 / size.y))).xyz;
|
|
68
|
+
return normalize(cross(dpdx, dpdy));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
vec3 getWorldNormal(const vec2 uv) {
|
|
72
|
+
#ifdef useNormalTexture
|
|
73
|
+
vec3 worldNormal = unpackRGBToNormal(textureLod(normalTexture, uv, 0.).rgb);
|
|
74
|
+
|
|
75
|
+
worldNormal = (vec4(worldNormal, 1.) * viewMatrix).xyz; // view-space to world-space
|
|
76
|
+
return normalize(worldNormal);
|
|
77
|
+
#else
|
|
78
|
+
return computeWorldNormal(); // compute world normal from depth
|
|
79
|
+
#endif
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
#define PI 3.14159265358979323846264338327950288
|
|
83
|
+
|
|
84
|
+
// source: https://www.shadertoy.com/view/cll3R4
|
|
85
|
+
vec3 cosineSampleHemisphere(const vec3 n, const vec2 u) {
|
|
86
|
+
float r = sqrt(u.x);
|
|
87
|
+
float theta = 2.0 * PI * u.y;
|
|
88
|
+
|
|
89
|
+
vec3 b = normalize(cross(n, vec3(0.0, 1.0, 1.0)));
|
|
90
|
+
vec3 t = cross(b, n);
|
|
91
|
+
|
|
92
|
+
return normalize(r * sin(theta) * b + sqrt(1.0 - u.x) * n + r * cos(theta) * t);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
`
|