three-base 2.0.130 → 2.0.137

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.
Files changed (125) hide show
  1. package/ApngTexture.d.ts +13 -13
  2. package/ApngTexture.js +61 -61
  3. package/ApngTextureManage.d.ts +18 -18
  4. package/ApngTextureManage.js +87 -87
  5. package/DirectionalLight.d.ts +6 -0
  6. package/DirectionalLight.js +68 -0
  7. package/EventMesh.d.ts +18 -18
  8. package/EventMesh.js +59 -59
  9. package/ExtrudeMesh.d.ts +112 -112
  10. package/ExtrudeMesh.js +366 -366
  11. package/FPScontrol.d.ts +78 -50
  12. package/FPScontrol.js +617 -232
  13. package/Fire/Fire.d.ts +28 -28
  14. package/Fire/Fire.js +79 -79
  15. package/Fire/FireGromtry.d.ts +9 -9
  16. package/Fire/FireGromtry.js +40 -40
  17. package/Fire/FireMaterial.d.ts +28 -28
  18. package/Fire/FireMaterial.js +32 -32
  19. package/Fire/index.d.ts +1 -1
  20. package/Fire/index.js +1 -1
  21. package/Grass/Grass.d.ts +8 -8
  22. package/Grass/Grass.js +38 -38
  23. package/Grass/index.d.ts +1 -1
  24. package/Grass/index.js +1 -1
  25. package/Ground1/Ground1.d.ts +11 -11
  26. package/Ground1/Ground1.js +54 -54
  27. package/Ground1/index.d.ts +1 -1
  28. package/Ground1/index.js +1 -1
  29. package/InstancedMeshBase.d.ts +39 -39
  30. package/InstancedMeshBase.js +293 -293
  31. package/KeyFrameAnimation.d.ts +25 -25
  32. package/KeyFrameAnimation.js +78 -78
  33. package/MeshBase.d.ts +35 -35
  34. package/MeshBase.js +223 -223
  35. package/Mirror.d.ts +25 -25
  36. package/Mirror.js +139 -139
  37. package/PipeMesh/PathGeometry.d.ts +44 -44
  38. package/PipeMesh/PathGeometry.js +300 -300
  39. package/PipeMesh/PathPoint.d.ts +17 -17
  40. package/PipeMesh/PathPoint.js +31 -31
  41. package/PipeMesh/PathPointList.d.ts +31 -31
  42. package/PipeMesh/PathPointList.js +208 -208
  43. package/PipeMesh/PathTubeGeometry.d.ts +25 -25
  44. package/PipeMesh/PathTubeGeometry.js +130 -130
  45. package/PipeMesh/PipeMesh.d.ts +25 -25
  46. package/PipeMesh/PipeMesh.js +63 -63
  47. package/PipeMesh/index.d.ts +1 -1
  48. package/PipeMesh/index.js +1 -1
  49. package/PlaneModal1/PlaneModal1.d.ts +31 -31
  50. package/PlaneModal1/PlaneModal1.js +105 -105
  51. package/PlaneModal1/index.d.ts +1 -1
  52. package/PlaneModal1/index.js +1 -1
  53. package/PlaneText.d.ts +39 -39
  54. package/PlaneText.js +30 -30
  55. package/PlaneWithHtml.d.ts +11 -11
  56. package/PlaneWithHtml.js +63 -68
  57. package/PointLight/PointLight.d.ts +14 -13
  58. package/PointLight/PointLight.js +70 -64
  59. package/PointLight/index.d.ts +1 -1
  60. package/PointLight/index.js +1 -1
  61. package/Sky/Sky.d.ts +9 -9
  62. package/Sky/Sky.js +22 -22
  63. package/Sky/index.d.ts +1 -1
  64. package/Sky/index.js +1 -1
  65. package/SpotLight.d.ts +6 -0
  66. package/SpotLight.js +72 -0
  67. package/SpriteModal1/SpriteModal1.d.ts +30 -30
  68. package/SpriteModal1/SpriteModal1.js +110 -110
  69. package/SpriteModal1/index.d.ts +1 -1
  70. package/SpriteModal1/index.js +1 -1
  71. package/SpriteText.d.ts +45 -45
  72. package/SpriteText.js +163 -163
  73. package/SpriteText2.d.ts +47 -47
  74. package/SpriteText2.js +198 -198
  75. package/SpriteWithHtml.d.ts +7 -7
  76. package/SpriteWithHtml.js +44 -49
  77. package/Text3D/Text3D.d.ts +20 -20
  78. package/Text3D/Text3D.js +62 -62
  79. package/Text3D/fontController.d.ts +59 -59
  80. package/Text3D/fontController.js +199 -199
  81. package/Text3D/index.d.ts +1 -1
  82. package/Text3D/index.js +1 -1
  83. package/ThreeBase.d.ts +111 -81
  84. package/ThreeBase.js +656 -560
  85. package/ThreeMouse.d.ts +40 -40
  86. package/ThreeMouse.js +407 -407
  87. package/Transition.d.ts +40 -40
  88. package/Transition.js +210 -210
  89. package/Water/Water.d.ts +5 -0
  90. package/Water/Water.js +26 -0
  91. package/Water/waternormals.jpg +0 -0
  92. package/declare.d.ts +167 -0
  93. package/index.d.ts +1 -1
  94. package/index.js +2 -2
  95. package/keyContorls.d.ts +25 -25
  96. package/keyContorls.js +98 -98
  97. package/package.json +3 -2
  98. package/pass/bloom_pass.d.ts +2 -2
  99. package/pass/bloom_pass.js +99 -99
  100. package/pass/cover_pass.d.ts +2 -2
  101. package/pass/cover_pass.js +95 -95
  102. package/pass/emissive_ao_pass.d.ts +13 -0
  103. package/pass/emissive_ao_pass.js +370 -0
  104. package/pass/frosted_glass_pass.d.ts +2 -0
  105. package/pass/frosted_glass_pass.js +275 -0
  106. package/pass/fsQuad.d.ts +9 -9
  107. package/pass/fsQuad.js +28 -28
  108. package/pass/glow_pass.d.ts +2 -2
  109. package/pass/glow_pass.js +310 -254
  110. package/pass/ssao_pass.d.ts +13 -0
  111. package/pass/ssao_pass.js +372 -0
  112. package/pass/stroke_pass.d.ts +2 -2
  113. package/pass/stroke_pass.js +199 -199
  114. package/shaders/FXAAShaderMaterial.d.ts +3 -3
  115. package/shaders/FXAAShaderMaterial.js +21 -21
  116. package/shaders/baseTextureToRenderShader.d.ts +2 -2
  117. package/shaders/baseTextureToRenderShader.js +14 -14
  118. package/shaders/copyShader.d.ts +3 -3
  119. package/shaders/copyShader.js +14 -14
  120. package/shaders.d.ts +5 -5
  121. package/shaders.js +42 -42
  122. package/threeLoader.d.ts +34 -34
  123. package/threeLoader.js +527 -527
  124. package/threeUtils.d.ts +52 -52
  125. package/threeUtils.js +330 -330
@@ -1,55 +1,55 @@
1
- /*
2
- * @Author: xiaosihan
3
- * @Date: 2024-09-23 21:07:06
4
- * @Last Modified by: xiaosihan
5
- * @Last Modified time: 2025-01-28 04:01:58
6
- */
7
- /*
8
- * @Author: xiaosihan
9
- * @Date: 2023-05-09 00:35:17
10
- * @Last Modified by: xiaosihan
11
- * @Last Modified time: 2023-05-09 02:33:28
12
- */
13
- import { Color, DepthFormat, DepthTexture, LinearFilter, RGBAFormat, Scene, ShaderChunk, ShaderMaterial, UnsignedShortType, Vector2, WebGLRenderTarget, } from "three";
14
- import fsQuad from "./fsQuad";
15
- // 选中对象的深度纹理
16
- const selectDepthTexture = (() => {
17
- const baseDepthTexture = new DepthTexture(1024, 1024);
18
- baseDepthTexture.format = DepthFormat;
19
- baseDepthTexture.type = UnsignedShortType;
20
- baseDepthTexture.anisotropy = 16;
21
- return baseDepthTexture;
22
- })();
23
- // 选中对象的纹理
24
- const selectTextureTarget = new WebGLRenderTarget(512, 512, {
25
- minFilter: LinearFilter,
26
- magFilter: LinearFilter,
27
- format: RGBAFormat,
28
- depthTexture: selectDepthTexture,
29
- anisotropy: 16,
30
- });
31
- // 深度测试后的选中纹理
32
- const selectDethpTestTextureTarget = new WebGLRenderTarget(512, 512, {
33
- minFilter: LinearFilter,
34
- magFilter: LinearFilter,
35
- format: RGBAFormat,
36
- anisotropy: 16,
37
- });
38
- const blur1TextureTarget = new WebGLRenderTarget(512, 512, {
39
- minFilter: LinearFilter,
40
- magFilter: LinearFilter,
41
- format: RGBAFormat,
42
- });
43
- const size = new Vector2();
44
- //深度比对纹理
45
- const depthTestShader = new ShaderMaterial({
46
- uniforms: {
47
- color: { value: new Color("#440000") },
48
- opacity: { value: 1 },
49
- depthTest: { value: true },
50
- baseDepth: { value: null },
51
- selectDepth: { value: null }, // 选中的对象深度纹理
52
- },
1
+ /*
2
+ * @Author: xiaosihan
3
+ * @Date: 2024-09-23 21:07:06
4
+ * @Last Modified by: xiaosihan
5
+ * @Last Modified time: 2025-01-28 04:01:58
6
+ */
7
+ /*
8
+ * @Author: xiaosihan
9
+ * @Date: 2023-05-09 00:35:17
10
+ * @Last Modified by: xiaosihan
11
+ * @Last Modified time: 2023-05-09 02:33:28
12
+ */
13
+ import { Color, DepthFormat, DepthTexture, LinearFilter, RGBAFormat, Scene, ShaderChunk, ShaderMaterial, UnsignedShortType, Vector2, WebGLRenderTarget } from "three";
14
+ import fsQuad from "./fsQuad";
15
+ // 选中对象的深度纹理
16
+ const selectDepthTexture = (() => {
17
+ const baseDepthTexture = new DepthTexture(1024, 1024);
18
+ baseDepthTexture.format = DepthFormat;
19
+ baseDepthTexture.type = UnsignedShortType;
20
+ baseDepthTexture.anisotropy = 16;
21
+ return baseDepthTexture;
22
+ })();
23
+ // 选中对象的纹理
24
+ const selectTextureTarget = new WebGLRenderTarget(512, 512, {
25
+ minFilter: LinearFilter,
26
+ magFilter: LinearFilter,
27
+ format: RGBAFormat,
28
+ depthTexture: selectDepthTexture,
29
+ anisotropy: 16,
30
+ });
31
+ // 深度测试后的选中纹理
32
+ const selectDethpTestTextureTarget = new WebGLRenderTarget(512, 512, {
33
+ minFilter: LinearFilter,
34
+ magFilter: LinearFilter,
35
+ format: RGBAFormat,
36
+ anisotropy: 16,
37
+ });
38
+ const blur1TextureTarget = new WebGLRenderTarget(512, 512, {
39
+ minFilter: LinearFilter,
40
+ magFilter: LinearFilter,
41
+ format: RGBAFormat,
42
+ });
43
+ const size = new Vector2();
44
+ //深度比对纹理
45
+ const depthTestShader = new ShaderMaterial({
46
+ uniforms: {
47
+ color: { value: new Color("#440000") }, //颜色
48
+ opacity: { value: 1 }, // 透明度
49
+ depthTest: { value: true }, // 开启深度测试
50
+ baseDepth: { value: null }, // 整个场景的深度纹理
51
+ selectDepth: { value: null }, // 选中的对象深度纹理
52
+ },
53
53
  vertexShader: `
54
54
  ${ShaderChunk.common}
55
55
  ${ShaderChunk.logdepthbuf_pars_vertex}
@@ -61,7 +61,7 @@ const depthTestShader = new ShaderMaterial({
61
61
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
62
62
  ${ShaderChunk.logdepthbuf_vertex}
63
63
  }
64
- `,
64
+ `,
65
65
  fragmentShader: `
66
66
  ${ShaderChunk.logdepthbuf_pars_fragment}
67
67
  uniform vec3 color;
@@ -89,45 +89,45 @@ const depthTestShader = new ShaderMaterial({
89
89
 
90
90
  ${ShaderChunk.logdepthbuf_fragment}
91
91
  }
92
- `,
93
- depthTest: true,
94
- depthWrite: true,
95
- transparent: true,
96
- });
97
- // 场景对象
98
- const scene = new Scene();
99
- // 给模型覆盖一层颜色 后处理通道
100
- export default function cover_pass(renderer, camera, object3d, baseDepthTexture, devicePixelRatio) {
101
- const { cover_enable = false, cover_color = "#04fa12", cover_opacity = 1, cover_depth_test = true, // 颜色叠加是否开启深度测试
102
- } = object3d.userData;
103
- if (!cover_enable || cover_opacity === 0) {
104
- return;
105
- }
106
- // 保存原帧缓冲区
107
- const originRenderTarget = renderer.getRenderTarget();
108
- // 设置选中目标的帧缓冲区
109
- renderer.getSize(size);
110
- size.multiplyScalar(devicePixelRatio);
111
- selectTextureTarget.setSize(size.x, size.y);
112
- selectDethpTestTextureTarget.setSize(size.x, size.y);
113
- blur1TextureTarget.setSize(size.x, size.y);
114
- renderer.setRenderTarget(selectTextureTarget);
115
- scene.children = [object3d];
116
- renderer.clear();
117
- renderer.render(scene, camera);
118
- //更具深度测试绘制叠加颜色
119
- renderer.setRenderTarget(originRenderTarget);
120
- renderer.clearDepth();
121
- depthTestShader.uniforms.color.value.set(cover_color);
122
- depthTestShader.uniforms.opacity.value = cover_opacity;
123
- depthTestShader.uniforms.depthTest.value = cover_depth_test;
124
- depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
125
- depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
126
- fsQuad.render(renderer, depthTestShader);
127
- // 调试代码
128
- // renderer.setRenderTarget(null);
129
- // renderer.clearDepth();
130
- // copyShader.uniforms.map.value = blur2TextureTarget.texture;
131
- // fsQuad.render(renderer, copyShader);
132
- // return;
133
- }
92
+ `,
93
+ depthTest: true,
94
+ depthWrite: true,
95
+ transparent: true,
96
+ });
97
+ // 场景对象
98
+ const scene = new Scene();
99
+ // 给模型覆盖一层颜色 后处理通道
100
+ export default function cover_pass(renderer, camera, object3d, baseDepthTexture, devicePixelRatio) {
101
+ const { cover_enable = false, cover_color = "#04fa12", cover_opacity = 1, cover_depth_test = true, // 颜色叠加是否开启深度测试
102
+ } = object3d.userData;
103
+ if (!cover_enable || cover_opacity === 0) {
104
+ return;
105
+ }
106
+ // 保存原帧缓冲区
107
+ const originRenderTarget = renderer.getRenderTarget();
108
+ // 设置选中目标的帧缓冲区
109
+ renderer.getSize(size);
110
+ size.multiplyScalar(devicePixelRatio);
111
+ selectTextureTarget.setSize(size.x, size.y);
112
+ selectDethpTestTextureTarget.setSize(size.x, size.y);
113
+ blur1TextureTarget.setSize(size.x, size.y);
114
+ renderer.setRenderTarget(selectTextureTarget);
115
+ scene.children = [object3d];
116
+ renderer.clear();
117
+ renderer.render(scene, camera);
118
+ //更具深度测试绘制叠加颜色
119
+ renderer.setRenderTarget(originRenderTarget);
120
+ renderer.clearDepth();
121
+ depthTestShader.uniforms.color.value.set(cover_color);
122
+ depthTestShader.uniforms.opacity.value = cover_opacity;
123
+ depthTestShader.uniforms.depthTest.value = cover_depth_test;
124
+ depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
125
+ depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
126
+ fsQuad.render(renderer, depthTestShader);
127
+ // 调试代码
128
+ // renderer.setRenderTarget(null);
129
+ // renderer.clearDepth();
130
+ // copyShader.uniforms.map.value = blur2TextureTarget.texture;
131
+ // fsQuad.render(renderer, copyShader);
132
+ // return;
133
+ }
@@ -0,0 +1,13 @@
1
+ import { Camera, DepthTexture, WebGLRenderer } from "three";
2
+ export default function emissive_ao_pass(renderer: WebGLRenderer, camera: Camera, depthTexture: DepthTexture, emissiveTexture: any, devicePixelRatio: number, options: {
3
+ enable: boolean;
4
+ debug?: boolean;
5
+ radius?: number;
6
+ falloff?: number;
7
+ bias?: number;
8
+ intensity?: number;
9
+ sampleCount?: number;
10
+ blurRadius?: number;
11
+ strength?: number;
12
+ cameraFar?: number;
13
+ }): void;
@@ -0,0 +1,370 @@
1
+ import { LinearFilter, NoBlending, RGBAFormat, RawShaderMaterial, Vector2, WebGLRenderTarget, Matrix4, AdditiveBlending, } from "three";
2
+ import fsQuad from "./fsQuad";
3
+ const emissiveTextureTarget = new WebGLRenderTarget(512, 512, {
4
+ minFilter: LinearFilter,
5
+ magFilter: LinearFilter,
6
+ format: RGBAFormat,
7
+ });
8
+ const blurTextureTarget = new WebGLRenderTarget(512, 512, {
9
+ minFilter: LinearFilter,
10
+ magFilter: LinearFilter,
11
+ format: RGBAFormat,
12
+ });
13
+ const size = new Vector2();
14
+ const projectionMatrix = new Matrix4();
15
+ const inverseProjectionMatrix = new Matrix4();
16
+ const emissiveShader = new RawShaderMaterial({
17
+ uniforms: {
18
+ depthTexture: { value: null },
19
+ emissiveTexture: { value: null },
20
+ resolution: { value: new Vector2(1 / 512, 1 / 512) },
21
+ projectionMatrix: { value: new Matrix4() },
22
+ inverseProjectionMatrix: { value: new Matrix4() },
23
+ radius: { value: 3.0 },
24
+ falloff: { value: 8.0 },
25
+ bias: { value: 0.2 },
26
+ intensity: { value: 1.0 },
27
+ sampleCount: { value: 16 },
28
+ cameraFar: { value: 20000 },
29
+ },
30
+ vertexShader: `
31
+ attribute vec3 position;
32
+ attribute vec2 uv;
33
+ varying vec2 vUv;
34
+ void main() {
35
+ vUv = uv;
36
+ gl_Position = vec4(position, 1.0);
37
+ }`,
38
+ fragmentShader: `
39
+ #ifdef GL_ES
40
+ precision highp float;
41
+ #endif
42
+
43
+ uniform sampler2D depthTexture;
44
+ uniform sampler2D emissiveTexture;
45
+ uniform vec2 resolution;
46
+ uniform mat4 projectionMatrix;
47
+ uniform mat4 inverseProjectionMatrix;
48
+ uniform float radius;
49
+ uniform float falloff;
50
+ uniform float bias;
51
+ uniform float intensity;
52
+ uniform int sampleCount;
53
+ uniform float cameraFar;
54
+
55
+ varying vec2 vUv;
56
+
57
+ float linearizeLogDepth(float logDepth) {
58
+ return pow(cameraFar + 1.0, logDepth) - 1.0;
59
+ }
60
+
61
+ vec3 reconstructPosition(vec2 uv, float viewZ) {
62
+ vec4 ndc = vec4(uv * 2.0 - 1.0, 0.0, 1.0);
63
+ vec4 viewDir4 = inverseProjectionMatrix * ndc;
64
+ vec3 viewDir = viewDir4.xyz / viewDir4.w;
65
+ return viewDir * (viewZ / (-viewDir.z));
66
+ }
67
+
68
+ vec3 reconstructNormal(vec2 uv, vec2 res) {
69
+ vec2 step = res * 2.0;
70
+
71
+ float dC = texture2D(depthTexture, uv).r;
72
+ float dL = texture2D(depthTexture, uv - vec2(step.x, 0.0)).r;
73
+ float dR = texture2D(depthTexture, uv + vec2(step.x, 0.0)).r;
74
+ float dD = texture2D(depthTexture, uv - vec2(0.0, step.y)).r;
75
+ float dU = texture2D(depthTexture, uv + vec2(0.0, step.y)).r;
76
+
77
+ if (dL >= 1.0 || dR >= 1.0 || dD >= 1.0 || dU >= 1.0 || dC >= 1.0) {
78
+ return vec3(0.0, 0.0, 1.0);
79
+ }
80
+
81
+ float edgeThreshold = 0.003;
82
+ float dL2 = abs(dL - dC) < edgeThreshold ? dL : dC;
83
+ float dR2 = abs(dR - dC) < edgeThreshold ? dR : dC;
84
+ float dD2 = abs(dD - dC) < edgeThreshold ? dD : dC;
85
+ float dU2 = abs(dU - dC) < edgeThreshold ? dU : dC;
86
+
87
+ float vC = linearizeLogDepth(dC);
88
+ float vL = linearizeLogDepth(dL2);
89
+ float vR = linearizeLogDepth(dR2);
90
+ float vD = linearizeLogDepth(dD2);
91
+ float vU = linearizeLogDepth(dU2);
92
+
93
+ vec3 pC = reconstructPosition(uv, vC);
94
+ vec3 pL = reconstructPosition(uv - vec2(step.x, 0.0), vL);
95
+ vec3 pR = reconstructPosition(uv + vec2(step.x, 0.0), vR);
96
+ vec3 pD = reconstructPosition(uv - vec2(0.0, step.y), vD);
97
+ vec3 pU = reconstructPosition(uv + vec2(0.0, step.y), vU);
98
+
99
+ vec3 tangentX = pR - pL;
100
+ vec3 tangentY = pU - pD;
101
+
102
+ if (length(tangentX) < 0.001 || length(tangentY) < 0.001) {
103
+ return vec3(0.0, 0.0, 1.0);
104
+ }
105
+
106
+ vec3 normal = cross(normalize(tangentX), normalize(tangentY));
107
+ return normalize(normal);
108
+ }
109
+
110
+ float random(vec2 seed) {
111
+ return fract(sin(dot(seed, vec2(12.9898, 78.233))) * 43758.5453);
112
+ }
113
+
114
+ void main() {
115
+ float logDepth = texture2D(depthTexture, vUv).r;
116
+
117
+ if (logDepth >= 1.0) {
118
+ gl_FragColor = vec4(0.0);
119
+ return;
120
+ }
121
+
122
+ float viewZ = linearizeLogDepth(logDepth);
123
+ vec3 position = reconstructPosition(vUv, viewZ);
124
+ vec3 normal = reconstructNormal(vUv, resolution);
125
+
126
+ float projScale = 1.0 / (2.0 * abs(viewZ) * resolution.x);
127
+ float pixelRadius = max(radius * projScale, 1.0);
128
+
129
+ vec3 accumulatedColor = vec3(0.0);
130
+ float totalWeight = 0.0;
131
+
132
+ float angle = random(vUv) * 6.2831853;
133
+ float stepAngle = 6.2831853 / float(sampleCount);
134
+
135
+ for (int i = 0; i < 64; i++) {
136
+ if (i >= sampleCount) break;
137
+
138
+ float theta = angle + float(i) * stepAngle;
139
+ float r = sqrt(float(i + 1)) * (pixelRadius / sqrt(float(sampleCount)));
140
+
141
+ vec2 sampleUv = vUv + vec2(cos(theta), sin(theta)) * r * resolution;
142
+
143
+ if (sampleUv.x < 0.0 || sampleUv.x > 1.0 || sampleUv.y < 0.0 || sampleUv.y > 1.0) {
144
+ continue;
145
+ }
146
+
147
+ float sampleLogDepth = texture2D(depthTexture, sampleUv).r;
148
+ if (sampleLogDepth >= 1.0) continue;
149
+
150
+ float depthDiff = abs(sampleLogDepth - logDepth);
151
+ if (depthDiff > 0.002) continue;
152
+
153
+ float sampleViewZ = linearizeLogDepth(sampleLogDepth);
154
+ vec3 samplePosition = reconstructPosition(sampleUv, sampleViewZ);
155
+
156
+ vec3 diff = position - samplePosition;
157
+ float dist = length(diff);
158
+
159
+ float tangentDist = dot(diff, normal);
160
+ if (tangentDist < bias) continue;
161
+
162
+ vec3 emissiveColor = texture2D(emissiveTexture, sampleUv).rgb;
163
+ float emissiveIntensity = length(emissiveColor);
164
+
165
+ if (emissiveIntensity > 0.01 && dist < falloff) {
166
+ float rangeCheck = smoothstep(0.0, falloff, dist);
167
+ float weight = (1.0 - rangeCheck) * (1.0 - tangentDist / falloff);
168
+ accumulatedColor += emissiveColor * weight;
169
+ totalWeight += weight;
170
+ }
171
+ }
172
+
173
+ if (totalWeight > 0.0) {
174
+ accumulatedColor /= totalWeight;
175
+ }
176
+
177
+ accumulatedColor *= intensity;
178
+ accumulatedColor = clamp(accumulatedColor, 0.0, 1.0);
179
+
180
+ gl_FragColor = vec4(accumulatedColor, 1.0);
181
+ }`,
182
+ blending: NoBlending,
183
+ depthTest: false,
184
+ depthWrite: false,
185
+ transparent: true,
186
+ });
187
+ const blurHShader = new RawShaderMaterial({
188
+ uniforms: {
189
+ tDiffuse: { value: null },
190
+ resolution: { value: new Vector2(1 / 512, 1 / 512) },
191
+ blurRadius: { value: 2.0 },
192
+ depthTexture: { value: null },
193
+ },
194
+ vertexShader: `
195
+ attribute vec3 position;
196
+ attribute vec2 uv;
197
+ varying vec2 vUv;
198
+ void main() {
199
+ vUv = uv;
200
+ gl_Position = vec4(position, 1.0);
201
+ }`,
202
+ fragmentShader: `
203
+ #ifdef GL_ES
204
+ precision highp float;
205
+ #endif
206
+
207
+ uniform sampler2D tDiffuse;
208
+ uniform vec2 resolution;
209
+ uniform float blurRadius;
210
+ uniform sampler2D depthTexture;
211
+
212
+ varying vec2 vUv;
213
+
214
+ void main() {
215
+ float centerDepth = texture2D(depthTexture, vUv).r;
216
+ vec4 color = vec4(0.0);
217
+ float totalWeight = 0.0;
218
+
219
+ for (int i = -4; i <= 4; i++) {
220
+ float weight = exp(-float(i * i) / 8.0);
221
+ vec2 offset = vec2(float(i) * blurRadius * resolution.x, 0.0);
222
+ vec2 sampleUv = vUv + offset;
223
+ float sampleDepth = texture2D(depthTexture, sampleUv).r;
224
+ float depthWeight = abs(sampleDepth - centerDepth) < 0.001 ? 1.0 : 0.1;
225
+ color += texture2D(tDiffuse, sampleUv) * weight * depthWeight;
226
+ totalWeight += weight * depthWeight;
227
+ }
228
+
229
+ gl_FragColor = color / totalWeight;
230
+ }`,
231
+ blending: NoBlending,
232
+ depthTest: false,
233
+ depthWrite: false,
234
+ transparent: true,
235
+ });
236
+ const blurVShader = new RawShaderMaterial({
237
+ uniforms: {
238
+ tDiffuse: { value: null },
239
+ resolution: { value: new Vector2(1 / 512, 1 / 512) },
240
+ blurRadius: { value: 2.0 },
241
+ depthTexture: { value: null },
242
+ },
243
+ vertexShader: `
244
+ attribute vec3 position;
245
+ attribute vec2 uv;
246
+ varying vec2 vUv;
247
+ void main() {
248
+ vUv = uv;
249
+ gl_Position = vec4(position, 1.0);
250
+ }`,
251
+ fragmentShader: `
252
+ #ifdef GL_ES
253
+ precision highp float;
254
+ #endif
255
+
256
+ uniform sampler2D tDiffuse;
257
+ uniform vec2 resolution;
258
+ uniform float blurRadius;
259
+ uniform sampler2D depthTexture;
260
+
261
+ varying vec2 vUv;
262
+
263
+ void main() {
264
+ float centerDepth = texture2D(depthTexture, vUv).r;
265
+ vec4 color = vec4(0.0);
266
+ float totalWeight = 0.0;
267
+
268
+ for (int i = -4; i <= 4; i++) {
269
+ float weight = exp(-float(i * i) / 8.0);
270
+ vec2 offset = vec2(0.0, float(i) * blurRadius * resolution.y);
271
+ vec2 sampleUv = vUv + offset;
272
+ float sampleDepth = texture2D(depthTexture, sampleUv).r;
273
+ float depthWeight = abs(sampleDepth - centerDepth) < 0.001 ? 1.0 : 0.1;
274
+ color += texture2D(tDiffuse, sampleUv) * weight * depthWeight;
275
+ totalWeight += weight * depthWeight;
276
+ }
277
+
278
+ gl_FragColor = color / totalWeight;
279
+ }`,
280
+ blending: NoBlending,
281
+ depthTest: false,
282
+ depthWrite: false,
283
+ transparent: true,
284
+ });
285
+ const outputShader = new RawShaderMaterial({
286
+ uniforms: {
287
+ emissiveTexture: { value: null },
288
+ strength: { value: 1.0 },
289
+ debug: { value: 0.0 },
290
+ },
291
+ vertexShader: `
292
+ attribute vec3 position;
293
+ attribute vec2 uv;
294
+ varying vec2 vUv;
295
+ void main() {
296
+ vUv = uv;
297
+ gl_Position = vec4(position, 1.0);
298
+ }`,
299
+ fragmentShader: `
300
+ #ifdef GL_ES
301
+ precision highp float;
302
+ #endif
303
+
304
+ uniform sampler2D emissiveTexture;
305
+ uniform float strength;
306
+ uniform float debug;
307
+
308
+ varying vec2 vUv;
309
+
310
+ void main() {
311
+ vec3 emissive = texture2D(emissiveTexture, vUv).rgb;
312
+ vec3 finalEmissive = emissive * strength;
313
+
314
+ if (debug > 0.5) {
315
+ gl_FragColor = vec4(finalEmissive, 1.0);
316
+ } else {
317
+ gl_FragColor = vec4(finalEmissive, length(finalEmissive));
318
+ }
319
+ }`,
320
+ blending: AdditiveBlending,
321
+ depthTest: false,
322
+ depthWrite: false,
323
+ transparent: true,
324
+ });
325
+ export default function emissive_ao_pass(renderer, camera, depthTexture, emissiveTexture, devicePixelRatio, options) {
326
+ if (!options.enable || !options.strength) {
327
+ return;
328
+ }
329
+ renderer.getSize(size);
330
+ size.multiplyScalar(devicePixelRatio);
331
+ emissiveTextureTarget.setSize(size.x, size.y);
332
+ blurTextureTarget.setSize(size.x, size.y);
333
+ projectionMatrix.copy(camera.projectionMatrix);
334
+ inverseProjectionMatrix.copy(projectionMatrix).invert();
335
+ emissiveShader.uniforms.depthTexture.value = depthTexture;
336
+ emissiveShader.uniforms.emissiveTexture.value = emissiveTexture;
337
+ emissiveShader.uniforms.resolution.value.set(1 / size.x, 1 / size.y);
338
+ emissiveShader.uniforms.projectionMatrix.value = projectionMatrix;
339
+ emissiveShader.uniforms.inverseProjectionMatrix.value = inverseProjectionMatrix;
340
+ emissiveShader.uniforms.radius.value = options.radius || 3.0;
341
+ emissiveShader.uniforms.falloff.value = options.falloff || 8.0;
342
+ emissiveShader.uniforms.bias.value = options.bias || 0.2;
343
+ emissiveShader.uniforms.intensity.value = options.intensity || 1.0;
344
+ emissiveShader.uniforms.sampleCount.value = options.sampleCount || 16;
345
+ emissiveShader.uniforms.cameraFar.value = options.cameraFar || camera.far || 20000;
346
+ renderer.setRenderTarget(emissiveTextureTarget);
347
+ renderer.clear();
348
+ fsQuad.render(renderer, emissiveShader);
349
+ const blurRes = new Vector2(1 / size.x, 1 / size.y);
350
+ const blurR = options.blurRadius || 2.0;
351
+ blurHShader.uniforms.tDiffuse.value = emissiveTextureTarget.texture;
352
+ blurHShader.uniforms.resolution.value.copy(blurRes);
353
+ blurHShader.uniforms.blurRadius.value = blurR;
354
+ blurHShader.uniforms.depthTexture.value = depthTexture;
355
+ renderer.setRenderTarget(blurTextureTarget);
356
+ renderer.clear();
357
+ fsQuad.render(renderer, blurHShader);
358
+ blurVShader.uniforms.tDiffuse.value = blurTextureTarget.texture;
359
+ blurVShader.uniforms.resolution.value.copy(blurRes);
360
+ blurVShader.uniforms.blurRadius.value = blurR;
361
+ blurVShader.uniforms.depthTexture.value = depthTexture;
362
+ renderer.setRenderTarget(emissiveTextureTarget);
363
+ renderer.clear();
364
+ fsQuad.render(renderer, blurVShader);
365
+ renderer.setRenderTarget(null);
366
+ outputShader.uniforms.emissiveTexture.value = emissiveTextureTarget.texture;
367
+ outputShader.uniforms.strength.value = options.strength || 1.0;
368
+ outputShader.uniforms.debug.value = options.debug ? 1.0 : 0.0;
369
+ fsQuad.render(renderer, outputShader);
370
+ }
@@ -0,0 +1,2 @@
1
+ import { Camera, DepthTexture, Scene, WebGLRenderTarget, WebGLRenderer } from "three";
2
+ export default function frosted_glass_pass(renderer: WebGLRenderer, camera: Camera, scene: Scene, baseRenderTarget: WebGLRenderTarget, baseDepthTexture: DepthTexture, devicePixelRatio: number): void;