three-base 2.0.134 → 2.0.142
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/DirectionalLight.ts +70 -0
- package/EventMap.d.ts +103 -0
- package/EventMap.js +17 -0
- package/EventMap.ts +139 -0
- package/EventMesh.d.ts +18 -18
- package/EventMesh.js +59 -59
- package/EventMesh.ts +60 -0
- package/ExtrudeMesh.d.ts +112 -112
- package/ExtrudeMesh.js +342 -366
- package/ExtrudeMesh.ts +553 -0
- package/FPScontrol.d.ts +511 -71
- package/FPScontrol.js +1799 -505
- package/FPScontrol.ts +1855 -0
- package/Fire/Fire.d.ts +28 -28
- package/Fire/Fire.js +80 -79
- package/Fire/Fire.ts +89 -0
- package/Fire/{FireGromtry.d.ts → FireGeometry.d.ts} +9 -9
- package/Fire/{FireGromtry.js → FireGeometry.js} +40 -40
- package/Fire/FireGeometry.ts +40 -0
- package/Fire/FireMaterial.d.ts +28 -28
- package/Fire/FireMaterial.js +32 -32
- package/Fire/FireMaterial.ts +89 -0
- package/Fire/index.d.ts +2 -1
- package/Fire/index.js +2 -1
- package/Fire/index.ts +2 -0
- package/GLTFDracoLoader.d.ts +71 -0
- package/GLTFDracoLoader.js +266 -0
- package/GLTFDracoLoader.ts +430 -0
- package/Grass/Grass.d.ts +8 -8
- package/Grass/Grass.js +38 -38
- package/Grass/Grass.ts +38 -0
- package/Grass/index.d.ts +2 -1
- package/Grass/index.js +2 -1
- package/Grass/index.ts +2 -0
- package/Ground1/Ground1.d.ts +10 -11
- package/Ground1/Ground1.js +95 -91
- package/Ground1/Ground1.ts +114 -0
- package/Ground1/index.d.ts +1 -1
- package/Ground1/index.js +1 -1
- package/Ground1/index.ts +1 -0
- package/MeshBase.d.ts +36 -35
- package/MeshBase.js +247 -223
- package/MeshBase.ts +253 -0
- package/Mirror.d.ts +25 -25
- package/Mirror.js +143 -139
- package/Mirror.ts +203 -0
- package/MktMesh/MktMesh.d.ts +291 -0
- package/MktMesh/MktMesh.js +1045 -0
- package/MktMesh/MktMesh.ts +1075 -0
- package/MktMesh/assetUrl.d.ts +35 -0
- package/MktMesh/assetUrl.js +69 -0
- package/MktMesh/assetUrl.ts +69 -0
- package/MktMesh/mktMappingShader.d.ts +12 -0
- package/MktMesh/mktMappingShader.js +139 -0
- package/MktMesh/mktMappingShader.ts +139 -0
- package/MktMesh/mktShader.d.ts +263 -0
- package/MktMesh/mktShader.js +1248 -0
- package/MktMesh/mktShader.ts +1344 -0
- package/MktMesh/panoBitmapTexture.d.ts +25 -0
- package/MktMesh/panoBitmapTexture.js +52 -0
- package/MktMesh/panoBitmapTexture.ts +54 -0
- package/MktMesh/panoSlotBind.d.ts +29 -0
- package/MktMesh/panoSlotBind.js +106 -0
- package/MktMesh/panoSlotBind.ts +153 -0
- package/MktMesh/panoSlotRoster.d.ts +22 -0
- package/MktMesh/panoSlotRoster.js +169 -0
- package/MktMesh/panoSlotRoster.ts +168 -0
- package/MktMesh/panoTileStitcher.d.ts +119 -0
- package/MktMesh/panoTileStitcher.js +533 -0
- package/MktMesh/panoTileStitcher.ts +616 -0
- package/MktMesh/types.d.ts +75 -0
- package/MktMesh/types.js +1 -0
- package/MktMesh/types.ts +87 -0
- package/MktMesh/wallCapTessellate.d.ts +33 -0
- package/MktMesh/wallCapTessellate.js +97 -0
- package/MktMesh/wallCapTessellate.ts +68 -0
- package/PipeMesh/PathGeometry.d.ts +44 -44
- package/PipeMesh/PathGeometry.js +307 -300
- package/PipeMesh/PathGeometry.ts +343 -0
- package/PipeMesh/PathPoint.d.ts +17 -17
- package/PipeMesh/PathPoint.js +31 -31
- package/PipeMesh/PathPoint.ts +36 -0
- package/PipeMesh/PathPointList.d.ts +31 -31
- package/PipeMesh/PathPointList.js +209 -208
- package/PipeMesh/PathPointList.ts +227 -0
- package/PipeMesh/PathTubeGeometry.d.ts +25 -25
- package/PipeMesh/PathTubeGeometry.js +130 -130
- package/PipeMesh/PathTubeGeometry.ts +146 -0
- package/PipeMesh/PipeMesh.d.ts +25 -25
- package/PipeMesh/PipeMesh.js +63 -63
- package/PipeMesh/PipeMesh.ts +76 -0
- package/PipeMesh/index.d.ts +1 -1
- package/PipeMesh/index.js +1 -1
- package/PipeMesh/index.ts +1 -0
- package/PlaneModal1/PlaneModal1.d.ts +34 -31
- package/PlaneModal1/PlaneModal1.js +109 -105
- package/PlaneModal1/PlaneModal1.ts +138 -0
- package/PlaneModal1/index.d.ts +1 -1
- package/PlaneModal1/index.js +1 -1
- package/PlaneModal1/index.ts +1 -0
- package/PlaneText.d.ts +27 -39
- package/PlaneText.js +35 -30
- package/PlaneText.ts +55 -0
- package/PlaneWithHtml.d.ts +13 -11
- package/PlaneWithHtml.js +64 -63
- package/PlaneWithHtml.ts +70 -0
- package/PointLight/PointLight.d.ts +13 -14
- package/PointLight/PointLight.js +64 -70
- package/PointLight/PointLight.ts +67 -0
- package/PointLight/index.d.ts +1 -1
- package/PointLight/index.js +1 -1
- package/PointLight/index.ts +1 -0
- package/README.md +110 -79
- package/Sky/Sky.d.ts +9 -9
- package/Sky/Sky.js +22 -22
- package/Sky/Sky.ts +22 -0
- package/Sky/index.d.ts +1 -1
- package/Sky/index.js +1 -1
- package/Sky/index.ts +1 -0
- package/SpotLight.d.ts +6 -6
- package/SpotLight.js +72 -72
- package/SpotLight.ts +74 -0
- package/SpriteModal1/SpriteModal1.d.ts +33 -30
- package/SpriteModal1/SpriteModal1.js +116 -110
- package/SpriteModal1/SpriteModal1.ts +146 -0
- package/SpriteModal1/index.d.ts +1 -1
- package/SpriteModal1/index.js +1 -1
- package/SpriteModal1/index.ts +1 -0
- package/SpriteText.d.ts +46 -45
- package/SpriteText.js +176 -163
- package/SpriteText.ts +205 -0
- package/SpriteText2.d.ts +48 -47
- package/SpriteText2.js +223 -198
- package/SpriteText2.ts +258 -0
- package/SpriteText3.d.ts +86 -0
- package/SpriteText3.js +519 -0
- package/SpriteText3.ts +599 -0
- package/SpriteWithHtml.d.ts +9 -7
- package/SpriteWithHtml.js +44 -44
- package/SpriteWithHtml.ts +50 -0
- package/Text3D/Text3D.d.ts +20 -20
- package/Text3D/Text3D.js +58 -62
- package/Text3D/Text3D.ts +77 -0
- package/Text3D/fontController.d.ts +60 -59
- package/Text3D/fontController.js +166 -199
- package/Text3D/fontController.ts +209 -0
- package/Text3D/index.d.ts +1 -1
- package/Text3D/index.js +1 -1
- package/Text3D/index.ts +1 -0
- package/ThreeBase.d.ts +248 -97
- package/ThreeBase.js +1202 -613
- package/ThreeBase.ts +1314 -0
- package/ThreeMouse.d.ts +54 -40
- package/ThreeMouse.js +453 -407
- package/ThreeMouse.ts +472 -0
- package/Transition.d.ts +45 -40
- package/Transition.js +209 -210
- package/Transition.ts +242 -0
- package/Water/Water.d.ts +5 -5
- package/Water/Water.js +44 -26
- package/Water/Water.ts +45 -0
- package/Water/index.d.ts +2 -0
- package/Water/index.js +2 -0
- package/Water/index.ts +2 -0
- package/WaterFlow/FloatingDuck.d.ts +88 -0
- package/WaterFlow/FloatingDuck.js +307 -0
- package/WaterFlow/FloatingDuck.ts +445 -0
- package/WaterFlow/GPUFluidSimulation.d.ts +56 -0
- package/WaterFlow/GPUFluidSimulation.js +785 -0
- package/WaterFlow/GPUFluidSimulation.ts +827 -0
- package/WaterFlow/ReservoirSystem.d.ts +106 -0
- package/WaterFlow/ReservoirSystem.js +621 -0
- package/WaterFlow/ReservoirSystem.ts +754 -0
- package/WaterFlow/SPHField.d.ts +35 -0
- package/WaterFlow/SPHField.js +204 -0
- package/WaterFlow/SPHField.ts +228 -0
- package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -0
- package/WaterFlow/ScreenSpaceFluidPass.js +736 -0
- package/WaterFlow/ScreenSpaceFluidPass.ts +789 -0
- package/WaterFlow/ShallowWaterSurface.d.ts +45 -0
- package/WaterFlow/ShallowWaterSurface.js +441 -0
- package/WaterFlow/ShallowWaterSurface.ts +510 -0
- package/WaterFlow/WaterFlow.d.ts +87 -0
- package/WaterFlow/WaterFlow.js +171 -0
- package/WaterFlow/WaterFlow.ts +219 -0
- package/WaterFlow/types.d.ts +161 -0
- package/WaterFlow/types.js +1 -0
- package/WaterFlow/types.ts +189 -0
- package/WaterFlow/waterFlowPass.d.ts +3 -0
- package/WaterFlow/waterFlowPass.js +20 -0
- package/WaterFlow/waterFlowPass.ts +40 -0
- package/collisionOBB.d.ts +42 -0
- package/collisionOBB.js +112 -0
- package/collisionOBB.ts +108 -0
- package/declare.d.ts +23 -165
- package/index.d.ts +1 -1
- package/index.js +1 -2
- package/index.ts +1 -0
- package/instanced/InstancedBatch.d.ts +57 -0
- package/instanced/InstancedBatch.js +348 -0
- package/instanced/InstancedBatch.ts +406 -0
- package/instanced/InstancedChild.d.ts +174 -0
- package/instanced/InstancedChild.js +264 -0
- package/instanced/InstancedChild.ts +327 -0
- package/instanced/InstancedGroup.d.ts +43 -0
- package/instanced/InstancedGroup.js +126 -0
- package/instanced/InstancedGroup.ts +137 -0
- package/{InstancedMeshBase.d.ts → instanced/InstancedMeshBase.d.ts} +38 -39
- package/{InstancedMeshBase.js → instanced/InstancedMeshBase.js} +282 -293
- package/instanced/InstancedMeshBase.ts +292 -0
- package/instanced/InstancedTemplate.d.ts +46 -0
- package/instanced/InstancedTemplate.js +125 -0
- package/instanced/InstancedTemplate.ts +188 -0
- package/keyControls.d.ts +30 -0
- package/{keyContorls.js → keyControls.js} +101 -98
- package/keyControls.ts +107 -0
- package/lensflare/LensFlare.d.ts +39 -0
- package/lensflare/LensFlare.js +373 -0
- package/lensflare/LensFlare.ts +448 -0
- package/lensflare/lensflare0.png +0 -0
- package/lensflare/lensflare3.png +0 -0
- package/lensflare/lensflare_custom.png +0 -0
- package/lensflare/lensflare_hex_ghost.png +0 -0
- package/lensflare/lensflare_hex_main.png +0 -0
- package/package.json +101 -26
- package/pass/bloom_pass.d.ts +2 -2
- package/pass/bloom_pass.js +188 -101
- package/pass/bloom_pass.ts +243 -0
- package/pass/cover_pass.d.ts +2 -2
- package/pass/cover_pass.js +122 -99
- package/pass/cover_pass.ts +182 -0
- package/pass/debugDepthState.d.ts +20 -0
- package/pass/debugDepthState.js +9 -0
- package/pass/debugDepthState.ts +22 -0
- package/pass/depthTestBias.d.ts +12 -0
- package/pass/depthTestBias.js +12 -0
- package/pass/depthTestBias.ts +12 -0
- package/pass/effectUserData.d.ts +27 -0
- package/pass/effectUserData.js +1 -0
- package/pass/effectUserData.ts +46 -0
- package/pass/frosted_glass_pass.d.ts +2 -2
- package/pass/frosted_glass_pass.js +167 -186
- package/pass/frosted_glass_pass.ts +288 -0
- package/pass/fsQuad.d.ts +9 -9
- package/pass/fsQuad.js +28 -28
- package/pass/fsQuad.ts +34 -0
- package/pass/glow_pass.d.ts +2 -2
- package/pass/glow_pass.js +449 -233
- package/pass/glow_pass.ts +654 -0
- package/pass/screen_bloom_pass.d.ts +11 -0
- package/pass/screen_bloom_pass.js +235 -0
- package/pass/screen_bloom_pass.ts +263 -0
- package/pass/ssao_pass.d.ts +88 -11
- package/pass/ssao_pass.js +802 -288
- package/pass/ssao_pass.ts +918 -0
- package/pass/stroke_pass.d.ts +2 -2
- package/pass/stroke_pass.js +329 -258
- package/pass/stroke_pass.ts +638 -0
- package/shaders/FXAAShaderMaterial.d.ts +3 -3
- package/shaders/FXAAShaderMaterial.js +23 -66
- package/shaders/FXAAShaderMaterial.ts +201 -0
- package/shaders/baseDepthVisShader.d.ts +11 -0
- package/shaders/baseDepthVisShader.js +36 -0
- package/shaders/baseDepthVisShader.ts +36 -0
- package/shaders/baseTextureToRenderShader.d.ts +2 -2
- package/shaders/baseTextureToRenderShader.js +55 -60
- package/shaders/baseTextureToRenderShader.ts +232 -0
- package/shaders/copyShader.d.ts +3 -3
- package/shaders/copyShader.js +13 -14
- package/shaders/copyShader.ts +32 -0
- package/shaders/debugDepthCompareShader.d.ts +14 -0
- package/shaders/debugDepthCompareShader.js +49 -0
- package/shaders/debugDepthCompareShader.ts +50 -0
- package/shaders/debugDepthJudgeShader.d.ts +18 -0
- package/shaders/debugDepthJudgeShader.js +52 -0
- package/shaders/debugDepthJudgeShader.ts +54 -0
- package/shaders/debugExcludedShader.d.ts +13 -0
- package/shaders/debugExcludedShader.js +46 -0
- package/shaders/debugExcludedShader.ts +48 -0
- package/spriteTextBg.d.ts +1 -0
- package/spriteTextBg.js +20 -0
- package/spriteTextBg.ts +20 -0
- package/threeLoader.d.ts +35 -34
- package/threeLoader.js +518 -527
- package/threeLoader.ts +525 -0
- package/threeUtils.d.ts +53 -52
- package/threeUtils.js +329 -330
- package/threeUtils.ts +373 -0
- package/types.d.ts +2 -0
- package/types.js +6 -0
- package/types.ts +8 -0
- package/ApngTexture.d.ts +0 -13
- package/ApngTexture.js +0 -61
- package/ApngTextureManage.d.ts +0 -18
- package/ApngTextureManage.js +0 -87
- package/KeyFrameAnimation.d.ts +0 -25
- package/KeyFrameAnimation.js +0 -78
- package/keyContorls.d.ts +0 -25
- package/lib/draco/draco_decoder.js +0 -34
- package/lib/draco/draco_decoder.wasm +0 -0
- package/lib/draco/draco_wasm_wrapper.js +0 -117
- package/shaders.d.ts +0 -5
- package/shaders.js +0 -93
|
@@ -0,0 +1,638 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: xiaosihan
|
|
3
|
+
* @Date: 2023-05-09 00:35:17
|
|
4
|
+
* @Last Modified by: xiaosihan
|
|
5
|
+
* @Last Modified time: 2025-01-28 04:02:16
|
|
6
|
+
*/
|
|
7
|
+
import { Color, DepthFormat, DepthTexture, LinearFilter, NoBlending, NormalBlending, RGBAFormat, RawShaderMaterial, Scene, ShaderChunk, ShaderMaterial, UnsignedIntType, Vector2, WebGLRenderTarget, WebGLRenderer, Camera, PerspectiveCamera, Object3D } from "three";
|
|
8
|
+
import fsQuad from "./fsQuad";
|
|
9
|
+
import { EffectUserData } from "./effectUserData";
|
|
10
|
+
import { debugDepthState } from "./debugDepthState";
|
|
11
|
+
import { DEPTH_TEST_BIAS } from "./depthTestBias";
|
|
12
|
+
|
|
13
|
+
const selectDepthTexture: DepthTexture = (() => {
|
|
14
|
+
const baseDepthTexture = new DepthTexture(1024, 1024);
|
|
15
|
+
baseDepthTexture.format = DepthFormat;
|
|
16
|
+
baseDepthTexture.type = UnsignedIntType;
|
|
17
|
+
baseDepthTexture.anisotropy = 16;
|
|
18
|
+
return baseDepthTexture;
|
|
19
|
+
})();
|
|
20
|
+
|
|
21
|
+
const selectTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
22
|
+
minFilter: LinearFilter,
|
|
23
|
+
magFilter: LinearFilter,
|
|
24
|
+
format: RGBAFormat,
|
|
25
|
+
anisotropy: 16,
|
|
26
|
+
// 无 MSAA:mask 颜色与下方 selectDepthTextureTarget(深度)必须同为硬边缘,
|
|
27
|
+
// 否则 mask 边缘平滑而深度硬 → depthTestShader 判定边界与 mask 视觉边缘错位,描边边缘锯齿。
|
|
28
|
+
// 边缘抗锯齿统一由 mask 内部 FXAA + 终处理 FXAA 兜底。
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// 无 MSAA 的深度专用目标:仅用于导出对象深度,供 depthTestShader 做遮挡判定(深度无需抗锯齿)
|
|
32
|
+
const selectDepthTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
33
|
+
minFilter: LinearFilter,
|
|
34
|
+
magFilter: LinearFilter,
|
|
35
|
+
format: RGBAFormat,
|
|
36
|
+
depthTexture: selectDepthTexture,
|
|
37
|
+
anisotropy: 16,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const selectDepthTestTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, {
|
|
41
|
+
minFilter: LinearFilter,
|
|
42
|
+
magFilter: LinearFilter,
|
|
43
|
+
format: RGBAFormat,
|
|
44
|
+
anisotropy: 16,
|
|
45
|
+
// 无 MSAA:深度测试 mask 无需抗锯齿,去掉以提速
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const blur1TextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
49
|
+
|
|
50
|
+
const blur2TextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
51
|
+
// 外扩深度临时/结果目标:depthMinBlurShader 把本体深度图随描边一起外扩,
|
|
52
|
+
// 外扩区取邻域最近深度(忽略背景 1.0),使外扩区 selD<1.0,depthTest 才能正确判遮挡(不漏光)。
|
|
53
|
+
const selectDepthBlurTmpTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
54
|
+
const selectDepthBlurTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
55
|
+
// 外扩描边经深度测试后的结果(步骤 5.6):独立 target,避免回写 blur1 触发历史回归 bug
|
|
56
|
+
const blurDepthTestTextureTarget: WebGLRenderTarget = new WebGLRenderTarget(1024, 1024, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
57
|
+
|
|
58
|
+
const size: Vector2 = new Vector2();
|
|
59
|
+
|
|
60
|
+
const depthTestShader: ShaderMaterial = new ShaderMaterial({
|
|
61
|
+
uniforms: {
|
|
62
|
+
map: { value: null },
|
|
63
|
+
baseDepth: { value: null },
|
|
64
|
+
selectDepth: { value: null },
|
|
65
|
+
cameraFar: { value: 1000.0 },
|
|
66
|
+
uDebugVis: { value: 0.0 },
|
|
67
|
+
},
|
|
68
|
+
vertexShader: `
|
|
69
|
+
${ShaderChunk.common}
|
|
70
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
71
|
+
varying vec2 vUv;
|
|
72
|
+
void main() {
|
|
73
|
+
vUv = uv;
|
|
74
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
75
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
76
|
+
}
|
|
77
|
+
`,
|
|
78
|
+
fragmentShader: `
|
|
79
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
80
|
+
uniform sampler2D map;
|
|
81
|
+
uniform sampler2D baseDepth;
|
|
82
|
+
uniform sampler2D selectDepth;
|
|
83
|
+
uniform float cameraFar;
|
|
84
|
+
uniform float uDebugVis;
|
|
85
|
+
varying vec2 vUv;
|
|
86
|
+
void main() {
|
|
87
|
+
float baseD = texture2D(baseDepth, vUv).r;
|
|
88
|
+
float selD = texture2D(selectDepth, vUv).r;
|
|
89
|
+
// 调试可视化:R=base 线性深度归一化,G=select 线性深度归一化(背景≈1.0)。
|
|
90
|
+
// 全白(R=G≈1)→两路深度全是 clear 值 1.0(没写进数据);全黑→异常。
|
|
91
|
+
if (uDebugVis > 0.5) {
|
|
92
|
+
float vb = pow(cameraFar + 1.0, baseD) - 1.0;
|
|
93
|
+
float vs = pow(cameraFar + 1.0, selD) - 1.0;
|
|
94
|
+
gl_FragColor = vec4(vb / cameraFar, vs / cameraFar, 0.0, 1.0);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// 参考手写版 a27bdea 的朴素对数深度比对:DepthTexture 存的是对数深度,
|
|
98
|
+
// 「更小 = 更近」,base 比 select 更近即被真实场景遮挡 → discard。
|
|
99
|
+
// 背景像素 base≈1.0(最远)永远不小于物体深度 selD(<1.0) → 不丢弃,
|
|
100
|
+
// 浮空物体的描边正常显示(不会被天空/空背景整片吃掉,这是早期回归 bug 已修的点)。
|
|
101
|
+
// 加一个极小对数空间容差 bias(≈0.0006)防「选中对象自身像素」因浮点精度被误判遮挡
|
|
102
|
+
// (z-fit 锯齿);真实更近物体的深度差远大于此,不受影响。
|
|
103
|
+
// 用二值 discard 而非软遮挡:相交场景里 base 深度在地板/物体间亚像素抖,
|
|
104
|
+
// 软遮挡的半透明渐隐边缘一抖就明显闪;二值硬边界经后续 4 次 blur + FXAA 柔化更干净。
|
|
105
|
+
// 容差取自单一常量源 DEPTH_TEST_BIAS(调试用 debugDepthJudgeShader 用同一常量,
|
|
106
|
+
// 保证调试视图与真实判定永远一致,不会各写各的导致排查结论错误)。
|
|
107
|
+
const float bias = ${DEPTH_TEST_BIAS};
|
|
108
|
+
if (baseD < selD - bias) {
|
|
109
|
+
discard;
|
|
110
|
+
}
|
|
111
|
+
gl_FragColor = texture2D(map, vUv);
|
|
112
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
113
|
+
}
|
|
114
|
+
`,
|
|
115
|
+
blending: NoBlending,
|
|
116
|
+
depthTest: true,
|
|
117
|
+
depthWrite: true,
|
|
118
|
+
transparent: true
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const FXAAShaderMaterial: ShaderMaterial = new ShaderMaterial({
|
|
122
|
+
uniforms: {
|
|
123
|
+
tDiffuse: { value: null },
|
|
124
|
+
resolution: { value: new Vector2(1 / 1024, 1 / 1024) }
|
|
125
|
+
},
|
|
126
|
+
vertexShader: `
|
|
127
|
+
${ShaderChunk.common}
|
|
128
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
129
|
+
varying vec2 vUv;
|
|
130
|
+
void main() {
|
|
131
|
+
vUv = uv;
|
|
132
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
133
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
134
|
+
}
|
|
135
|
+
`,
|
|
136
|
+
fragmentShader: `
|
|
137
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
138
|
+
precision highp float;
|
|
139
|
+
|
|
140
|
+
uniform sampler2D tDiffuse;
|
|
141
|
+
|
|
142
|
+
uniform vec2 resolution;
|
|
143
|
+
|
|
144
|
+
varying vec2 vUv;
|
|
145
|
+
|
|
146
|
+
#ifndef FXAA_DISCARD
|
|
147
|
+
#define FXAA_DISCARD 0
|
|
148
|
+
#endif
|
|
149
|
+
|
|
150
|
+
/*--------------------------------------------------------------------------*/
|
|
151
|
+
#define FxaaTexTop(t, p) texture2D(t, p, -100.0)
|
|
152
|
+
#define FxaaTexOff(t, p, o, r) texture2D(t, p + (o * r), -100.0)
|
|
153
|
+
/*--------------------------------------------------------------------------*/
|
|
154
|
+
|
|
155
|
+
#define NUM_SAMPLES 5
|
|
156
|
+
|
|
157
|
+
float contrast( vec4 a, vec4 b ) {
|
|
158
|
+
vec4 diff = abs( a - b );
|
|
159
|
+
return max( max( max( diff.r, diff.g ), diff.b ), diff.a );
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/*============================================================================
|
|
163
|
+
|
|
164
|
+
FXAA3 QUALITY - PC
|
|
165
|
+
|
|
166
|
+
============================================================================*/
|
|
167
|
+
|
|
168
|
+
/*--------------------------------------------------------------------------*/
|
|
169
|
+
vec4 FxaaPixelShader(
|
|
170
|
+
vec2 posM,
|
|
171
|
+
sampler2D tex,
|
|
172
|
+
vec2 fxaaQualityRcpFrame,
|
|
173
|
+
float fxaaQualityEdgeThreshold,
|
|
174
|
+
float fxaaQualityinvEdgeThreshold
|
|
175
|
+
) {
|
|
176
|
+
vec4 rgbaM = FxaaTexTop(tex, posM);
|
|
177
|
+
vec4 rgbaS = FxaaTexOff(tex, posM, vec2( 0.0, 1.0), fxaaQualityRcpFrame.xy);
|
|
178
|
+
vec4 rgbaE = FxaaTexOff(tex, posM, vec2( 1.0, 0.0), fxaaQualityRcpFrame.xy);
|
|
179
|
+
vec4 rgbaN = FxaaTexOff(tex, posM, vec2( 0.0,-1.0), fxaaQualityRcpFrame.xy);
|
|
180
|
+
vec4 rgbaW = FxaaTexOff(tex, posM, vec2(-1.0, 0.0), fxaaQualityRcpFrame.xy);
|
|
181
|
+
|
|
182
|
+
bool earlyExit = max( max( max(
|
|
183
|
+
contrast( rgbaM, rgbaN ),
|
|
184
|
+
contrast( rgbaM, rgbaS ) ),
|
|
185
|
+
contrast( rgbaM, rgbaE ) ),
|
|
186
|
+
contrast( rgbaM, rgbaW ) )
|
|
187
|
+
< fxaaQualityEdgeThreshold;
|
|
188
|
+
|
|
189
|
+
#if (FXAA_DISCARD == 1)
|
|
190
|
+
if(earlyExit) FxaaDiscard;
|
|
191
|
+
#else
|
|
192
|
+
if(earlyExit) return rgbaM;
|
|
193
|
+
#endif
|
|
194
|
+
|
|
195
|
+
float contrastN = contrast( rgbaM, rgbaN );
|
|
196
|
+
float contrastS = contrast( rgbaM, rgbaS );
|
|
197
|
+
float contrastE = contrast( rgbaM, rgbaE );
|
|
198
|
+
float contrastW = contrast( rgbaM, rgbaW );
|
|
199
|
+
|
|
200
|
+
float relativeVContrast = ( contrastN + contrastS ) - ( contrastE + contrastW );
|
|
201
|
+
relativeVContrast *= fxaaQualityinvEdgeThreshold;
|
|
202
|
+
|
|
203
|
+
bool horzSpan = relativeVContrast > 0.;
|
|
204
|
+
|
|
205
|
+
if( abs( relativeVContrast ) < .3 ) {
|
|
206
|
+
vec2 dirToEdge;
|
|
207
|
+
dirToEdge.x = contrastE > contrastW ? 1. : -1.;
|
|
208
|
+
dirToEdge.y = contrastS > contrastN ? 1. : -1.;
|
|
209
|
+
|
|
210
|
+
vec4 rgbaAlongH = FxaaTexOff(tex, posM, vec2( dirToEdge.x, -dirToEdge.y ), fxaaQualityRcpFrame.xy);
|
|
211
|
+
float matchAlongH = contrast( rgbaM, rgbaAlongH );
|
|
212
|
+
|
|
213
|
+
vec4 rgbaAlongV = FxaaTexOff(tex, posM, vec2( -dirToEdge.x, dirToEdge.y ), fxaaQualityRcpFrame.xy);
|
|
214
|
+
float matchAlongV = contrast( rgbaM, rgbaAlongV );
|
|
215
|
+
|
|
216
|
+
relativeVContrast = matchAlongV - matchAlongH;
|
|
217
|
+
relativeVContrast *= fxaaQualityinvEdgeThreshold;
|
|
218
|
+
|
|
219
|
+
if( abs( relativeVContrast ) < .3 ) {
|
|
220
|
+
return mix(
|
|
221
|
+
rgbaM,
|
|
222
|
+
(rgbaN + rgbaS + rgbaE + rgbaW) * .25,
|
|
223
|
+
.4
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
horzSpan = relativeVContrast > 0.;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if(!horzSpan) rgbaN = rgbaW;
|
|
231
|
+
if(!horzSpan) rgbaS = rgbaE;
|
|
232
|
+
|
|
233
|
+
bool pairN = contrast( rgbaM, rgbaN ) > contrast( rgbaM, rgbaS );
|
|
234
|
+
if(!pairN) rgbaN = rgbaS;
|
|
235
|
+
|
|
236
|
+
vec2 offNP;
|
|
237
|
+
offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;
|
|
238
|
+
offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;
|
|
239
|
+
|
|
240
|
+
bool doneN = false;
|
|
241
|
+
bool doneP = false;
|
|
242
|
+
|
|
243
|
+
float nDist = 0.;
|
|
244
|
+
float pDist = 0.;
|
|
245
|
+
|
|
246
|
+
vec2 posN = posM;
|
|
247
|
+
vec2 posP = posM;
|
|
248
|
+
|
|
249
|
+
int iterationsUsed = 0;
|
|
250
|
+
int iterationsUsedN = 0;
|
|
251
|
+
int iterationsUsedP = 0;
|
|
252
|
+
for( int i = 0; i < NUM_SAMPLES; i++ ) {
|
|
253
|
+
iterationsUsed = i;
|
|
254
|
+
|
|
255
|
+
float increment = float(i + 1);
|
|
256
|
+
|
|
257
|
+
if(!doneN) {
|
|
258
|
+
nDist += increment;
|
|
259
|
+
posN = posM + offNP * nDist;
|
|
260
|
+
vec4 rgbaEndN = FxaaTexTop(tex, posN.xy);
|
|
261
|
+
doneN = contrast( rgbaEndN, rgbaM ) > contrast( rgbaEndN, rgbaN );
|
|
262
|
+
iterationsUsedN = i;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if(!doneP) {
|
|
266
|
+
pDist += increment;
|
|
267
|
+
posP = posM - offNP * pDist;
|
|
268
|
+
vec4 rgbaEndP = FxaaTexTop(tex, posP.xy);
|
|
269
|
+
doneP = contrast( rgbaEndP, rgbaM ) > contrast( rgbaEndP, rgbaN );
|
|
270
|
+
iterationsUsedP = i;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if(doneN || doneP) break;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
if ( !doneP && !doneN ) return rgbaM;
|
|
278
|
+
|
|
279
|
+
float dist = min(
|
|
280
|
+
doneN ? float( iterationsUsedN ) / float( NUM_SAMPLES - 1 ) : 1.,
|
|
281
|
+
doneP ? float( iterationsUsedP ) / float( NUM_SAMPLES - 1 ) : 1.
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
dist = pow(dist, .5);
|
|
285
|
+
|
|
286
|
+
dist = 1. - dist;
|
|
287
|
+
|
|
288
|
+
return mix(
|
|
289
|
+
rgbaM,
|
|
290
|
+
rgbaN,
|
|
291
|
+
dist * .5
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
void main() {
|
|
296
|
+
const float edgeDetectionQuality = .2;
|
|
297
|
+
const float invEdgeDetectionQuality = 1. / edgeDetectionQuality;
|
|
298
|
+
|
|
299
|
+
gl_FragColor = FxaaPixelShader(
|
|
300
|
+
vUv,
|
|
301
|
+
tDiffuse,
|
|
302
|
+
resolution,
|
|
303
|
+
edgeDetectionQuality,
|
|
304
|
+
invEdgeDetectionQuality
|
|
305
|
+
);
|
|
306
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
307
|
+
}
|
|
308
|
+
`,
|
|
309
|
+
blending: NoBlending,
|
|
310
|
+
depthTest: false,
|
|
311
|
+
depthWrite: false,
|
|
312
|
+
transparent: true
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
const strokeShader: RawShaderMaterial = new RawShaderMaterial({
|
|
316
|
+
uniforms: {
|
|
317
|
+
tDiffuse: { value: null },
|
|
318
|
+
color: { value: new Color("#0f0") },
|
|
319
|
+
width: { value: 1.0 },
|
|
320
|
+
opacity: { value: 1.0 },
|
|
321
|
+
resolution: { value: new Vector2(1 / 512, 1 / 512) },
|
|
322
|
+
offset: {
|
|
323
|
+
value: [
|
|
324
|
+
new Vector2(0.000, 1.000),
|
|
325
|
+
new Vector2(0.259, 0.966),
|
|
326
|
+
new Vector2(0.500, 0.866),
|
|
327
|
+
new Vector2(0.707, 0.707),
|
|
328
|
+
new Vector2(0.866, 0.500),
|
|
329
|
+
new Vector2(0.966, 0.259),
|
|
330
|
+
new Vector2(1.000, 0.000),
|
|
331
|
+
new Vector2(0.966, -0.259),
|
|
332
|
+
new Vector2(0.866, -0.500),
|
|
333
|
+
new Vector2(0.707, -0.707),
|
|
334
|
+
new Vector2(0.500, -0.866),
|
|
335
|
+
new Vector2(0.259, -0.966),
|
|
336
|
+
new Vector2(0.000, -1.000),
|
|
337
|
+
new Vector2(-0.259, -0.966),
|
|
338
|
+
new Vector2(-0.500, -0.866),
|
|
339
|
+
new Vector2(-0.707, -0.707),
|
|
340
|
+
new Vector2(-0.866, -0.500),
|
|
341
|
+
new Vector2(-0.966, -0.259),
|
|
342
|
+
new Vector2(-1.000, -0.000),
|
|
343
|
+
new Vector2(-0.966, 0.259),
|
|
344
|
+
new Vector2(-0.866, 0.500),
|
|
345
|
+
new Vector2(-0.707, 0.707),
|
|
346
|
+
new Vector2(-0.500, 0.866),
|
|
347
|
+
new Vector2(-0.259, 0.966)
|
|
348
|
+
]
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
vertexShader: `
|
|
352
|
+
attribute vec3 position;
|
|
353
|
+
attribute vec2 uv;
|
|
354
|
+
varying vec2 vUv;
|
|
355
|
+
void main() {
|
|
356
|
+
vUv = uv;
|
|
357
|
+
gl_Position = vec4(position, 1.0);
|
|
358
|
+
}`,
|
|
359
|
+
fragmentShader: `
|
|
360
|
+
#ifdef GL_ES
|
|
361
|
+
precision highp float;
|
|
362
|
+
#endif
|
|
363
|
+
uniform sampler2D tDiffuse;
|
|
364
|
+
uniform vec3 color;
|
|
365
|
+
uniform float width;
|
|
366
|
+
uniform float opacity;
|
|
367
|
+
uniform vec2 resolution;
|
|
368
|
+
uniform vec2 offset[24];
|
|
369
|
+
varying vec2 vUv;
|
|
370
|
+
vec2 piexl = resolution * width;
|
|
371
|
+
|
|
372
|
+
vec4 stroke(){
|
|
373
|
+
vec4 blurColor = vec4(0.0);
|
|
374
|
+
vec4 Color = vec4(0.0);
|
|
375
|
+
for (int i = 0; i < 24; i++ ) {
|
|
376
|
+
Color = texture2D(tDiffuse, vUv + (offset[i] * piexl));
|
|
377
|
+
if (Color.a > 0.0) {
|
|
378
|
+
blurColor += Color;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
if (blurColor.a < 0.001) {
|
|
382
|
+
return vec4(0.0);
|
|
383
|
+
} else {
|
|
384
|
+
return vec4(color, opacity);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
void main() {
|
|
388
|
+
vec4 Color = texture2D(tDiffuse, vUv);
|
|
389
|
+
if (Color.a > 0.0 || width == 0.0) {
|
|
390
|
+
gl_FragColor = Color;
|
|
391
|
+
} else {
|
|
392
|
+
gl_FragColor = stroke();
|
|
393
|
+
}
|
|
394
|
+
}`,
|
|
395
|
+
blending: NoBlending,
|
|
396
|
+
depthTest: false,
|
|
397
|
+
depthWrite: false,
|
|
398
|
+
transparent: true
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
// 深度 min-blur(最近深度,忽略背景 1.0):随描边一起把深度图向外扩,
|
|
402
|
+
// 外扩区 selD = 物体最近深度(<1.0) 而非清屏 1.0,depthTest 在外扩区才能正确判遮挡(不漏光),
|
|
403
|
+
// 同时本体区仍靠 depthTestShader 的 EPSILON 容差防自遮挡闪烁(无缝)。separable(direction 控制 H/V)。
|
|
404
|
+
const depthMinBlurShader: ShaderMaterial = new ShaderMaterial({
|
|
405
|
+
uniforms: {
|
|
406
|
+
tDepth: { value: null },
|
|
407
|
+
resolution: { value: new Vector2(1 / 512, 1 / 512) },
|
|
408
|
+
radius: { value: 1.0 },
|
|
409
|
+
direction: { value: new Vector2(1, 0) },
|
|
410
|
+
},
|
|
411
|
+
vertexShader: `
|
|
412
|
+
${ShaderChunk.common}
|
|
413
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
414
|
+
varying vec2 vUv;
|
|
415
|
+
void main() {
|
|
416
|
+
vUv = uv;
|
|
417
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
418
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
419
|
+
}
|
|
420
|
+
`,
|
|
421
|
+
fragmentShader: `
|
|
422
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
423
|
+
uniform sampler2D tDepth;
|
|
424
|
+
uniform vec2 resolution;
|
|
425
|
+
uniform float radius;
|
|
426
|
+
uniform vec2 direction;
|
|
427
|
+
varying vec2 vUv;
|
|
428
|
+
void main() {
|
|
429
|
+
float minD = 1.0;
|
|
430
|
+
for (int i = -10; i <= 10; i++) {
|
|
431
|
+
float x = float(i);
|
|
432
|
+
vec2 off = direction * (x * radius * resolution);
|
|
433
|
+
float d = texture2D(tDepth, vUv + off).r;
|
|
434
|
+
if (d < 0.9999) {
|
|
435
|
+
minD = min(minD, d);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
gl_FragColor = vec4(minD, 0.0, 0.0, 1.0);
|
|
439
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
440
|
+
}
|
|
441
|
+
`,
|
|
442
|
+
blending: NoBlending,
|
|
443
|
+
depthTest: false,
|
|
444
|
+
depthWrite: false,
|
|
445
|
+
transparent: true,
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
const filterSelectShader: RawShaderMaterial = new RawShaderMaterial({
|
|
449
|
+
uniforms: {
|
|
450
|
+
selectTexture: { value: null },
|
|
451
|
+
blurTexture: { value: null }
|
|
452
|
+
},
|
|
453
|
+
vertexShader: `
|
|
454
|
+
attribute vec3 position;
|
|
455
|
+
attribute vec2 uv;
|
|
456
|
+
varying vec2 vUv;
|
|
457
|
+
void main() {
|
|
458
|
+
vUv = uv;
|
|
459
|
+
gl_Position = vec4(position, 1.0);
|
|
460
|
+
}
|
|
461
|
+
`,
|
|
462
|
+
fragmentShader: `
|
|
463
|
+
#ifdef GL_ES
|
|
464
|
+
precision highp float;
|
|
465
|
+
#endif
|
|
466
|
+
uniform sampler2D selectTexture;
|
|
467
|
+
uniform sampler2D blurTexture;
|
|
468
|
+
varying vec2 vUv;
|
|
469
|
+
|
|
470
|
+
void main() {
|
|
471
|
+
gl_FragColor = texture2D(blurTexture, vUv);
|
|
472
|
+
gl_FragColor.a -= (texture2D(selectTexture, vUv).a);
|
|
473
|
+
}
|
|
474
|
+
`,
|
|
475
|
+
blending: NoBlending,
|
|
476
|
+
depthTest: false,
|
|
477
|
+
depthWrite: false,
|
|
478
|
+
transparent: true
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
const copyShader: ShaderMaterial = new ShaderMaterial({
|
|
482
|
+
uniforms: {
|
|
483
|
+
map: { value: null },
|
|
484
|
+
},
|
|
485
|
+
vertexShader: `
|
|
486
|
+
${ShaderChunk.common}
|
|
487
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
488
|
+
varying vec2 vUv;
|
|
489
|
+
void main() {
|
|
490
|
+
vUv = uv;
|
|
491
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
492
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
493
|
+
}
|
|
494
|
+
`,
|
|
495
|
+
fragmentShader: `
|
|
496
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
497
|
+
uniform sampler2D map;
|
|
498
|
+
varying vec2 vUv;
|
|
499
|
+
void main() {
|
|
500
|
+
gl_FragColor = texture2D(map, vUv);
|
|
501
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
502
|
+
}
|
|
503
|
+
`,
|
|
504
|
+
depthTest: true,
|
|
505
|
+
depthWrite: true,
|
|
506
|
+
transparent: true
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
const scene: Scene = new Scene();
|
|
510
|
+
|
|
511
|
+
export default function stroke_pass(
|
|
512
|
+
renderer: WebGLRenderer,
|
|
513
|
+
camera: Camera,
|
|
514
|
+
object3d: Object3D,
|
|
515
|
+
baseDepthTexture: DepthTexture,
|
|
516
|
+
devicePixelRatio: number
|
|
517
|
+
): void {
|
|
518
|
+
const {
|
|
519
|
+
stroke_enable = false,
|
|
520
|
+
stroke_color = "#04fa12",
|
|
521
|
+
stroke_width = 1
|
|
522
|
+
} = object3d.userData as EffectUserData;
|
|
523
|
+
|
|
524
|
+
if (!stroke_enable || stroke_width === 0) {
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
const originRenderTarget = renderer.getRenderTarget();
|
|
529
|
+
|
|
530
|
+
// 灰度图渲染目标跟随主画面尺寸(= width × effectiveRatio),与 baseRenderTarget 完全一致,
|
|
531
|
+
// 消除灰度图与主画面尺寸不一致导致的放大重采样摩尔纹
|
|
532
|
+
renderer.getSize(size);
|
|
533
|
+
size.multiplyScalar(devicePixelRatio);
|
|
534
|
+
selectTextureTarget.setSize(size.x, size.y);
|
|
535
|
+
selectDepthTextureTarget.setSize(size.x, size.y);
|
|
536
|
+
// 缺陷修复:three r167 的 WebGLRenderTarget.setSize 不会同步 depthTexture,
|
|
537
|
+
// 需手动把 selectDepthTexture 尺寸与全屏 baseDepth 对齐,否则深度比例错位导致描边被错误 discard
|
|
538
|
+
selectDepthTexture.image.width = size.x;
|
|
539
|
+
selectDepthTexture.image.height = size.y;
|
|
540
|
+
selectDepthTexture.needsUpdate = true;
|
|
541
|
+
selectDepthTestTextureTarget.setSize(size.x, size.y);
|
|
542
|
+
blur1TextureTarget.setSize(size.x, size.y);
|
|
543
|
+
blur2TextureTarget.setSize(size.x, size.y);
|
|
544
|
+
selectDepthBlurTmpTextureTarget.setSize(size.x, size.y);
|
|
545
|
+
selectDepthBlurTextureTarget.setSize(size.x, size.y);
|
|
546
|
+
blurDepthTestTextureTarget.setSize(size.x, size.y);
|
|
547
|
+
|
|
548
|
+
// 1. 渲染物体本体 mask(灰度)
|
|
549
|
+
renderer.setRenderTarget(selectTextureTarget);
|
|
550
|
+
scene.children = [object3d];
|
|
551
|
+
renderer.clear();
|
|
552
|
+
renderer.render(scene, camera);
|
|
553
|
+
|
|
554
|
+
// 2. 渲染物体本体深度(无 MSAA,供 depthTest 判定遮挡)
|
|
555
|
+
renderer.setRenderTarget(selectDepthTextureTarget);
|
|
556
|
+
scene.children = [object3d];
|
|
557
|
+
renderer.clear();
|
|
558
|
+
renderer.render(scene, camera);
|
|
559
|
+
// 调试:把本次渲染的选区深度记到全局调试状态,供面板「辉光深度比对」读取
|
|
560
|
+
debugDepthState.lastSelectDepth = selectDepthTexture;
|
|
561
|
+
|
|
562
|
+
// 3. 深度测试(用本体 mask):被真实更近物体挡住的「本体描边」部分 discard。
|
|
563
|
+
// 背景像素 baseDepth≈1.0(最远)永远不小于物体深度 → 不丢弃,浮空物体描边正常显示。
|
|
564
|
+
// 选中对象自身像素 baseD≈selD → 不丢弃,本体描边保留。
|
|
565
|
+
renderer.setRenderTarget(selectDepthTestTextureTarget);
|
|
566
|
+
renderer.clear();
|
|
567
|
+
depthTestShader.uniforms.map.value = selectTextureTarget.texture;
|
|
568
|
+
depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
|
|
569
|
+
depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
|
|
570
|
+
depthTestShader.uniforms.cameraFar.value = (camera as PerspectiveCamera).far;
|
|
571
|
+
depthTestShader.uniforms.uDebugVis.value = ((window as unknown as { __STROKE_DEPTH_VIS?: boolean }).__STROKE_DEPTH_VIS) ? 1.0 : 0.0;
|
|
572
|
+
fsQuad.render(renderer, depthTestShader);
|
|
573
|
+
|
|
574
|
+
// 4. 从「深度测试后的本体描边」开始外扩(外扩环自动继承本体遮挡判定 → 不漏光),
|
|
575
|
+
// 描边粗细由 stroke_width 控制的迭代次数决定。
|
|
576
|
+
strokeShader.uniforms.resolution.value.set(1 / size.x, 1 / size.y);
|
|
577
|
+
FXAAShaderMaterial.uniforms.resolution.value.set(1 / size.x, 1 / size.y);
|
|
578
|
+
strokeShader.uniforms.color.value.set(stroke_color);
|
|
579
|
+
strokeShader.uniforms.width.value = 1;
|
|
580
|
+
renderer.setRenderTarget(blur1TextureTarget);
|
|
581
|
+
strokeShader.uniforms.tDiffuse.value = selectDepthTestTextureTarget.texture;
|
|
582
|
+
fsQuad.render(renderer, strokeShader);
|
|
583
|
+
renderer.setRenderTarget(blur2TextureTarget);
|
|
584
|
+
strokeShader.uniforms.tDiffuse.value = blur1TextureTarget.texture;
|
|
585
|
+
fsQuad.render(renderer, strokeShader);
|
|
586
|
+
// 迭代外扩(stroke_width 控制粗细)
|
|
587
|
+
for (let i: number = 0; i < stroke_width - 2; i++) {
|
|
588
|
+
renderer.setRenderTarget(blur1TextureTarget);
|
|
589
|
+
strokeShader.uniforms.tDiffuse.value = blur2TextureTarget.texture;
|
|
590
|
+
fsQuad.render(renderer, strokeShader);
|
|
591
|
+
renderer.setRenderTarget(blur2TextureTarget);
|
|
592
|
+
strokeShader.uniforms.tDiffuse.value = blur1TextureTarget.texture;
|
|
593
|
+
fsQuad.render(renderer, strokeShader);
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
// 5. 最后抗锯齿
|
|
597
|
+
renderer.setRenderTarget(blur1TextureTarget);
|
|
598
|
+
FXAAShaderMaterial.uniforms.tDiffuse.value = blur2TextureTarget.texture;
|
|
599
|
+
fsQuad.render(renderer, FXAAShaderMaterial);
|
|
600
|
+
|
|
601
|
+
// 5.5 ⭐ 外扩环深度测试(补齐此前只定义未调用的死代码):
|
|
602
|
+
// 本体深度随描边一起外扩(separable H/V,外扩区取邻域最近深度),
|
|
603
|
+
// 再用它对外扩后的描边做一次 depthTest。
|
|
604
|
+
// 缺了这一步,外扩环(描边的视觉主体)永远不参与遮挡判定 →
|
|
605
|
+
// 物体被挡住时描边依旧从遮挡物前方漏出来("深度测试看起来失效"的真根因之一)。
|
|
606
|
+
depthMinBlurShader.uniforms.resolution.value.set(1 / size.x, 1 / size.y);
|
|
607
|
+
depthMinBlurShader.uniforms.radius.value = Math.max(1, stroke_width);
|
|
608
|
+
// H:直接采 DepthTexture(selectDepthTexture),其 .r 即对数深度
|
|
609
|
+
depthMinBlurShader.uniforms.direction.value.set(1, 0);
|
|
610
|
+
depthMinBlurShader.uniforms.tDepth.value = selectDepthTexture;
|
|
611
|
+
renderer.setRenderTarget(selectDepthBlurTmpTextureTarget);
|
|
612
|
+
fsQuad.render(renderer, depthMinBlurShader);
|
|
613
|
+
// V
|
|
614
|
+
depthMinBlurShader.uniforms.direction.value.set(0, 1);
|
|
615
|
+
depthMinBlurShader.uniforms.tDepth.value = selectDepthBlurTmpTextureTarget.texture;
|
|
616
|
+
renderer.setRenderTarget(selectDepthBlurTextureTarget);
|
|
617
|
+
fsQuad.render(renderer, depthMinBlurShader);
|
|
618
|
+
|
|
619
|
+
// 5.6 对外扩后的描边判遮挡:被更近几何挡住的外扩环像素 discard。
|
|
620
|
+
// ⚠️ 输出到独立 target,绝不回写 blur1(历史回归 bug:blur1 被 depthTest 结果覆盖
|
|
621
|
+
// 会导致步骤 6 相减归零、描边全不显示)。
|
|
622
|
+
renderer.setRenderTarget(blurDepthTestTextureTarget);
|
|
623
|
+
renderer.clear();
|
|
624
|
+
depthTestShader.uniforms.map.value = blur1TextureTarget.texture;
|
|
625
|
+
depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
|
|
626
|
+
depthTestShader.uniforms.selectDepth.value = selectDepthBlurTextureTarget.texture;
|
|
627
|
+
depthTestShader.uniforms.cameraFar.value = (camera as PerspectiveCamera).far;
|
|
628
|
+
depthTestShader.uniforms.uDebugVis.value = 0.0;
|
|
629
|
+
fsQuad.render(renderer, depthTestShader);
|
|
630
|
+
|
|
631
|
+
// 6. 合成:最终外扩描边(blurDepthTest,已判遮挡) 减去 深度测试后的本体描边
|
|
632
|
+
// = 仅保留描边外扩环;本体被减掉。filterSelectShader 用 NormalBlending 叠到场景上。
|
|
633
|
+
renderer.setRenderTarget(originRenderTarget);
|
|
634
|
+
filterSelectShader.uniforms.selectTexture.value = selectDepthTestTextureTarget.texture;
|
|
635
|
+
filterSelectShader.uniforms.blurTexture.value = blurDepthTestTextureTarget.texture;
|
|
636
|
+
filterSelectShader.blending = NormalBlending;
|
|
637
|
+
fsQuad.render(renderer, filterSelectShader);
|
|
638
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { ShaderMaterial } from "three";
|
|
2
|
-
declare const FXAAShaderMaterial: ShaderMaterial;
|
|
3
|
-
export default FXAAShaderMaterial;
|
|
1
|
+
import { ShaderMaterial } from "three";
|
|
2
|
+
declare const FXAAShaderMaterial: ShaderMaterial;
|
|
3
|
+
export default FXAAShaderMaterial;
|