three-base 2.0.142 → 2.0.166
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/DirectionalLight.d.ts +6 -6
- package/DirectionalLight.js +68 -68
- package/EventMap.d.ts +103 -103
- package/EventMap.js +17 -17
- package/EventMesh.d.ts +18 -18
- package/EventMesh.js +59 -59
- package/ExtrudeMesh.d.ts +112 -112
- package/ExtrudeMesh.js +342 -342
- package/FPScontrol.d.ts +531 -511
- package/FPScontrol.js +1866 -1799
- package/FPScontrol.ts +1922 -1855
- package/Fire/Fire.d.ts +28 -28
- package/Fire/Fire.js +80 -80
- package/Fire/FireGeometry.d.ts +9 -9
- package/Fire/FireGeometry.js +40 -40
- package/Fire/FireMaterial.d.ts +28 -28
- package/Fire/FireMaterial.js +32 -32
- package/Fire/index.d.ts +2 -2
- package/Fire/index.js +2 -2
- package/GLTFDracoLoader.d.ts +71 -71
- package/GLTFDracoLoader.js +266 -266
- package/GLTFDracoLoader.ts +1 -1
- package/Grass/Grass.d.ts +8 -8
- package/Grass/Grass.js +38 -38
- package/Grass/index.d.ts +2 -2
- package/Grass/index.js +2 -2
- package/Ground1/Ground1.d.ts +10 -10
- package/Ground1/Ground1.js +71 -71
- package/Ground1/index.d.ts +1 -1
- package/Ground1/index.js +1 -1
- package/MeshBase.d.ts +36 -36
- package/MeshBase.js +251 -247
- package/MeshBase.ts +6 -2
- package/Mirror.d.ts +25 -25
- package/Mirror.js +143 -143
- package/MktMesh/MktMesh.d.ts +301 -291
- package/MktMesh/MktMesh.js +1064 -1045
- package/MktMesh/MktMesh.ts +32 -11
- package/MktMesh/assetUrl.d.ts +59 -35
- package/MktMesh/assetUrl.js +165 -69
- package/MktMesh/assetUrl.ts +164 -69
- package/MktMesh/mktMappingShader.d.ts +12 -12
- package/MktMesh/mktMappingShader.js +138 -138
- package/MktMesh/mktMappingShader.ts +139 -139
- package/MktMesh/mktShader.d.ts +263 -263
- package/MktMesh/mktShader.js +1236 -1236
- package/MktMesh/mktShader.ts +1344 -1344
- package/MktMesh/panoBitmapTexture.d.ts +25 -25
- package/MktMesh/panoBitmapTexture.js +52 -52
- package/MktMesh/panoBitmapTexture.ts +54 -54
- package/MktMesh/panoSlotBind.d.ts +29 -29
- package/MktMesh/panoSlotBind.js +106 -106
- package/MktMesh/panoSlotBind.ts +153 -153
- package/MktMesh/panoSlotRoster.d.ts +22 -22
- package/MktMesh/panoSlotRoster.js +169 -169
- package/MktMesh/panoSlotRoster.ts +168 -168
- package/MktMesh/panoTileStitcher.d.ts +119 -119
- package/MktMesh/panoTileStitcher.js +529 -529
- package/MktMesh/panoTileStitcher.ts +616 -616
- package/MktMesh/types.d.ts +75 -75
- package/MktMesh/types.js +1 -1
- package/MktMesh/wallCapTessellate.d.ts +33 -33
- package/MktMesh/wallCapTessellate.js +97 -97
- package/MktMesh/wallCapTessellate.ts +68 -68
- package/PipeMesh/PathGeometry.d.ts +44 -44
- package/PipeMesh/PathGeometry.js +307 -307
- package/PipeMesh/PathPoint.d.ts +17 -17
- package/PipeMesh/PathPoint.js +31 -31
- package/PipeMesh/PathPointList.d.ts +31 -31
- package/PipeMesh/PathPointList.js +209 -209
- package/PipeMesh/PathTubeGeometry.d.ts +25 -25
- package/PipeMesh/PathTubeGeometry.js +130 -130
- package/PipeMesh/PipeMesh.d.ts +25 -25
- package/PipeMesh/PipeMesh.js +63 -63
- package/PipeMesh/index.d.ts +1 -1
- package/PipeMesh/index.js +1 -1
- package/PlaneModal1/PlaneModal1.d.ts +34 -34
- package/PlaneModal1/PlaneModal1.js +109 -109
- package/PlaneModal1/index.d.ts +1 -1
- package/PlaneModal1/index.js +1 -1
- package/PlaneText.d.ts +27 -27
- package/PlaneText.js +35 -35
- package/PlaneWithHtml.d.ts +13 -13
- package/PlaneWithHtml.js +66 -64
- package/PlaneWithHtml.ts +3 -1
- package/PointLight/PointLight.d.ts +13 -13
- package/PointLight/PointLight.js +64 -64
- package/PointLight/index.d.ts +1 -1
- package/PointLight/index.js +1 -1
- package/Sky/Sky.d.ts +9 -9
- package/Sky/Sky.js +22 -22
- package/Sky/index.d.ts +1 -1
- package/Sky/index.js +1 -1
- package/SpotLight.d.ts +6 -6
- package/SpotLight.js +72 -72
- package/SpriteModal1/SpriteModal1.d.ts +33 -33
- package/SpriteModal1/SpriteModal1.js +116 -116
- package/SpriteModal1/index.d.ts +1 -1
- package/SpriteModal1/index.js +1 -1
- package/SpriteText.d.ts +46 -46
- package/SpriteText.js +176 -176
- package/SpriteText2.d.ts +48 -48
- package/SpriteText2.js +223 -223
- package/SpriteText3.d.ts +86 -86
- package/SpriteText3.js +517 -517
- package/SpriteText3.ts +599 -599
- package/SpriteWithHtml.d.ts +9 -9
- package/SpriteWithHtml.js +46 -44
- package/SpriteWithHtml.ts +3 -1
- package/Text3D/Text3D.d.ts +20 -20
- package/Text3D/Text3D.js +58 -58
- package/Text3D/fontController.d.ts +60 -60
- package/Text3D/fontController.js +166 -166
- package/Text3D/index.d.ts +1 -1
- package/Text3D/index.js +1 -1
- package/ThreeBase.d.ts +248 -248
- package/ThreeBase.js +1202 -1202
- package/ThreeBase.ts +1314 -1314
- package/ThreeMouse.d.ts +53 -54
- package/ThreeMouse.js +453 -453
- package/Transition.d.ts +45 -45
- package/Transition.js +209 -209
- package/Water/Water.d.ts +5 -5
- package/Water/Water.js +44 -44
- package/Water/index.d.ts +2 -2
- package/Water/index.js +2 -2
- package/WaterFlow/FloatingDuck.d.ts +88 -88
- package/WaterFlow/FloatingDuck.js +307 -307
- package/WaterFlow/FloatingDuck.ts +445 -445
- package/WaterFlow/GPUFluidSimulation.d.ts +56 -56
- package/WaterFlow/GPUFluidSimulation.js +781 -781
- package/WaterFlow/GPUFluidSimulation.ts +827 -827
- package/WaterFlow/ReservoirSystem.d.ts +106 -106
- package/WaterFlow/ReservoirSystem.js +611 -611
- package/WaterFlow/ReservoirSystem.ts +754 -754
- package/WaterFlow/SPHField.d.ts +35 -35
- package/WaterFlow/SPHField.js +203 -203
- package/WaterFlow/SPHField.ts +228 -228
- package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -69
- package/WaterFlow/ScreenSpaceFluidPass.js +728 -728
- package/WaterFlow/ScreenSpaceFluidPass.ts +789 -789
- package/WaterFlow/ShallowWaterSurface.d.ts +45 -45
- package/WaterFlow/ShallowWaterSurface.js +438 -438
- package/WaterFlow/ShallowWaterSurface.ts +510 -510
- package/WaterFlow/WaterFlow.d.ts +87 -87
- package/WaterFlow/WaterFlow.js +171 -171
- package/WaterFlow/WaterFlow.ts +219 -219
- package/WaterFlow/types.d.ts +161 -161
- package/WaterFlow/types.js +1 -1
- package/WaterFlow/types.ts +189 -189
- package/WaterFlow/waterFlowPass.d.ts +3 -3
- package/WaterFlow/waterFlowPass.js +20 -20
- package/WaterFlow/waterFlowPass.ts +40 -40
- package/collisionOBB.d.ts +42 -42
- package/collisionOBB.js +112 -112
- package/collisionOBB.ts +108 -108
- package/declare.d.ts +25 -25
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/instanced/InstancedBatch.d.ts +57 -57
- package/instanced/InstancedBatch.js +348 -348
- package/instanced/InstancedBatch.ts +406 -406
- package/instanced/InstancedChild.d.ts +174 -174
- package/instanced/InstancedChild.js +264 -264
- package/instanced/InstancedChild.ts +327 -327
- package/instanced/InstancedGroup.d.ts +43 -43
- package/instanced/InstancedGroup.js +126 -126
- package/instanced/InstancedGroup.ts +137 -137
- package/instanced/InstancedMeshBase.d.ts +38 -38
- package/instanced/InstancedMeshBase.js +282 -282
- package/instanced/InstancedTemplate.d.ts +46 -46
- package/instanced/InstancedTemplate.js +125 -125
- package/keyControls.d.ts +29 -30
- package/keyControls.js +101 -101
- package/lensflare/LensFlare.d.ts +39 -39
- package/lensflare/LensFlare.js +284 -284
- package/package.json +6 -1
- package/pass/bloom_pass.d.ts +2 -2
- package/pass/bloom_pass.js +174 -174
- package/pass/cover_pass.d.ts +2 -2
- package/pass/cover_pass.js +108 -108
- package/pass/debugDepthState.d.ts +20 -20
- package/pass/debugDepthState.js +9 -9
- package/pass/debugDepthState.ts +22 -22
- package/pass/depthTestBias.d.ts +12 -12
- package/pass/depthTestBias.js +12 -12
- package/pass/depthTestBias.ts +12 -12
- package/pass/effectUserData.d.ts +27 -27
- package/pass/effectUserData.js +1 -1
- package/pass/effectUserData.ts +46 -46
- package/pass/frosted_glass_pass.d.ts +2 -2
- package/pass/frosted_glass_pass.js +150 -150
- package/pass/fsQuad.d.ts +9 -9
- package/pass/fsQuad.js +28 -28
- package/pass/glow_pass.d.ts +2 -2
- package/pass/glow_pass.js +350 -350
- package/pass/screen_bloom_pass.d.ts +11 -11
- package/pass/screen_bloom_pass.js +136 -136
- package/pass/ssao_pass.d.ts +88 -88
- package/pass/ssao_pass.js +799 -799
- package/pass/ssao_pass.ts +918 -918
- package/pass/stroke_pass.d.ts +2 -2
- package/pass/stroke_pass.js +267 -267
- package/shaders/FXAAShaderMaterial.d.ts +3 -3
- package/shaders/FXAAShaderMaterial.js +20 -20
- package/shaders/baseDepthVisShader.d.ts +11 -11
- package/shaders/baseDepthVisShader.js +36 -36
- package/shaders/baseDepthVisShader.ts +36 -36
- package/shaders/baseTextureToRenderShader.d.ts +2 -2
- package/shaders/baseTextureToRenderShader.js +19 -19
- package/shaders/copyShader.d.ts +3 -3
- package/shaders/copyShader.js +13 -13
- package/shaders/debugDepthCompareShader.d.ts +14 -14
- package/shaders/debugDepthCompareShader.js +49 -49
- package/shaders/debugDepthCompareShader.ts +50 -50
- package/shaders/debugDepthJudgeShader.d.ts +18 -18
- package/shaders/debugDepthJudgeShader.js +52 -52
- package/shaders/debugDepthJudgeShader.ts +54 -54
- package/shaders/debugExcludedShader.d.ts +13 -13
- package/shaders/debugExcludedShader.js +46 -46
- package/shaders/debugExcludedShader.ts +48 -48
- package/spriteTextBg.d.ts +1 -1
- package/spriteTextBg.js +20 -20
- package/spriteTextBg.ts +20 -20
- package/threeLoader.d.ts +35 -35
- package/threeLoader.js +518 -518
- package/threeUtils.d.ts +71 -53
- package/threeUtils.js +363 -329
- package/threeUtils.ts +35 -0
- package/types.d.ts +2 -2
- package/types.js +6 -6
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { WebGLRenderTarget, WebGLRenderer } from "three";
|
|
2
|
-
interface ScreenBloomConfig {
|
|
3
|
-
/** 叠加强度 */
|
|
4
|
-
strength: number;
|
|
5
|
-
/** 模糊扩散(0~1):映射高斯偏移步长,越大越柔 */
|
|
6
|
-
radius: number;
|
|
7
|
-
/** 亮部软阈值(0~1):仅亮度高于此值的像素参与辉光 */
|
|
8
|
-
threshold: number;
|
|
9
|
-
}
|
|
10
|
-
export default function screenBloomPass(renderer: WebGLRenderer, sourceRenderTarget: WebGLRenderTarget, config: ScreenBloomConfig): void;
|
|
11
|
-
export {};
|
|
1
|
+
import { WebGLRenderTarget, WebGLRenderer } from "three";
|
|
2
|
+
interface ScreenBloomConfig {
|
|
3
|
+
/** 叠加强度 */
|
|
4
|
+
strength: number;
|
|
5
|
+
/** 模糊扩散(0~1):映射高斯偏移步长,越大越柔 */
|
|
6
|
+
radius: number;
|
|
7
|
+
/** 亮部软阈值(0~1):仅亮度高于此值的像素参与辉光 */
|
|
8
|
+
threshold: number;
|
|
9
|
+
}
|
|
10
|
+
export default function screenBloomPass(renderer: WebGLRenderer, sourceRenderTarget: WebGLRenderTarget, config: ScreenBloomConfig): void;
|
|
11
|
+
export {};
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* @Author: xiaosihan / WorkBuddy
|
|
3
|
-
* @Description: 屏幕空间辉光(经典 gaussian bloom)。
|
|
4
|
-
* 替代 three 自带的 UnrealBloomPass——后者用 5 级离散 mip(1/2…1/32)各自模糊后直接相加,
|
|
5
|
-
* 级与级覆盖范围跳跃,strength 偏高时暴露成同心亮环("一层一层")。
|
|
6
|
-
* 本实现改用「亮部提取(soft-knee 防硬边) → 半分辨率多次可分离高斯模糊迭代(单分辨率连续扩散) → 加性叠加」,
|
|
7
|
-
* 模糊是连续平滑的,与 glow_pass / bloom_pass 的发光风格一致,边缘柔和、无分层。
|
|
8
|
-
* 依赖 renderer.autoClear=false(ThreeBase 第 236 行),故 composite 在 screenRenderTarget 上做加性叠加不会清空原图。
|
|
9
|
-
*/
|
|
10
|
-
import { AdditiveBlending, LinearFilter, NoBlending, RawShaderMaterial, RGBAFormat, Vector2, WebGLRenderTarget } from "three";
|
|
11
|
-
import fsQuad from "./fsQuad";
|
|
12
|
-
const halfSize = new Vector2(1, 1);
|
|
13
|
-
const highPassTarget = new WebGLRenderTarget(1, 1, {
|
|
14
|
-
minFilter: LinearFilter,
|
|
15
|
-
magFilter: LinearFilter,
|
|
16
|
-
format: RGBAFormat,
|
|
17
|
-
});
|
|
18
|
-
const blurTargetA = new WebGLRenderTarget(1, 1, {
|
|
19
|
-
minFilter: LinearFilter,
|
|
20
|
-
magFilter: LinearFilter,
|
|
21
|
-
format: RGBAFormat,
|
|
22
|
-
});
|
|
23
|
-
const blurTargetB = new WebGLRenderTarget(1, 1, {
|
|
24
|
-
minFilter: LinearFilter,
|
|
25
|
-
magFilter: LinearFilter,
|
|
26
|
-
format: RGBAFormat,
|
|
27
|
-
});
|
|
28
|
-
// 亮部提取:带 soft-knee 软过渡,避免阈值硬截断产生硬边(硬边会被后续模糊放大成可见光环)
|
|
29
|
-
const highPassShader = new RawShaderMaterial({
|
|
30
|
-
uniforms: {
|
|
31
|
-
tDiffuse: { value: null },
|
|
32
|
-
threshold: { value: 0.85 },
|
|
33
|
-
knee: { value: 0.1 },
|
|
34
|
-
},
|
|
1
|
+
/*
|
|
2
|
+
* @Author: xiaosihan / WorkBuddy
|
|
3
|
+
* @Description: 屏幕空间辉光(经典 gaussian bloom)。
|
|
4
|
+
* 替代 three 自带的 UnrealBloomPass——后者用 5 级离散 mip(1/2…1/32)各自模糊后直接相加,
|
|
5
|
+
* 级与级覆盖范围跳跃,strength 偏高时暴露成同心亮环("一层一层")。
|
|
6
|
+
* 本实现改用「亮部提取(soft-knee 防硬边) → 半分辨率多次可分离高斯模糊迭代(单分辨率连续扩散) → 加性叠加」,
|
|
7
|
+
* 模糊是连续平滑的,与 glow_pass / bloom_pass 的发光风格一致,边缘柔和、无分层。
|
|
8
|
+
* 依赖 renderer.autoClear=false(ThreeBase 第 236 行),故 composite 在 screenRenderTarget 上做加性叠加不会清空原图。
|
|
9
|
+
*/
|
|
10
|
+
import { AdditiveBlending, LinearFilter, NoBlending, RawShaderMaterial, RGBAFormat, Vector2, WebGLRenderTarget } from "three";
|
|
11
|
+
import fsQuad from "./fsQuad";
|
|
12
|
+
const halfSize = new Vector2(1, 1);
|
|
13
|
+
const highPassTarget = new WebGLRenderTarget(1, 1, {
|
|
14
|
+
minFilter: LinearFilter,
|
|
15
|
+
magFilter: LinearFilter,
|
|
16
|
+
format: RGBAFormat,
|
|
17
|
+
});
|
|
18
|
+
const blurTargetA = new WebGLRenderTarget(1, 1, {
|
|
19
|
+
minFilter: LinearFilter,
|
|
20
|
+
magFilter: LinearFilter,
|
|
21
|
+
format: RGBAFormat,
|
|
22
|
+
});
|
|
23
|
+
const blurTargetB = new WebGLRenderTarget(1, 1, {
|
|
24
|
+
minFilter: LinearFilter,
|
|
25
|
+
magFilter: LinearFilter,
|
|
26
|
+
format: RGBAFormat,
|
|
27
|
+
});
|
|
28
|
+
// 亮部提取:带 soft-knee 软过渡,避免阈值硬截断产生硬边(硬边会被后续模糊放大成可见光环)
|
|
29
|
+
const highPassShader = new RawShaderMaterial({
|
|
30
|
+
uniforms: {
|
|
31
|
+
tDiffuse: { value: null },
|
|
32
|
+
threshold: { value: 0.85 },
|
|
33
|
+
knee: { value: 0.1 },
|
|
34
|
+
},
|
|
35
35
|
vertexShader: `
|
|
36
36
|
attribute vec3 position;
|
|
37
37
|
attribute vec2 uv;
|
|
@@ -39,7 +39,7 @@ const highPassShader = new RawShaderMaterial({
|
|
|
39
39
|
void main() {
|
|
40
40
|
vUv = uv;
|
|
41
41
|
gl_Position = vec4(position, 1.0);
|
|
42
|
-
}`,
|
|
42
|
+
}`,
|
|
43
43
|
fragmentShader: `
|
|
44
44
|
#ifdef GL_ES
|
|
45
45
|
precision highp float;
|
|
@@ -55,21 +55,21 @@ const highPassShader = new RawShaderMaterial({
|
|
|
55
55
|
float soft = clamp((lum - threshold + knee) / (2.0 * knee), 0.0, 1.0);
|
|
56
56
|
float contrib = max(soft * soft, lum - threshold) / max(lum, 1e-4);
|
|
57
57
|
gl_FragColor = vec4(texel.rgb * contrib, 1.0);
|
|
58
|
-
}`,
|
|
59
|
-
blending: NoBlending,
|
|
60
|
-
depthTest: false,
|
|
61
|
-
depthWrite: false,
|
|
62
|
-
transparent: true,
|
|
63
|
-
});
|
|
64
|
-
// 可分离高斯模糊(H / V),与 glow_pass 同结构:21-tap 固定,radius 控制偏移步长,sigma 控制权重形状。
|
|
65
|
-
// 多迭代后在单分辨率上等价一个大半径高斯,过渡完全连续 —— 这是均匀、无分层的根本。
|
|
66
|
-
const gaussianBlurHShader = new RawShaderMaterial({
|
|
67
|
-
uniforms: {
|
|
68
|
-
tDiffuse: { value: null },
|
|
69
|
-
resolution: { value: new Vector2(1 / 512, 1 / 512) },
|
|
70
|
-
radius: { value: 1.0 },
|
|
71
|
-
sigma: { value: 1.0 },
|
|
72
|
-
},
|
|
58
|
+
}`,
|
|
59
|
+
blending: NoBlending,
|
|
60
|
+
depthTest: false,
|
|
61
|
+
depthWrite: false,
|
|
62
|
+
transparent: true,
|
|
63
|
+
});
|
|
64
|
+
// 可分离高斯模糊(H / V),与 glow_pass 同结构:21-tap 固定,radius 控制偏移步长,sigma 控制权重形状。
|
|
65
|
+
// 多迭代后在单分辨率上等价一个大半径高斯,过渡完全连续 —— 这是均匀、无分层的根本。
|
|
66
|
+
const gaussianBlurHShader = new RawShaderMaterial({
|
|
67
|
+
uniforms: {
|
|
68
|
+
tDiffuse: { value: null },
|
|
69
|
+
resolution: { value: new Vector2(1 / 512, 1 / 512) },
|
|
70
|
+
radius: { value: 1.0 },
|
|
71
|
+
sigma: { value: 1.0 },
|
|
72
|
+
},
|
|
73
73
|
vertexShader: `
|
|
74
74
|
attribute vec3 position;
|
|
75
75
|
attribute vec2 uv;
|
|
@@ -77,7 +77,7 @@ const gaussianBlurHShader = new RawShaderMaterial({
|
|
|
77
77
|
void main() {
|
|
78
78
|
vUv = uv;
|
|
79
79
|
gl_Position = vec4(position, 1.0);
|
|
80
|
-
}`,
|
|
80
|
+
}`,
|
|
81
81
|
fragmentShader: `
|
|
82
82
|
#ifdef GL_ES
|
|
83
83
|
precision highp float;
|
|
@@ -101,19 +101,19 @@ const gaussianBlurHShader = new RawShaderMaterial({
|
|
|
101
101
|
totalWeight += weight;
|
|
102
102
|
}
|
|
103
103
|
gl_FragColor = color / totalWeight;
|
|
104
|
-
}`,
|
|
105
|
-
blending: NoBlending,
|
|
106
|
-
depthTest: false,
|
|
107
|
-
depthWrite: false,
|
|
108
|
-
transparent: true,
|
|
109
|
-
});
|
|
110
|
-
const gaussianBlurVShader = new RawShaderMaterial({
|
|
111
|
-
uniforms: {
|
|
112
|
-
tDiffuse: { value: null },
|
|
113
|
-
resolution: { value: new Vector2(1 / 512, 1 / 512) },
|
|
114
|
-
radius: { value: 1.0 },
|
|
115
|
-
sigma: { value: 1.0 },
|
|
116
|
-
},
|
|
104
|
+
}`,
|
|
105
|
+
blending: NoBlending,
|
|
106
|
+
depthTest: false,
|
|
107
|
+
depthWrite: false,
|
|
108
|
+
transparent: true,
|
|
109
|
+
});
|
|
110
|
+
const gaussianBlurVShader = new RawShaderMaterial({
|
|
111
|
+
uniforms: {
|
|
112
|
+
tDiffuse: { value: null },
|
|
113
|
+
resolution: { value: new Vector2(1 / 512, 1 / 512) },
|
|
114
|
+
radius: { value: 1.0 },
|
|
115
|
+
sigma: { value: 1.0 },
|
|
116
|
+
},
|
|
117
117
|
vertexShader: `
|
|
118
118
|
attribute vec3 position;
|
|
119
119
|
attribute vec2 uv;
|
|
@@ -121,7 +121,7 @@ const gaussianBlurVShader = new RawShaderMaterial({
|
|
|
121
121
|
void main() {
|
|
122
122
|
vUv = uv;
|
|
123
123
|
gl_Position = vec4(position, 1.0);
|
|
124
|
-
}`,
|
|
124
|
+
}`,
|
|
125
125
|
fragmentShader: `
|
|
126
126
|
#ifdef GL_ES
|
|
127
127
|
precision highp float;
|
|
@@ -145,18 +145,18 @@ const gaussianBlurVShader = new RawShaderMaterial({
|
|
|
145
145
|
totalWeight += weight;
|
|
146
146
|
}
|
|
147
147
|
gl_FragColor = color / totalWeight;
|
|
148
|
-
}`,
|
|
149
|
-
blending: NoBlending,
|
|
150
|
-
depthTest: false,
|
|
151
|
-
depthWrite: false,
|
|
152
|
-
transparent: true,
|
|
153
|
-
});
|
|
154
|
-
// 加性合成:把模糊后的泛光按强度叠加回屏幕合成目标(autoClear=false,不清空原图)
|
|
155
|
-
const compositeShader = new RawShaderMaterial({
|
|
156
|
-
uniforms: {
|
|
157
|
-
tDiffuse: { value: null },
|
|
158
|
-
strength: { value: 1.0 },
|
|
159
|
-
},
|
|
148
|
+
}`,
|
|
149
|
+
blending: NoBlending,
|
|
150
|
+
depthTest: false,
|
|
151
|
+
depthWrite: false,
|
|
152
|
+
transparent: true,
|
|
153
|
+
});
|
|
154
|
+
// 加性合成:把模糊后的泛光按强度叠加回屏幕合成目标(autoClear=false,不清空原图)
|
|
155
|
+
const compositeShader = new RawShaderMaterial({
|
|
156
|
+
uniforms: {
|
|
157
|
+
tDiffuse: { value: null },
|
|
158
|
+
strength: { value: 1.0 },
|
|
159
|
+
},
|
|
160
160
|
vertexShader: `
|
|
161
161
|
attribute vec3 position;
|
|
162
162
|
attribute vec2 uv;
|
|
@@ -164,7 +164,7 @@ const compositeShader = new RawShaderMaterial({
|
|
|
164
164
|
void main() {
|
|
165
165
|
vUv = uv;
|
|
166
166
|
gl_Position = vec4(position, 1.0);
|
|
167
|
-
}`,
|
|
167
|
+
}`,
|
|
168
168
|
fragmentShader: `
|
|
169
169
|
#ifdef GL_ES
|
|
170
170
|
precision highp float;
|
|
@@ -175,61 +175,61 @@ const compositeShader = new RawShaderMaterial({
|
|
|
175
175
|
void main() {
|
|
176
176
|
vec4 texel = texture2D(tDiffuse, vUv);
|
|
177
177
|
gl_FragColor = vec4(texel.rgb * strength, 1.0);
|
|
178
|
-
}`,
|
|
179
|
-
blending: AdditiveBlending,
|
|
180
|
-
depthTest: false,
|
|
181
|
-
depthWrite: false,
|
|
182
|
-
transparent: true,
|
|
183
|
-
});
|
|
184
|
-
export default function screenBloomPass(renderer, sourceRenderTarget, config) {
|
|
185
|
-
const { strength, radius, threshold } = config;
|
|
186
|
-
if (strength <= 0) {
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
// 半分辨率:降采样既提速,又让扩散更平滑自然(避免全分辨率下模糊核偏硬)
|
|
190
|
-
const w = Math.max(1, sourceRenderTarget.width >> 1);
|
|
191
|
-
const h = Math.max(1, sourceRenderTarget.height >> 1);
|
|
192
|
-
halfSize.set(w, h);
|
|
193
|
-
highPassTarget.setSize(w, h);
|
|
194
|
-
blurTargetA.setSize(w, h);
|
|
195
|
-
blurTargetB.setSize(w, h);
|
|
196
|
-
// 1) 亮部提取
|
|
197
|
-
renderer.setRenderTarget(highPassTarget);
|
|
198
|
-
renderer.clear();
|
|
199
|
-
highPassShader.uniforms.tDiffuse.value = sourceRenderTarget.texture;
|
|
200
|
-
highPassShader.uniforms.threshold.value = threshold;
|
|
201
|
-
fsQuad.render(renderer, highPassShader);
|
|
202
|
-
// 2) 多次可分离高斯模糊迭代:单分辨率连续扩散,无 mip 分层
|
|
203
|
-
const blurRadius = 1.0 + radius * 8.0; // radius 0~1 → 偏移 1~9 像素(half 分辨率下已足够大)
|
|
204
|
-
gaussianBlurHShader.uniforms.resolution.value.set(1 / w, 1 / h);
|
|
205
|
-
gaussianBlurVShader.uniforms.resolution.value.set(1 / w, 1 / h);
|
|
206
|
-
gaussianBlurHShader.uniforms.radius.value = blurRadius;
|
|
207
|
-
gaussianBlurVShader.uniforms.radius.value = blurRadius;
|
|
208
|
-
gaussianBlurHShader.uniforms.sigma.value = 1.0;
|
|
209
|
-
gaussianBlurVShader.uniforms.sigma.value = 1.0;
|
|
210
|
-
renderer.setRenderTarget(blurTargetA);
|
|
211
|
-
renderer.clear();
|
|
212
|
-
gaussianBlurHShader.uniforms.tDiffuse.value = highPassTarget.texture;
|
|
213
|
-
fsQuad.render(renderer, gaussianBlurHShader);
|
|
214
|
-
renderer.setRenderTarget(blurTargetB);
|
|
215
|
-
renderer.clear();
|
|
216
|
-
gaussianBlurVShader.uniforms.tDiffuse.value = blurTargetA.texture;
|
|
217
|
-
fsQuad.render(renderer, gaussianBlurVShader);
|
|
218
|
-
// 反复 H/V 迭代,扩散越大、越均匀。共 6 趟(H+V 各 6 次)已非常平滑。
|
|
219
|
-
const passes = 6;
|
|
220
|
-
for (let i = 1; i < passes; i++) {
|
|
221
|
-
renderer.setRenderTarget(blurTargetA);
|
|
222
|
-
renderer.clear();
|
|
223
|
-
gaussianBlurHShader.uniforms.tDiffuse.value = blurTargetB.texture;
|
|
224
|
-
fsQuad.render(renderer, gaussianBlurHShader);
|
|
225
|
-
renderer.setRenderTarget(blurTargetB);
|
|
226
|
-
renderer.clear();
|
|
227
|
-
gaussianBlurVShader.uniforms.tDiffuse.value = blurTargetA.texture;
|
|
228
|
-
fsQuad.render(renderer, gaussianBlurVShader);
|
|
229
|
-
}
|
|
230
|
-
// 3) 加性合成回屏幕合成目标(不 clear,叠加在已有合成图上)
|
|
231
|
-
renderer.setRenderTarget(sourceRenderTarget);
|
|
232
|
-
compositeShader.uniforms.tDiffuse.value = blurTargetB.texture;
|
|
233
|
-
compositeShader.uniforms.strength.value = strength;
|
|
234
|
-
fsQuad.render(renderer, compositeShader);
|
|
235
|
-
}
|
|
178
|
+
}`,
|
|
179
|
+
blending: AdditiveBlending,
|
|
180
|
+
depthTest: false,
|
|
181
|
+
depthWrite: false,
|
|
182
|
+
transparent: true,
|
|
183
|
+
});
|
|
184
|
+
export default function screenBloomPass(renderer, sourceRenderTarget, config) {
|
|
185
|
+
const { strength, radius, threshold } = config;
|
|
186
|
+
if (strength <= 0) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// 半分辨率:降采样既提速,又让扩散更平滑自然(避免全分辨率下模糊核偏硬)
|
|
190
|
+
const w = Math.max(1, sourceRenderTarget.width >> 1);
|
|
191
|
+
const h = Math.max(1, sourceRenderTarget.height >> 1);
|
|
192
|
+
halfSize.set(w, h);
|
|
193
|
+
highPassTarget.setSize(w, h);
|
|
194
|
+
blurTargetA.setSize(w, h);
|
|
195
|
+
blurTargetB.setSize(w, h);
|
|
196
|
+
// 1) 亮部提取
|
|
197
|
+
renderer.setRenderTarget(highPassTarget);
|
|
198
|
+
renderer.clear();
|
|
199
|
+
highPassShader.uniforms.tDiffuse.value = sourceRenderTarget.texture;
|
|
200
|
+
highPassShader.uniforms.threshold.value = threshold;
|
|
201
|
+
fsQuad.render(renderer, highPassShader);
|
|
202
|
+
// 2) 多次可分离高斯模糊迭代:单分辨率连续扩散,无 mip 分层
|
|
203
|
+
const blurRadius = 1.0 + radius * 8.0; // radius 0~1 → 偏移 1~9 像素(half 分辨率下已足够大)
|
|
204
|
+
gaussianBlurHShader.uniforms.resolution.value.set(1 / w, 1 / h);
|
|
205
|
+
gaussianBlurVShader.uniforms.resolution.value.set(1 / w, 1 / h);
|
|
206
|
+
gaussianBlurHShader.uniforms.radius.value = blurRadius;
|
|
207
|
+
gaussianBlurVShader.uniforms.radius.value = blurRadius;
|
|
208
|
+
gaussianBlurHShader.uniforms.sigma.value = 1.0;
|
|
209
|
+
gaussianBlurVShader.uniforms.sigma.value = 1.0;
|
|
210
|
+
renderer.setRenderTarget(blurTargetA);
|
|
211
|
+
renderer.clear();
|
|
212
|
+
gaussianBlurHShader.uniforms.tDiffuse.value = highPassTarget.texture;
|
|
213
|
+
fsQuad.render(renderer, gaussianBlurHShader);
|
|
214
|
+
renderer.setRenderTarget(blurTargetB);
|
|
215
|
+
renderer.clear();
|
|
216
|
+
gaussianBlurVShader.uniforms.tDiffuse.value = blurTargetA.texture;
|
|
217
|
+
fsQuad.render(renderer, gaussianBlurVShader);
|
|
218
|
+
// 反复 H/V 迭代,扩散越大、越均匀。共 6 趟(H+V 各 6 次)已非常平滑。
|
|
219
|
+
const passes = 6;
|
|
220
|
+
for (let i = 1; i < passes; i++) {
|
|
221
|
+
renderer.setRenderTarget(blurTargetA);
|
|
222
|
+
renderer.clear();
|
|
223
|
+
gaussianBlurHShader.uniforms.tDiffuse.value = blurTargetB.texture;
|
|
224
|
+
fsQuad.render(renderer, gaussianBlurHShader);
|
|
225
|
+
renderer.setRenderTarget(blurTargetB);
|
|
226
|
+
renderer.clear();
|
|
227
|
+
gaussianBlurVShader.uniforms.tDiffuse.value = blurTargetA.texture;
|
|
228
|
+
fsQuad.render(renderer, gaussianBlurVShader);
|
|
229
|
+
}
|
|
230
|
+
// 3) 加性合成回屏幕合成目标(不 clear,叠加在已有合成图上)
|
|
231
|
+
renderer.setRenderTarget(sourceRenderTarget);
|
|
232
|
+
compositeShader.uniforms.tDiffuse.value = blurTargetB.texture;
|
|
233
|
+
compositeShader.uniforms.strength.value = strength;
|
|
234
|
+
fsQuad.render(renderer, compositeShader);
|
|
235
|
+
}
|
package/pass/ssao_pass.d.ts
CHANGED
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
import { MeshNormalMaterial, Scene, WebGLRenderTarget, WebGLRenderer, Camera } from "three";
|
|
2
|
-
/**
|
|
3
|
-
* 判断是否为「可透视的半透明表面」——这类物体不该在世界空间 AO 里充当实体。
|
|
4
|
-
* 让它进入深度/法线图,被它遮挡的区域会发黑,成因分两种:
|
|
5
|
-
* a) transparent:true + opacity<1(毛玻璃、透明装饰):深度图与法线图都落在半透明表面上,
|
|
6
|
-
* GTAO 在其表面算自遮蔽(褶皱、紧贴其它几何的窄缝)→ 这份 AO 被乘到「透过它看到的
|
|
7
|
-
* 实体」上 → 该区域发黑。
|
|
8
|
-
* b) transparent:true + depthWrite:false(霓虹灯管、光晕、叠加面):深度图保留身后几何(远),
|
|
9
|
-
* 但法线 pass 用 overrideMaterial(MeshNormalMaterial 默认 depthWrite:true)会强行把它的
|
|
10
|
-
* 法线写进去(近)→ 深度与法线指的不是同一个点 → GTAO 几乎必然算错发黑。
|
|
11
|
-
* 故深度 pass 与法线 pass 统一隐藏:该像素的深度/法线即身后不透明几何,AO 由真实可见几何
|
|
12
|
-
* 决定;身后是背景时深度为 1.0,shader 守卫直接判「无遮蔽」(=1),不会发黑。
|
|
13
|
-
*
|
|
14
|
-
* 判据只看 material.transparent 本身,不再依赖 opacity / depthWrite(2026-08-30 修正):
|
|
15
|
-
* 大量半透明是自定义 ShaderMaterial,alpha 由 shader 算出来,而材质的 opacity 仍是默认 1、
|
|
16
|
-
* depthWrite 仍是 true —— 典型如 Ground1 地板(mapColor.a 径向渐变)、聚光灯光斑、
|
|
17
|
-
* effectMaterial1,靠材质属性完全读不出来,会被漏判并继续污染 AO。
|
|
18
|
-
* 代价:Mirror 这类「标了 transparent 但 shader 实际输出 alpha=1.0」的实心反射面会被误排除,
|
|
19
|
-
* 故 Mirror 在构造函数里显式标记 userData.aoOpaque = true 保留(见各 Mirror 实现)。
|
|
20
|
-
* 其余特例同样可用 userData.aoTransparent=true 强制排除 / userData.aoOpaque=true 强制保留。
|
|
21
|
-
*
|
|
22
|
-
* @param includeFloor 是否为「含地板」的 AO 数据准备(GTAO 深度/法线)。
|
|
23
|
-
* - false(默认,可见深度 / 描边/辉光/毛玻璃遮挡判定):地板按普通半透明排除。
|
|
24
|
-
* - true(AO 深度):标了 userData.aoFloor 的地板保留为实体,参与接触 AO 计算。
|
|
25
|
-
*/
|
|
26
|
-
/**
|
|
27
|
-
* 可见深度图的运行时开关:**标了 `userData.aoFloor` 的地板是否参与遮挡判定**。
|
|
28
|
-
*
|
|
29
|
-
* 默认 false = 保持原设计(可透视地板:透过地板看到的物体照常显示,不被地板挡住)。
|
|
30
|
-
* 置 true 后,地板会写进 baseDepthTexture,于是**被地板挡住的描边/辉光/毛玻璃/覆盖色会被正确遮挡**。
|
|
31
|
-
* 面板「深度调试 → 地板参与遮挡」可一键切换,用于排查"挡不住"是不是地板(如 Ground1)造成的。
|
|
32
|
-
*
|
|
33
|
-
* 只影响 aoFloor 地板这一类;transparent 面的处理不受影响(见 isSeeThroughSurface)。
|
|
34
|
-
*/
|
|
35
|
-
export declare const visibleDepthOptions: {
|
|
36
|
-
includeFloor: boolean;
|
|
37
|
-
};
|
|
38
|
-
/**
|
|
39
|
-
* 深度 pass:固定排除非实体表面后,将场景深度渲染到 depthRenderTarget。
|
|
40
|
-
* depthRenderTarget.depthTexture 即 baseDepthTexture,供 SSAO / 描边 / 发光等后续 pass 复用。
|
|
41
|
-
* 排除的非实体对象(sprite/线条/点)在深度图保留 clear 深度(1.0=远),与背景一致;排除的
|
|
42
|
-
* 半透明对象则保留其身后不透明几何的深度(身后无几何时同样为 1.0)。均不影响颜色通道渲染。
|
|
43
|
-
*/
|
|
44
|
-
export declare function renderAoDepthPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, depthRenderTarget: WebGLRenderTarget, includeFloor?: boolean): void;
|
|
45
|
-
/**
|
|
46
|
-
* 调试用:把「被排除出可见深度图」的表面单独渲成红色 mask。
|
|
47
|
-
*
|
|
48
|
-
* 这些面在 renderAoDepthPass 里被 hideNonSurface 隐藏,因此**不会写进 baseDepthTexture**,
|
|
49
|
-
* 也就永远挡不住描边/辉光/毛玻璃/覆盖色 —— 这正是"深度测试看起来失效"最常见的成因
|
|
50
|
-
* (用户以为是 bug,其实是该面被设计成可透视:sprite/线条/点、userData.aoTransparent、
|
|
51
|
-
* 以及标了 userData.aoFloor 的地板 Ground1)。
|
|
52
|
-
* 面板「深度调试 → 排除面标记」叠加显示:灰=能挡住的真实遮挡面,红=被排除、挡不住任何东西。
|
|
53
|
-
*
|
|
54
|
-
* 只渲染 Mesh:sprite / Line2 / Points 在 MeshBasicMaterial override 下渲染异常(见文件头注释),
|
|
55
|
-
* 且它们数量少、用户关心的遮挡体基本都是 Mesh,故跳过。
|
|
56
|
-
*/
|
|
57
|
-
export declare function renderExcludedMaskPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, maskRenderTarget: WebGLRenderTarget, includeFloor?: boolean): void;
|
|
58
|
-
/**
|
|
59
|
-
* 法线 pass(仅 SSAO 开启时需要):固定排除非实体表面后,以中性灰清屏 + normalMaterial
|
|
60
|
-
* override 将视图空间法线渲染到 normalRenderTarget,供 GTAO 风格 SSAO 使用。
|
|
61
|
-
* 排除对象在法线图保留中性灰清屏色 → unpackRGBToNormal(0.5,0.5,0.5)=(0,0,0) →
|
|
62
|
-
* SSAO 退化法线守卫判"无遮蔽"(=1),避免精灵弹窗被 AO 乘黑。清屏色用后即还原。
|
|
63
|
-
*/
|
|
64
|
-
export declare function renderAoNormalPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, normalRenderTarget: WebGLRenderTarget, normalMaterial: MeshNormalMaterial, includeFloor?: boolean): void;
|
|
65
|
-
export interface SsaoOptions {
|
|
66
|
-
enable: boolean;
|
|
67
|
-
debug?: boolean;
|
|
68
|
-
radius?: number;
|
|
69
|
-
falloff?: number;
|
|
70
|
-
/** 旧版螺旋采样用到的切面距离阈值,GTAO 算法不再使用,保留字段仅作兼容 */
|
|
71
|
-
bias?: number;
|
|
72
|
-
/** 映射为 GTAO 的 scale(AO 次幂 / gamma 校正),控制 AO 对比强度,默认 1.0 */
|
|
73
|
-
intensity?: number;
|
|
74
|
-
/** 采样总数(编译期常量,改变会触发 shader 重新编译),默认 16 */
|
|
75
|
-
sampleCount?: number;
|
|
76
|
-
blurRadius?: number;
|
|
77
|
-
strength?: number;
|
|
78
|
-
cameraFar?: number;
|
|
79
|
-
/** SSAO 计算分辨率缩放比例,默认 0.5(半分辨率计算,性能更好) */
|
|
80
|
-
resolutionScale?: number;
|
|
81
|
-
/** GTAO 地平线积分:采样点沿半径分布的幂次,默认 1.0 */
|
|
82
|
-
distanceExponent?: number;
|
|
83
|
-
/** GTAO 地平线积分:距离衰减混合系数,默认 1.0 */
|
|
84
|
-
distanceFallOff?: number;
|
|
85
|
-
/** AO 次幂(gamma 校正),默认 1.0(与 intensity 共享语义时可只调其一) */
|
|
86
|
-
scale?: number;
|
|
87
|
-
}
|
|
88
|
-
export default function ssao_pass(renderer: WebGLRenderer, camera: Camera, scene: Scene, depthRenderTarget: WebGLRenderTarget, normalRenderTarget: WebGLRenderTarget, normalMaterial: MeshNormalMaterial, devicePixelRatio: number, options: SsaoOptions): void;
|
|
1
|
+
import { MeshNormalMaterial, Scene, WebGLRenderTarget, WebGLRenderer, Camera } from "three";
|
|
2
|
+
/**
|
|
3
|
+
* 判断是否为「可透视的半透明表面」——这类物体不该在世界空间 AO 里充当实体。
|
|
4
|
+
* 让它进入深度/法线图,被它遮挡的区域会发黑,成因分两种:
|
|
5
|
+
* a) transparent:true + opacity<1(毛玻璃、透明装饰):深度图与法线图都落在半透明表面上,
|
|
6
|
+
* GTAO 在其表面算自遮蔽(褶皱、紧贴其它几何的窄缝)→ 这份 AO 被乘到「透过它看到的
|
|
7
|
+
* 实体」上 → 该区域发黑。
|
|
8
|
+
* b) transparent:true + depthWrite:false(霓虹灯管、光晕、叠加面):深度图保留身后几何(远),
|
|
9
|
+
* 但法线 pass 用 overrideMaterial(MeshNormalMaterial 默认 depthWrite:true)会强行把它的
|
|
10
|
+
* 法线写进去(近)→ 深度与法线指的不是同一个点 → GTAO 几乎必然算错发黑。
|
|
11
|
+
* 故深度 pass 与法线 pass 统一隐藏:该像素的深度/法线即身后不透明几何,AO 由真实可见几何
|
|
12
|
+
* 决定;身后是背景时深度为 1.0,shader 守卫直接判「无遮蔽」(=1),不会发黑。
|
|
13
|
+
*
|
|
14
|
+
* 判据只看 material.transparent 本身,不再依赖 opacity / depthWrite(2026-08-30 修正):
|
|
15
|
+
* 大量半透明是自定义 ShaderMaterial,alpha 由 shader 算出来,而材质的 opacity 仍是默认 1、
|
|
16
|
+
* depthWrite 仍是 true —— 典型如 Ground1 地板(mapColor.a 径向渐变)、聚光灯光斑、
|
|
17
|
+
* effectMaterial1,靠材质属性完全读不出来,会被漏判并继续污染 AO。
|
|
18
|
+
* 代价:Mirror 这类「标了 transparent 但 shader 实际输出 alpha=1.0」的实心反射面会被误排除,
|
|
19
|
+
* 故 Mirror 在构造函数里显式标记 userData.aoOpaque = true 保留(见各 Mirror 实现)。
|
|
20
|
+
* 其余特例同样可用 userData.aoTransparent=true 强制排除 / userData.aoOpaque=true 强制保留。
|
|
21
|
+
*
|
|
22
|
+
* @param includeFloor 是否为「含地板」的 AO 数据准备(GTAO 深度/法线)。
|
|
23
|
+
* - false(默认,可见深度 / 描边/辉光/毛玻璃遮挡判定):地板按普通半透明排除。
|
|
24
|
+
* - true(AO 深度):标了 userData.aoFloor 的地板保留为实体,参与接触 AO 计算。
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* 可见深度图的运行时开关:**标了 `userData.aoFloor` 的地板是否参与遮挡判定**。
|
|
28
|
+
*
|
|
29
|
+
* 默认 false = 保持原设计(可透视地板:透过地板看到的物体照常显示,不被地板挡住)。
|
|
30
|
+
* 置 true 后,地板会写进 baseDepthTexture,于是**被地板挡住的描边/辉光/毛玻璃/覆盖色会被正确遮挡**。
|
|
31
|
+
* 面板「深度调试 → 地板参与遮挡」可一键切换,用于排查"挡不住"是不是地板(如 Ground1)造成的。
|
|
32
|
+
*
|
|
33
|
+
* 只影响 aoFloor 地板这一类;transparent 面的处理不受影响(见 isSeeThroughSurface)。
|
|
34
|
+
*/
|
|
35
|
+
export declare const visibleDepthOptions: {
|
|
36
|
+
includeFloor: boolean;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* 深度 pass:固定排除非实体表面后,将场景深度渲染到 depthRenderTarget。
|
|
40
|
+
* depthRenderTarget.depthTexture 即 baseDepthTexture,供 SSAO / 描边 / 发光等后续 pass 复用。
|
|
41
|
+
* 排除的非实体对象(sprite/线条/点)在深度图保留 clear 深度(1.0=远),与背景一致;排除的
|
|
42
|
+
* 半透明对象则保留其身后不透明几何的深度(身后无几何时同样为 1.0)。均不影响颜色通道渲染。
|
|
43
|
+
*/
|
|
44
|
+
export declare function renderAoDepthPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, depthRenderTarget: WebGLRenderTarget, includeFloor?: boolean): void;
|
|
45
|
+
/**
|
|
46
|
+
* 调试用:把「被排除出可见深度图」的表面单独渲成红色 mask。
|
|
47
|
+
*
|
|
48
|
+
* 这些面在 renderAoDepthPass 里被 hideNonSurface 隐藏,因此**不会写进 baseDepthTexture**,
|
|
49
|
+
* 也就永远挡不住描边/辉光/毛玻璃/覆盖色 —— 这正是"深度测试看起来失效"最常见的成因
|
|
50
|
+
* (用户以为是 bug,其实是该面被设计成可透视:sprite/线条/点、userData.aoTransparent、
|
|
51
|
+
* 以及标了 userData.aoFloor 的地板 Ground1)。
|
|
52
|
+
* 面板「深度调试 → 排除面标记」叠加显示:灰=能挡住的真实遮挡面,红=被排除、挡不住任何东西。
|
|
53
|
+
*
|
|
54
|
+
* 只渲染 Mesh:sprite / Line2 / Points 在 MeshBasicMaterial override 下渲染异常(见文件头注释),
|
|
55
|
+
* 且它们数量少、用户关心的遮挡体基本都是 Mesh,故跳过。
|
|
56
|
+
*/
|
|
57
|
+
export declare function renderExcludedMaskPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, maskRenderTarget: WebGLRenderTarget, includeFloor?: boolean): void;
|
|
58
|
+
/**
|
|
59
|
+
* 法线 pass(仅 SSAO 开启时需要):固定排除非实体表面后,以中性灰清屏 + normalMaterial
|
|
60
|
+
* override 将视图空间法线渲染到 normalRenderTarget,供 GTAO 风格 SSAO 使用。
|
|
61
|
+
* 排除对象在法线图保留中性灰清屏色 → unpackRGBToNormal(0.5,0.5,0.5)=(0,0,0) →
|
|
62
|
+
* SSAO 退化法线守卫判"无遮蔽"(=1),避免精灵弹窗被 AO 乘黑。清屏色用后即还原。
|
|
63
|
+
*/
|
|
64
|
+
export declare function renderAoNormalPass(renderer: WebGLRenderer, camera: Camera, scene: Scene, normalRenderTarget: WebGLRenderTarget, normalMaterial: MeshNormalMaterial, includeFloor?: boolean): void;
|
|
65
|
+
export interface SsaoOptions {
|
|
66
|
+
enable: boolean;
|
|
67
|
+
debug?: boolean;
|
|
68
|
+
radius?: number;
|
|
69
|
+
falloff?: number;
|
|
70
|
+
/** 旧版螺旋采样用到的切面距离阈值,GTAO 算法不再使用,保留字段仅作兼容 */
|
|
71
|
+
bias?: number;
|
|
72
|
+
/** 映射为 GTAO 的 scale(AO 次幂 / gamma 校正),控制 AO 对比强度,默认 1.0 */
|
|
73
|
+
intensity?: number;
|
|
74
|
+
/** 采样总数(编译期常量,改变会触发 shader 重新编译),默认 16 */
|
|
75
|
+
sampleCount?: number;
|
|
76
|
+
blurRadius?: number;
|
|
77
|
+
strength?: number;
|
|
78
|
+
cameraFar?: number;
|
|
79
|
+
/** SSAO 计算分辨率缩放比例,默认 0.5(半分辨率计算,性能更好) */
|
|
80
|
+
resolutionScale?: number;
|
|
81
|
+
/** GTAO 地平线积分:采样点沿半径分布的幂次,默认 1.0 */
|
|
82
|
+
distanceExponent?: number;
|
|
83
|
+
/** GTAO 地平线积分:距离衰减混合系数,默认 1.0 */
|
|
84
|
+
distanceFallOff?: number;
|
|
85
|
+
/** AO 次幂(gamma 校正),默认 1.0(与 intensity 共享语义时可只调其一) */
|
|
86
|
+
scale?: number;
|
|
87
|
+
}
|
|
88
|
+
export default function ssao_pass(renderer: WebGLRenderer, camera: Camera, scene: Scene, depthRenderTarget: WebGLRenderTarget, normalRenderTarget: WebGLRenderTarget, normalMaterial: MeshNormalMaterial, devicePixelRatio: number, options: SsaoOptions): void;
|