three-base 2.0.13 → 2.0.14

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.
@@ -23,6 +23,7 @@ export default class PointLight extends THREEPointLight {
23
23
  pointLinghtHelper = threeUtils.isDev && (() => {
24
24
  const pointLinghtHelper = new Sprite();
25
25
  pointLinghtHelper.scale.set(0.05, 0.05, 0.05);
26
+ pointLinghtHelper.material.alphaTest = 0.1;
26
27
  pointLinghtHelper.material.color = this.color;
27
28
  pointLinghtHelper.material.map = threeLoader.getTexture(pointLight_mapPNG);
28
29
  pointLinghtHelper.material.sizeAttenuation = false;
@@ -54,7 +55,7 @@ export default class PointLight extends THREEPointLight {
54
55
  label.position.set(0, 0, 0);
55
56
  label.visible = false;
56
57
  label.material.color = this.color;
57
- label.material.depthTest = false;
58
+ // label.material.depthTest = false;
58
59
  label.material.sizeAttenuation = false;
59
60
  label.scale.multiplyScalar(0.002);
60
61
  this.add(label);
@@ -28,6 +28,7 @@ export default class PointLight extends THREEPointLight {
28
28
  pointLinghtHelper = threeUtils.isDev && (() => {
29
29
  const pointLinghtHelper = new Sprite();
30
30
  pointLinghtHelper.scale.set(0.05, 0.05, 0.05);
31
+ pointLinghtHelper.material.alphaTest = 0.1;
31
32
  pointLinghtHelper.material.color = this.color;
32
33
  pointLinghtHelper.material.map = threeLoader.getTexture(pointLight_mapPNG);
33
34
  pointLinghtHelper.material.sizeAttenuation = false;
@@ -64,7 +65,7 @@ export default class PointLight extends THREEPointLight {
64
65
  label.position.set(0, 0, 0);
65
66
  label.visible = false;
66
67
  label.material.color = this.color;
67
- label.material.depthTest = false;
68
+ // label.material.depthTest = false;
68
69
  label.material.sizeAttenuation = false;
69
70
  label.scale.multiplyScalar(0.002);
70
71
  this.add(label);
package/SpriteText.js CHANGED
@@ -8,6 +8,7 @@ import { Sprite, SpriteMaterial, Texture, LinearFilter } from "three";
8
8
  export default class SpriteText extends Sprite {
9
9
  constructor(text = '', textHeight = 10, color = 'rgba(255, 255, 255, 1)') {
10
10
  super(new SpriteMaterial());
11
+ this.material.alphaTest = 0.1;
11
12
  this._text = `${text}`;
12
13
  this._textHeight = textHeight;
13
14
  this._color = color;
package/SpriteText.ts CHANGED
@@ -12,6 +12,7 @@ export default class SpriteText extends Sprite {
12
12
  constructor(text = '', textHeight = 10, color: `#${string}` | `rgba(${string})` = 'rgba(255, 255, 255, 1)') {
13
13
  super(new SpriteMaterial());
14
14
 
15
+ this.material.alphaTest = 0.1;
15
16
  this._text = `${text}`;
16
17
  this._textHeight = textHeight;
17
18
  this._color = color;
package/SpriteText2.js CHANGED
@@ -9,6 +9,7 @@ import { LinearFilter, Sprite, Texture } from 'three';
9
9
  export default class SpriteText2 extends Sprite {
10
10
  constructor(text = '', textHeight = 10, color = 'rgba(255, 255, 255, 1)') {
11
11
  super();
12
+ this.material.alphaTest = 0.1;
12
13
  this._text = `${text}`;
13
14
  this._textHeight = textHeight;
14
15
  this._color = color;
package/SpriteText2.ts CHANGED
@@ -13,6 +13,7 @@ export default class SpriteText2 extends Sprite {
13
13
  constructor(text = '', textHeight = 10, color: `rgb(${string})` | `rgba(${string})` | `#${string}` = 'rgba(255, 255, 255, 1)') {
14
14
  super();
15
15
 
16
+ this.material.alphaTest = 0.1;
16
17
  this._text = `${text}`;
17
18
  this._textHeight = textHeight;
18
19
  this._color = color;
package/ThreeBase.d.ts CHANGED
@@ -1,11 +1,13 @@
1
- import { AxesHelper, BufferGeometry, Camera, EventDispatcher, GridHelper, Object3D, Scene, Texture, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
1
+ import { AxesHelper, BufferGeometry, Camera, DepthTexture, EventDispatcher, GridHelper, Object3D, Scene, Texture, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
2
2
  import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
3
3
  import ThreeMouse from "./ThreeMouse";
4
4
  import Transition from "./Transition";
5
5
  export default class ThreeBase extends EventDispatcher {
6
6
  constructor();
7
- renderTarget: WebGLRenderTarget;
8
- renderTarget2: WebGLRenderTarget;
7
+ baseDepthTexture: DepthTexture;
8
+ baseRenderTarget: WebGLRenderTarget<Texture>;
9
+ renderTarget: WebGLRenderTarget<Texture>;
10
+ renderTarget2: WebGLRenderTarget<Texture>;
9
11
  tempVector2: Vector2;
10
12
  tempVector3: Vector3;
11
13
  size: Vector2;
@@ -58,4 +60,5 @@ export default class ThreeBase extends EventDispatcher {
58
60
  renderTargetgaussBlur(rendererTarget: WebGLRenderTarget, radius: number, opacity: number): void;
59
61
  renderTargetAddGlow(renderTarget: WebGLRenderTarget, width: number, color: string): void;
60
62
  renderRendererTarget(renderTarget: WebGLRenderTarget, alpha?: boolean): void;
63
+ renderTexture(texture: Texture, alpha?: boolean): void;
61
64
  }
package/ThreeBase.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * @Last Modified time: 2023-05-23 23:54:13
6
6
  */
7
7
  import { round } from "lodash";
8
- import { AxesHelper, EventDispatcher, GridHelper, LinearFilter, Mesh, MOUSE, NoBlending, NormalBlending, PerspectiveCamera, RGBAFormat, Scene, TOUCH, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
8
+ import { AxesHelper, DepthFormat, DepthTexture, EventDispatcher, GridHelper, LinearFilter, Mesh, MOUSE, NoBlending, NormalBlending, PerspectiveCamera, RGBAFormat, Scene, SRGBColorSpace, sRGBEncoding, TOUCH, UnsignedShortType, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
9
9
  import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
10
10
  import { generateUUID } from "three/src/math/MathUtils";
11
11
  import { clearShader, coptyShader, fullScreenMesh, gaussBlurShader, strokeShader } from "./shaders";
@@ -21,6 +21,30 @@ export default class ThreeBase extends EventDispatcher {
21
21
  super();
22
22
  this.init();
23
23
  }
24
+ // 基础深度纹理
25
+ baseDepthTexture = (() => {
26
+ const baseDepthTexture = new DepthTexture(4096, 4096);
27
+ baseDepthTexture.format = DepthFormat;
28
+ baseDepthTexture.type = UnsignedShortType;
29
+ baseDepthTexture.anisotropy = 16;
30
+ return baseDepthTexture;
31
+ })();
32
+ // 基础纹理渲染对象
33
+ baseRenderTarget = new WebGLRenderTarget(128, 128, {
34
+ minFilter: LinearFilter,
35
+ magFilter: LinearFilter,
36
+ format: RGBAFormat,
37
+ stencilBuffer: false,
38
+ depthTexture: this.baseDepthTexture,
39
+ anisotropy: 16,
40
+ colorSpace: SRGBColorSpace,
41
+ // | typeof NoColorSpace
42
+ // | typeof SRGBColorSpace
43
+ // | typeof LinearSRGBColorSpace
44
+ // | typeof DisplayP3ColorSpace;
45
+ encoding: sRGBEncoding
46
+ // LinearEncoding | typeof sRGBEncoding;
47
+ });
24
48
  // 公用渲染目标1
25
49
  renderTarget = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
26
50
  // 渲染目标2
@@ -100,10 +124,11 @@ export default class ThreeBase extends EventDispatcher {
100
124
  }
101
125
  this.renderer.setPixelRatio(window.devicePixelRatio);
102
126
  this.renderer.setSize(width, height);
127
+ this.baseRenderTarget.setSize(width, height);
103
128
  this.size.set(width, height);
104
129
  // 渲染场景
105
- this.renderer.clear();
106
- this.renderer.render(this.scene, this.camera);
130
+ // this.renderer.clear();
131
+ // this.renderer.render(this.scene, this.camera);
107
132
  }
108
133
  // 控制器的位置缓动的计算的顶点对象
109
134
  controlsPosition = (() => {
@@ -261,14 +286,19 @@ export default class ThreeBase extends EventDispatcher {
261
286
  if (this.controls.enabled) {
262
287
  this.controls.update();
263
288
  }
264
- this.renderer.clear();
265
289
  // 渲染场景
266
290
  this.dispatchEvent({ type: "beforeRender" });
291
+ //TODO 渲染了2次, 还有优化空间
292
+ this.renderer.setRenderTarget(this.baseRenderTarget);
293
+ this.renderer.clear();
294
+ this.renderer.render(this.scene, this.camera);
295
+ this.renderer.setRenderTarget(null);
296
+ this.renderer.clear();
267
297
  this.renderer.render(this.scene, this.camera);
268
298
  // 查找需要绘制描边的对象,并且绘制描边
269
299
  this.scene.traverse(obj => {
270
- stroke_pass(this.renderer, this.camera, obj);
271
- glow_pass(this.renderer, this.camera, obj);
300
+ stroke_pass(this.renderer, this.camera, obj, this.baseDepthTexture);
301
+ glow_pass(this.renderer, this.camera, obj, this.baseDepthTexture);
272
302
  });
273
303
  this.dispatchEvent({ type: "afterRender" });
274
304
  }
@@ -401,4 +431,12 @@ export default class ThreeBase extends EventDispatcher {
401
431
  coptyShader.blending = alpha ? NoBlending : NormalBlending;
402
432
  fullScreenMesh.render(this.renderer);
403
433
  }
434
+ // 渲染纹理
435
+ renderTexture(texture, alpha = false) {
436
+ coptyShader.uniforms.map.value = texture;
437
+ coptyShader.uniforms.opacity.value = 1.0;
438
+ fullScreenMesh.material = coptyShader;
439
+ coptyShader.blending = alpha ? NoBlending : NormalBlending;
440
+ fullScreenMesh.render(this.renderer);
441
+ }
404
442
  }
package/ThreeBase.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import { round } from "lodash";
9
- import { AxesHelper, BufferGeometry, Camera, EventDispatcher, GridHelper, LinearFilter, Mesh, MeshBasicMaterial, MOUSE, NoBlending, NormalBlending, Object3D, PerspectiveCamera, RGBAFormat, Scene, Texture, TOUCH, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
9
+ import { AxesHelper, BufferGeometry, Camera, DepthFormat, DepthTexture, DisplayP3ColorSpace, EventDispatcher, GridHelper, LinearEncoding, LinearFilter, LinearSRGBColorSpace, Mesh, MeshBasicMaterial, MOUSE, NoBlending, NoColorSpace, NormalBlending, Object3D, PerspectiveCamera, RGBAFormat, Scene, SRGBColorSpace, sRGBEncoding, Texture, TOUCH, UnsignedShortType, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
10
10
  import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
11
11
  import { generateUUID } from "three/src/math/MathUtils";
12
12
  import { clearShader, coptyShader, fullScreenMesh, gaussBlurShader, strokeShader } from "./shaders";
@@ -25,6 +25,32 @@ export default class ThreeBase extends EventDispatcher {
25
25
  this.init();
26
26
  }
27
27
 
28
+ // 基础深度纹理
29
+ baseDepthTexture = (() => {
30
+ const baseDepthTexture = new DepthTexture(4096, 4096);
31
+ baseDepthTexture.format = DepthFormat;
32
+ baseDepthTexture.type = UnsignedShortType;
33
+ baseDepthTexture.anisotropy = 16;
34
+ return baseDepthTexture;
35
+ })();
36
+
37
+ // 基础纹理渲染对象
38
+ baseRenderTarget = new WebGLRenderTarget(128, 128, {
39
+ minFilter: LinearFilter,
40
+ magFilter: LinearFilter,
41
+ format: RGBAFormat,
42
+ stencilBuffer: false,
43
+ depthTexture: this.baseDepthTexture,
44
+ anisotropy: 16,
45
+ colorSpace: SRGBColorSpace,
46
+ // | typeof NoColorSpace
47
+ // | typeof SRGBColorSpace
48
+ // | typeof LinearSRGBColorSpace
49
+ // | typeof DisplayP3ColorSpace;
50
+ encoding: sRGBEncoding
51
+ // LinearEncoding | typeof sRGBEncoding;
52
+ });
53
+
28
54
  // 公用渲染目标1
29
55
  renderTarget = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
30
56
 
@@ -121,10 +147,13 @@ export default class ThreeBase extends EventDispatcher {
121
147
 
122
148
  this.renderer.setPixelRatio(window.devicePixelRatio);
123
149
  this.renderer.setSize(width, height);
150
+
151
+ this.baseRenderTarget.setSize(width, height);
152
+
124
153
  this.size.set(width, height);
125
154
  // 渲染场景
126
- this.renderer.clear();
127
- this.renderer.render(this.scene, this.camera);
155
+ // this.renderer.clear();
156
+ // this.renderer.render(this.scene, this.camera);
128
157
  }
129
158
 
130
159
  // 控制器的位置缓动的计算的顶点对象
@@ -314,16 +343,22 @@ export default class ThreeBase extends EventDispatcher {
314
343
  this.controls.update();
315
344
  }
316
345
 
317
- this.renderer.clear();
318
-
319
346
  // 渲染场景
320
347
  this.dispatchEvent({ type: "beforeRender" });
348
+
349
+ //TODO 渲染了2次, 还有优化空间
350
+ this.renderer.setRenderTarget(this.baseRenderTarget);
351
+ this.renderer.clear();
352
+ this.renderer.render(this.scene, this.camera);
353
+
354
+ this.renderer.setRenderTarget(null);
355
+ this.renderer.clear();
321
356
  this.renderer.render(this.scene, this.camera);
322
357
 
323
358
  // 查找需要绘制描边的对象,并且绘制描边
324
359
  this.scene.traverse(obj => {
325
- stroke_pass(this.renderer, this.camera, obj);
326
- glow_pass(this.renderer, this.camera, obj);
360
+ stroke_pass(this.renderer, this.camera, obj, this.baseDepthTexture);
361
+ glow_pass(this.renderer, this.camera, obj, this.baseDepthTexture);
327
362
  });
328
363
 
329
364
  this.dispatchEvent({ type: "afterRender" });
@@ -482,4 +517,13 @@ export default class ThreeBase extends EventDispatcher {
482
517
  fullScreenMesh.render(this.renderer);
483
518
  }
484
519
 
520
+ // 渲染纹理
521
+ renderTexture(texture: Texture, alpha: boolean = false) {
522
+ coptyShader.uniforms.map.value = texture;
523
+ coptyShader.uniforms.opacity.value = 1.0;
524
+ fullScreenMesh.material = coptyShader;
525
+ coptyShader.blending = alpha ? NoBlending : NormalBlending;
526
+ fullScreenMesh.render(this.renderer);
527
+ }
528
+
485
529
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "three-base",
3
- "version": "2.0.13",
3
+ "version": "2.0.14",
4
4
  "description": "three 3d three-base",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,7 +35,7 @@
35
35
  "dependencies": {
36
36
  "apng-js": "^1",
37
37
  "lodash": "^4",
38
- "three": "^0.152.0",
38
+ "three": "^0.154.0",
39
39
  "dexie": "^3",
40
40
  "vite": "*",
41
41
  "html2canvas": "^1.4.1"
@@ -1,2 +1,2 @@
1
- import { Camera, Object3D, WebGLRenderer } from "three";
2
- export default function glow_pass(renderer: WebGLRenderer, camera: Camera, object3d: Object3D): void;
1
+ import { Camera, Object3D, WebGLRenderer, DepthTexture } from "three";
2
+ export default function glow_pass(renderer: WebGLRenderer, camera: Camera, object3d: Object3D, baseDepthTexture: DepthTexture): void;
package/pass/glow_pass.js CHANGED
@@ -4,10 +4,31 @@
4
4
  * @Last Modified by: xiaosihan
5
5
  * @Last Modified time: 2023-05-09 02:33:28
6
6
  */
7
- import { LinearFilter, RGBAFormat, Vector2, WebGLRenderTarget, ShaderMaterial, NoBlending, Scene, RawShaderMaterial, Color, NormalBlending, ShaderChunk } from "three";
7
+ import { LinearFilter, RGBAFormat, Vector2, WebGLRenderTarget, ShaderMaterial, NoBlending, Scene, RawShaderMaterial, Color, NormalBlending, ShaderChunk, DepthTexture, DepthFormat, UnsignedShortType } from "three";
8
8
  import FullScreenQuad from "./FullScreenQuad";
9
+ // 选中对象的深度纹理
10
+ const selectDepthTexture = (() => {
11
+ const baseDepthTexture = new DepthTexture(4096, 4096);
12
+ baseDepthTexture.format = DepthFormat;
13
+ baseDepthTexture.type = UnsignedShortType;
14
+ baseDepthTexture.anisotropy = 16;
15
+ return baseDepthTexture;
16
+ })();
9
17
  // 选中对象的纹理
10
- const selectTextureTarget = new WebGLRenderTarget(512, 512, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
18
+ const selectTextureTarget = new WebGLRenderTarget(512, 512, {
19
+ minFilter: LinearFilter,
20
+ magFilter: LinearFilter,
21
+ format: RGBAFormat,
22
+ depthTexture: selectDepthTexture,
23
+ anisotropy: 16,
24
+ });
25
+ // 深度测试后的选中纹理
26
+ const selectDethpTestTextureTarget = new WebGLRenderTarget(512, 512, {
27
+ minFilter: LinearFilter,
28
+ magFilter: LinearFilter,
29
+ format: RGBAFormat,
30
+ anisotropy: 16,
31
+ });
11
32
  // 由于不能同时读写自己的纹理
12
33
  const blur1TextureTarget = new WebGLRenderTarget(512, 512, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
13
34
  // 所以需要用2个模糊纹理相互读写
@@ -15,6 +36,44 @@ const blur2TextureTarget = new WebGLRenderTarget(512, 512, { minFilter: LinearFi
15
36
  const size = new Vector2();
16
37
  // 创建一个渲染工具 用于处理纹理
17
38
  const fsQuad = new FullScreenQuad(); // 渲染辅助器
39
+ //深度比对纹理
40
+ const depthTestShader = new ShaderMaterial({
41
+ uniforms: {
42
+ map: { value: null },
43
+ baseDepth: { value: null },
44
+ selectDepth: { value: null }, // 选中的对象深度纹理
45
+ },
46
+ vertexShader: `
47
+ ${ShaderChunk.common}
48
+ ${ShaderChunk.logdepthbuf_pars_vertex}
49
+ varying vec2 vUv;
50
+ void main() {
51
+ vUv = uv;
52
+ // gl_Position = vec4(position, 1.0);
53
+ // gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
54
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
55
+ ${ShaderChunk.logdepthbuf_vertex}
56
+ }
57
+ `,
58
+ fragmentShader: `
59
+ ${ShaderChunk.logdepthbuf_pars_fragment}
60
+ uniform sampler2D map;
61
+ uniform sampler2D baseDepth;
62
+ uniform sampler2D selectDepth;
63
+ varying vec2 vUv;
64
+ void main() {
65
+ if(texture2D(baseDepth, vUv).r < texture2D(selectDepth, vUv).r){
66
+ discard;
67
+ }
68
+ gl_FragColor = texture2D(map, vUv);
69
+ ${ShaderChunk.logdepthbuf_fragment}
70
+ }
71
+ `,
72
+ blending: NoBlending,
73
+ depthTest: true,
74
+ depthWrite: true,
75
+ transparent: true
76
+ });
18
77
  // 抗锯齿着色器
19
78
  const FXAAShaderMaterial = new ShaderMaterial({
20
79
  uniforms: {
@@ -374,10 +433,39 @@ const filterSelectShader = new RawShaderMaterial({
374
433
  depthWrite: false,
375
434
  transparent: true
376
435
  });
436
+ const copyShader = new ShaderMaterial({
437
+ uniforms: {
438
+ map: { value: null }, // 贴图纹理
439
+ },
440
+ vertexShader: `
441
+ ${ShaderChunk.common}
442
+ ${ShaderChunk.logdepthbuf_pars_vertex}
443
+ varying vec2 vUv;
444
+ void main() {
445
+ vUv = uv;
446
+ // gl_Position = vec4(position, 1.0);
447
+ // gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
448
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
449
+ ${ShaderChunk.logdepthbuf_vertex}
450
+ }
451
+ `,
452
+ fragmentShader: `
453
+ ${ShaderChunk.logdepthbuf_pars_fragment}
454
+ uniform sampler2D map;
455
+ varying vec2 vUv;
456
+ void main() {
457
+ gl_FragColor = texture2D(map, vUv);
458
+ ${ShaderChunk.logdepthbuf_fragment}
459
+ }
460
+ `,
461
+ depthTest: true,
462
+ depthWrite: true,
463
+ transparent: true
464
+ });
377
465
  // 场景对象
378
466
  const scene = new Scene();
379
467
  // 对象发光
380
- export default function glow_pass(renderer, camera, object3d) {
468
+ export default function glow_pass(renderer, camera, object3d, baseDepthTexture) {
381
469
  const { glow_enable = false, glow_color = "#04fa12", glow_width = 1, glow_opacity = 1 } = object3d.userData;
382
470
  if (!glow_enable || glow_width === 0) {
383
471
  return;
@@ -387,6 +475,7 @@ export default function glow_pass(renderer, camera, object3d) {
387
475
  // 设置选中目标的帧缓冲区
388
476
  renderer.getSize(size);
389
477
  selectTextureTarget.setSize(size.x, size.y);
478
+ selectDethpTestTextureTarget.setSize(size.x, size.y);
390
479
  blur1TextureTarget.setSize(size.x, size.y);
391
480
  blur2TextureTarget.setSize(size.x, size.y);
392
481
  renderer.setRenderTarget(selectTextureTarget);
@@ -400,9 +489,16 @@ export default function glow_pass(renderer, camera, object3d) {
400
489
  //描边颜色
401
490
  blurShader.uniforms.color.value.set(glow_color);
402
491
  blurShader.uniforms.width.value = glow_width / 10;
492
+ //深度测试
493
+ renderer.setRenderTarget(selectDethpTestTextureTarget);
494
+ renderer.clear();
495
+ depthTestShader.uniforms.map.value = selectTextureTarget.texture;
496
+ depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
497
+ depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
498
+ fsQuad.render(renderer, depthTestShader);
403
499
  //一次描边
404
500
  renderer.setRenderTarget(blur1TextureTarget);
405
- blurShader.uniforms.tDiffuse.value = selectTextureTarget.texture;
501
+ blurShader.uniforms.tDiffuse.value = selectDethpTestTextureTarget.texture;
406
502
  blurShader.uniforms.opacity.value = 1.0;
407
503
  fsQuad.render(renderer, blurShader);
408
504
  //二次描边
@@ -456,7 +552,7 @@ export default function glow_pass(renderer, camera, object3d) {
456
552
  fsQuad.render(renderer, FXAAShaderMaterial);
457
553
  // 还原帧缓冲区 减去原始纹理保留描边
458
554
  renderer.setRenderTarget(originRenderTarget);
459
- filterSelectShader.uniforms.selectTexture.value = selectTextureTarget.texture;
555
+ filterSelectShader.uniforms.selectTexture.value = selectDethpTestTextureTarget.texture;
460
556
  filterSelectShader.uniforms.blurTexture.value = blur1TextureTarget.texture;
461
557
  filterSelectShader.uniforms.opacity.value = glow_opacity;
462
558
  filterSelectShader.blending = NormalBlending; // 与有的纹理融合计算 保留前面通道传递下来的纹理
package/pass/glow_pass.ts CHANGED
@@ -5,11 +5,35 @@
5
5
  * @Last Modified time: 2023-05-09 02:33:28
6
6
  */
7
7
 
8
- import { Camera, LinearFilter, Object3D, RGBAFormat, Vector2, WebGLRenderTarget, WebGLRenderer, ShaderMaterial, NoBlending, Scene, RawShaderMaterial, Color, NormalBlending, ShaderChunk } from "three";
8
+ import { Camera, LinearFilter, Object3D, RGBAFormat, Vector2, WebGLRenderTarget, WebGLRenderer, ShaderMaterial, NoBlending, Scene, RawShaderMaterial, Color, NormalBlending, ShaderChunk, DepthTexture, DepthFormat, UnsignedShortType } from "three";
9
9
  import FullScreenQuad from "./FullScreenQuad";
10
10
 
11
+
12
+ // 选中对象的深度纹理
13
+ const selectDepthTexture = (() => {
14
+ const baseDepthTexture = new DepthTexture(4096, 4096);
15
+ baseDepthTexture.format = DepthFormat;
16
+ baseDepthTexture.type = UnsignedShortType;
17
+ baseDepthTexture.anisotropy = 16;
18
+ return baseDepthTexture;
19
+ })();
20
+
11
21
  // 选中对象的纹理
12
- const selectTextureTarget = new WebGLRenderTarget(512, 512, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
22
+ const selectTextureTarget = new WebGLRenderTarget(512, 512, {
23
+ minFilter: LinearFilter,
24
+ magFilter: LinearFilter,
25
+ format: RGBAFormat,
26
+ depthTexture: selectDepthTexture,
27
+ anisotropy: 16,
28
+ });
29
+
30
+ // 深度测试后的选中纹理
31
+ const selectDethpTestTextureTarget = new WebGLRenderTarget(512, 512, {
32
+ minFilter: LinearFilter,
33
+ magFilter: LinearFilter,
34
+ format: RGBAFormat,
35
+ anisotropy: 16,
36
+ });
13
37
 
14
38
  // 由于不能同时读写自己的纹理
15
39
  const blur1TextureTarget = new WebGLRenderTarget(512, 512, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
@@ -22,6 +46,46 @@ const size = new Vector2();
22
46
  // 创建一个渲染工具 用于处理纹理
23
47
  const fsQuad = new FullScreenQuad(); // 渲染辅助器
24
48
 
49
+
50
+ //深度比对纹理
51
+ const depthTestShader = new ShaderMaterial({
52
+ uniforms: {
53
+ map: { value: null }, // 贴图纹理
54
+ baseDepth: { value: null }, // 整个场景的深度纹理
55
+ selectDepth: { value: null }, // 选中的对象深度纹理
56
+ },
57
+ vertexShader: `
58
+ ${ShaderChunk.common}
59
+ ${ShaderChunk.logdepthbuf_pars_vertex}
60
+ varying vec2 vUv;
61
+ void main() {
62
+ vUv = uv;
63
+ // gl_Position = vec4(position, 1.0);
64
+ // gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
65
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
66
+ ${ShaderChunk.logdepthbuf_vertex}
67
+ }
68
+ `,
69
+ fragmentShader: `
70
+ ${ShaderChunk.logdepthbuf_pars_fragment}
71
+ uniform sampler2D map;
72
+ uniform sampler2D baseDepth;
73
+ uniform sampler2D selectDepth;
74
+ varying vec2 vUv;
75
+ void main() {
76
+ if(texture2D(baseDepth, vUv).r < texture2D(selectDepth, vUv).r){
77
+ discard;
78
+ }
79
+ gl_FragColor = texture2D(map, vUv);
80
+ ${ShaderChunk.logdepthbuf_fragment}
81
+ }
82
+ `,
83
+ blending: NoBlending, // 渲染时不与背景融合计算 直接替换
84
+ depthTest: true,
85
+ depthWrite: true,
86
+ transparent: true
87
+ });
88
+
25
89
  // 抗锯齿着色器
26
90
  const FXAAShaderMaterial = new ShaderMaterial({
27
91
  uniforms: {
@@ -384,11 +448,41 @@ const filterSelectShader = new RawShaderMaterial({
384
448
  transparent: true
385
449
  });
386
450
 
451
+ const copyShader = new ShaderMaterial({
452
+ uniforms: {
453
+ map: { value: null }, // 贴图纹理
454
+ },
455
+ vertexShader: `
456
+ ${ShaderChunk.common}
457
+ ${ShaderChunk.logdepthbuf_pars_vertex}
458
+ varying vec2 vUv;
459
+ void main() {
460
+ vUv = uv;
461
+ // gl_Position = vec4(position, 1.0);
462
+ // gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
463
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
464
+ ${ShaderChunk.logdepthbuf_vertex}
465
+ }
466
+ `,
467
+ fragmentShader: `
468
+ ${ShaderChunk.logdepthbuf_pars_fragment}
469
+ uniform sampler2D map;
470
+ varying vec2 vUv;
471
+ void main() {
472
+ gl_FragColor = texture2D(map, vUv);
473
+ ${ShaderChunk.logdepthbuf_fragment}
474
+ }
475
+ `,
476
+ depthTest: true,
477
+ depthWrite: true,
478
+ transparent: true
479
+ });
480
+
387
481
  // 场景对象
388
482
  const scene = new Scene();
389
483
 
390
484
  // 对象发光
391
- export default function glow_pass(renderer: WebGLRenderer, camera: Camera, object3d: Object3D) {
485
+ export default function glow_pass(renderer: WebGLRenderer, camera: Camera, object3d: Object3D, baseDepthTexture: DepthTexture) {
392
486
 
393
487
  const { glow_enable = false, glow_color = "#04fa12", glow_width = 1, glow_opacity = 1 } = object3d.userData;
394
488
 
@@ -402,6 +496,7 @@ export default function glow_pass(renderer: WebGLRenderer, camera: Camera, objec
402
496
  // 设置选中目标的帧缓冲区
403
497
  renderer.getSize(size);
404
498
  selectTextureTarget.setSize(size.x, size.y);
499
+ selectDethpTestTextureTarget.setSize(size.x, size.y);
405
500
  blur1TextureTarget.setSize(size.x, size.y);
406
501
  blur2TextureTarget.setSize(size.x, size.y);
407
502
 
@@ -418,12 +513,22 @@ export default function glow_pass(renderer: WebGLRenderer, camera: Camera, objec
418
513
  blurShader.uniforms.color.value.set(glow_color);
419
514
  blurShader.uniforms.width.value = glow_width / 10;
420
515
 
516
+ //深度测试
517
+ renderer.setRenderTarget(selectDethpTestTextureTarget);
518
+ renderer.clear();
519
+ depthTestShader.uniforms.map.value = selectTextureTarget.texture;
520
+ depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
521
+ depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
522
+ fsQuad.render(renderer, depthTestShader);
523
+
421
524
  //一次描边
422
525
  renderer.setRenderTarget(blur1TextureTarget);
423
- blurShader.uniforms.tDiffuse.value = selectTextureTarget.texture;
526
+ blurShader.uniforms.tDiffuse.value = selectDethpTestTextureTarget.texture;
424
527
  blurShader.uniforms.opacity.value = 1.0;
425
528
  fsQuad.render(renderer, blurShader);
426
529
 
530
+
531
+
427
532
  //二次描边
428
533
  renderer.setRenderTarget(blur2TextureTarget);
429
534
  blurShader.uniforms.tDiffuse.value = blur1TextureTarget.texture;
@@ -485,7 +590,7 @@ export default function glow_pass(renderer: WebGLRenderer, camera: Camera, objec
485
590
 
486
591
  // 还原帧缓冲区 减去原始纹理保留描边
487
592
  renderer.setRenderTarget(originRenderTarget);
488
- filterSelectShader.uniforms.selectTexture.value = selectTextureTarget.texture;
593
+ filterSelectShader.uniforms.selectTexture.value = selectDethpTestTextureTarget.texture;
489
594
  filterSelectShader.uniforms.blurTexture.value = blur1TextureTarget.texture;
490
595
  filterSelectShader.uniforms.opacity.value = glow_opacity;
491
596
  filterSelectShader.blending = NormalBlending; // 与有的纹理融合计算 保留前面通道传递下来的纹理
@@ -1,2 +1,2 @@
1
- import { Camera, Object3D, WebGLRenderer } from "three";
2
- export default function stroke_pass(renderer: WebGLRenderer, camera: Camera, object3d: Object3D): void;
1
+ import { Camera, Object3D, WebGLRenderer, DepthTexture } from "three";
2
+ export default function stroke_pass(renderer: WebGLRenderer, camera: Camera, object3d: Object3D, baseDepthTexture: DepthTexture): void;
@@ -4,10 +4,31 @@
4
4
  * @Last Modified by: xiaosihan
5
5
  * @Last Modified time: 2023-05-09 02:33:28
6
6
  */
7
- import { LinearFilter, RGBAFormat, Vector2, WebGLRenderTarget, ShaderMaterial, NoBlending, Scene, RawShaderMaterial, Color, NormalBlending, ShaderChunk } from "three";
7
+ import { LinearFilter, RGBAFormat, Vector2, WebGLRenderTarget, ShaderMaterial, NoBlending, Scene, RawShaderMaterial, Color, NormalBlending, ShaderChunk, DepthTexture, DepthFormat, UnsignedShortType } from "three";
8
8
  import FullScreenQuad from "./FullScreenQuad";
9
+ // 选中对象的深度纹理
10
+ const selectDepthTexture = (() => {
11
+ const baseDepthTexture = new DepthTexture(4096, 4096);
12
+ baseDepthTexture.format = DepthFormat;
13
+ baseDepthTexture.type = UnsignedShortType;
14
+ baseDepthTexture.anisotropy = 16;
15
+ return baseDepthTexture;
16
+ })();
9
17
  // 选中对象的纹理
10
- const selectTextureTarget = new WebGLRenderTarget(512, 512, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
18
+ const selectTextureTarget = new WebGLRenderTarget(512, 512, {
19
+ minFilter: LinearFilter,
20
+ magFilter: LinearFilter,
21
+ format: RGBAFormat,
22
+ depthTexture: selectDepthTexture,
23
+ anisotropy: 16,
24
+ });
25
+ // 深度测试后的选中纹理
26
+ const selectDethpTestTextureTarget = new WebGLRenderTarget(512, 512, {
27
+ minFilter: LinearFilter,
28
+ magFilter: LinearFilter,
29
+ format: RGBAFormat,
30
+ anisotropy: 16,
31
+ });
11
32
  // 由于不能同时读写自己的纹理
12
33
  const blur1TextureTarget = new WebGLRenderTarget(512, 512, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
13
34
  // 所以需要用2个模糊纹理相互读写
@@ -15,6 +36,44 @@ const blur2TextureTarget = new WebGLRenderTarget(512, 512, { minFilter: LinearFi
15
36
  const size = new Vector2();
16
37
  // 创建一个渲染工具 用于处理纹理
17
38
  const fsQuad = new FullScreenQuad(); // 渲染辅助器
39
+ //深度比对纹理
40
+ const depthTestShader = new ShaderMaterial({
41
+ uniforms: {
42
+ map: { value: null },
43
+ baseDepth: { value: null },
44
+ selectDepth: { value: null }, // 选中的对象深度纹理
45
+ },
46
+ vertexShader: `
47
+ ${ShaderChunk.common}
48
+ ${ShaderChunk.logdepthbuf_pars_vertex}
49
+ varying vec2 vUv;
50
+ void main() {
51
+ vUv = uv;
52
+ // gl_Position = vec4(position, 1.0);
53
+ // gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
54
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
55
+ ${ShaderChunk.logdepthbuf_vertex}
56
+ }
57
+ `,
58
+ fragmentShader: `
59
+ ${ShaderChunk.logdepthbuf_pars_fragment}
60
+ uniform sampler2D map;
61
+ uniform sampler2D baseDepth;
62
+ uniform sampler2D selectDepth;
63
+ varying vec2 vUv;
64
+ void main() {
65
+ if(texture2D(baseDepth, vUv).r < texture2D(selectDepth, vUv).r){
66
+ discard;
67
+ }
68
+ gl_FragColor = texture2D(map, vUv);
69
+ ${ShaderChunk.logdepthbuf_fragment}
70
+ }
71
+ `,
72
+ blending: NoBlending,
73
+ depthTest: true,
74
+ depthWrite: true,
75
+ transparent: true
76
+ });
18
77
  // 抗锯齿着色器
19
78
  const FXAAShaderMaterial = new ShaderMaterial({
20
79
  uniforms: {
@@ -371,10 +430,39 @@ const filterSelectShader = new RawShaderMaterial({
371
430
  depthWrite: false,
372
431
  transparent: true
373
432
  });
433
+ const copyShader = new ShaderMaterial({
434
+ uniforms: {
435
+ map: { value: null }, // 贴图纹理
436
+ },
437
+ vertexShader: `
438
+ ${ShaderChunk.common}
439
+ ${ShaderChunk.logdepthbuf_pars_vertex}
440
+ varying vec2 vUv;
441
+ void main() {
442
+ vUv = uv;
443
+ // gl_Position = vec4(position, 1.0);
444
+ // gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
445
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
446
+ ${ShaderChunk.logdepthbuf_vertex}
447
+ }
448
+ `,
449
+ fragmentShader: `
450
+ ${ShaderChunk.logdepthbuf_pars_fragment}
451
+ uniform sampler2D map;
452
+ varying vec2 vUv;
453
+ void main() {
454
+ gl_FragColor = texture2D(map, vUv);
455
+ ${ShaderChunk.logdepthbuf_fragment}
456
+ }
457
+ `,
458
+ depthTest: true,
459
+ depthWrite: true,
460
+ transparent: true
461
+ });
374
462
  // 场景对象
375
463
  const scene = new Scene();
376
464
  // 对象描边
377
- export default function stroke_pass(renderer, camera, object3d) {
465
+ export default function stroke_pass(renderer, camera, object3d, baseDepthTexture) {
378
466
  const { stroke_enable = false, stroke_color = "#04fa12", stroke_width = 1 } = object3d.userData;
379
467
  if (!stroke_enable || stroke_width === 0) {
380
468
  return;
@@ -384,6 +472,7 @@ export default function stroke_pass(renderer, camera, object3d) {
384
472
  // 设置选中目标的帧缓冲区
385
473
  renderer.getSize(size);
386
474
  selectTextureTarget.setSize(size.x, size.y);
475
+ selectDethpTestTextureTarget.setSize(size.x, size.y);
387
476
  blur1TextureTarget.setSize(size.x, size.y);
388
477
  blur2TextureTarget.setSize(size.x, size.y);
389
478
  renderer.setRenderTarget(selectTextureTarget);
@@ -397,9 +486,16 @@ export default function stroke_pass(renderer, camera, object3d) {
397
486
  //描边颜色
398
487
  blurShader.uniforms.color.value.set(stroke_color);
399
488
  blurShader.uniforms.width.value = stroke_width / 4;
489
+ //深度测试
490
+ renderer.setRenderTarget(selectDethpTestTextureTarget);
491
+ renderer.clear();
492
+ depthTestShader.uniforms.map.value = selectTextureTarget.texture;
493
+ depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
494
+ depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
495
+ fsQuad.render(renderer, depthTestShader);
400
496
  //一次描边
401
497
  renderer.setRenderTarget(blur1TextureTarget);
402
- blurShader.uniforms.tDiffuse.value = selectTextureTarget.texture;
498
+ blurShader.uniforms.tDiffuse.value = selectDethpTestTextureTarget.texture;
403
499
  fsQuad.render(renderer, blurShader);
404
500
  //二次描边
405
501
  renderer.setRenderTarget(blur2TextureTarget);
@@ -419,7 +515,7 @@ export default function stroke_pass(renderer, camera, object3d) {
419
515
  fsQuad.render(renderer, FXAAShaderMaterial);
420
516
  // 还原帧缓冲区 减去原始纹理保留描边
421
517
  renderer.setRenderTarget(originRenderTarget);
422
- filterSelectShader.uniforms.selectTexture.value = selectTextureTarget.texture;
518
+ filterSelectShader.uniforms.selectTexture.value = selectDethpTestTextureTarget.texture;
423
519
  filterSelectShader.uniforms.blurTexture.value = blur1TextureTarget.texture;
424
520
  filterSelectShader.blending = NormalBlending; // 与有的纹理融合计算 保留前面通道传递下来的纹理
425
521
  fsQuad.render(renderer, filterSelectShader);
@@ -5,11 +5,35 @@
5
5
  * @Last Modified time: 2023-05-09 02:33:28
6
6
  */
7
7
 
8
- import { Camera, LinearFilter, Object3D, RGBAFormat, Vector2, WebGLRenderTarget, WebGLRenderer, ShaderMaterial, NoBlending, Scene, RawShaderMaterial, Color, NormalBlending, ShaderChunk } from "three";
8
+ import { Camera, LinearFilter, Object3D, RGBAFormat, Vector2, WebGLRenderTarget, WebGLRenderer, ShaderMaterial, NoBlending, Scene, RawShaderMaterial, Color, NormalBlending, ShaderChunk, DepthTexture, DepthFormat, UnsignedShortType } from "three";
9
9
  import FullScreenQuad from "./FullScreenQuad";
10
10
 
11
+
12
+ // 选中对象的深度纹理
13
+ const selectDepthTexture = (() => {
14
+ const baseDepthTexture = new DepthTexture(4096, 4096);
15
+ baseDepthTexture.format = DepthFormat;
16
+ baseDepthTexture.type = UnsignedShortType;
17
+ baseDepthTexture.anisotropy = 16;
18
+ return baseDepthTexture;
19
+ })();
20
+
11
21
  // 选中对象的纹理
12
- const selectTextureTarget = new WebGLRenderTarget(512, 512, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
22
+ const selectTextureTarget = new WebGLRenderTarget(512, 512, {
23
+ minFilter: LinearFilter,
24
+ magFilter: LinearFilter,
25
+ format: RGBAFormat,
26
+ depthTexture: selectDepthTexture,
27
+ anisotropy: 16,
28
+ });
29
+
30
+ // 深度测试后的选中纹理
31
+ const selectDethpTestTextureTarget = new WebGLRenderTarget(512, 512, {
32
+ minFilter: LinearFilter,
33
+ magFilter: LinearFilter,
34
+ format: RGBAFormat,
35
+ anisotropy: 16,
36
+ });
13
37
 
14
38
  // 由于不能同时读写自己的纹理
15
39
  const blur1TextureTarget = new WebGLRenderTarget(512, 512, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
@@ -22,6 +46,45 @@ const size = new Vector2();
22
46
  // 创建一个渲染工具 用于处理纹理
23
47
  const fsQuad = new FullScreenQuad(); // 渲染辅助器
24
48
 
49
+ //深度比对纹理
50
+ const depthTestShader = new ShaderMaterial({
51
+ uniforms: {
52
+ map: { value: null }, // 贴图纹理
53
+ baseDepth: { value: null }, // 整个场景的深度纹理
54
+ selectDepth: { value: null }, // 选中的对象深度纹理
55
+ },
56
+ vertexShader: `
57
+ ${ShaderChunk.common}
58
+ ${ShaderChunk.logdepthbuf_pars_vertex}
59
+ varying vec2 vUv;
60
+ void main() {
61
+ vUv = uv;
62
+ // gl_Position = vec4(position, 1.0);
63
+ // gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
64
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
65
+ ${ShaderChunk.logdepthbuf_vertex}
66
+ }
67
+ `,
68
+ fragmentShader: `
69
+ ${ShaderChunk.logdepthbuf_pars_fragment}
70
+ uniform sampler2D map;
71
+ uniform sampler2D baseDepth;
72
+ uniform sampler2D selectDepth;
73
+ varying vec2 vUv;
74
+ void main() {
75
+ if(texture2D(baseDepth, vUv).r < texture2D(selectDepth, vUv).r){
76
+ discard;
77
+ }
78
+ gl_FragColor = texture2D(map, vUv);
79
+ ${ShaderChunk.logdepthbuf_fragment}
80
+ }
81
+ `,
82
+ blending: NoBlending, // 渲染时不与背景融合计算 直接替换
83
+ depthTest: true,
84
+ depthWrite: true,
85
+ transparent: true
86
+ });
87
+
25
88
  // 抗锯齿着色器
26
89
  const FXAAShaderMaterial = new ShaderMaterial({
27
90
  uniforms: {
@@ -381,11 +444,41 @@ const filterSelectShader = new RawShaderMaterial({
381
444
  transparent: true
382
445
  });
383
446
 
447
+ const copyShader = new ShaderMaterial({
448
+ uniforms: {
449
+ map: { value: null }, // 贴图纹理
450
+ },
451
+ vertexShader: `
452
+ ${ShaderChunk.common}
453
+ ${ShaderChunk.logdepthbuf_pars_vertex}
454
+ varying vec2 vUv;
455
+ void main() {
456
+ vUv = uv;
457
+ // gl_Position = vec4(position, 1.0);
458
+ // gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
459
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
460
+ ${ShaderChunk.logdepthbuf_vertex}
461
+ }
462
+ `,
463
+ fragmentShader: `
464
+ ${ShaderChunk.logdepthbuf_pars_fragment}
465
+ uniform sampler2D map;
466
+ varying vec2 vUv;
467
+ void main() {
468
+ gl_FragColor = texture2D(map, vUv);
469
+ ${ShaderChunk.logdepthbuf_fragment}
470
+ }
471
+ `,
472
+ depthTest: true,
473
+ depthWrite: true,
474
+ transparent: true
475
+ });
476
+
384
477
  // 场景对象
385
478
  const scene = new Scene();
386
479
 
387
480
  // 对象描边
388
- export default function stroke_pass(renderer: WebGLRenderer, camera: Camera, object3d: Object3D) {
481
+ export default function stroke_pass(renderer: WebGLRenderer, camera: Camera, object3d: Object3D, baseDepthTexture: DepthTexture) {
389
482
 
390
483
  const { stroke_enable = false, stroke_color = "#04fa12", stroke_width = 1 } = object3d.userData;
391
484
  if (!stroke_enable || stroke_width === 0) {
@@ -398,6 +491,7 @@ export default function stroke_pass(renderer: WebGLRenderer, camera: Camera, obj
398
491
  // 设置选中目标的帧缓冲区
399
492
  renderer.getSize(size);
400
493
  selectTextureTarget.setSize(size.x, size.y);
494
+ selectDethpTestTextureTarget.setSize(size.x, size.y);
401
495
  blur1TextureTarget.setSize(size.x, size.y);
402
496
  blur2TextureTarget.setSize(size.x, size.y);
403
497
  renderer.setRenderTarget(selectTextureTarget);
@@ -413,9 +507,19 @@ export default function stroke_pass(renderer: WebGLRenderer, camera: Camera, obj
413
507
  blurShader.uniforms.color.value.set(stroke_color);
414
508
  blurShader.uniforms.width.value = stroke_width / 4;
415
509
 
510
+
511
+ //深度测试
512
+ renderer.setRenderTarget(selectDethpTestTextureTarget);
513
+ renderer.clear();
514
+ depthTestShader.uniforms.map.value = selectTextureTarget.texture;
515
+ depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
516
+ depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
517
+ fsQuad.render(renderer, depthTestShader);
518
+
519
+
416
520
  //一次描边
417
521
  renderer.setRenderTarget(blur1TextureTarget);
418
- blurShader.uniforms.tDiffuse.value = selectTextureTarget.texture;
522
+ blurShader.uniforms.tDiffuse.value = selectDethpTestTextureTarget.texture;
419
523
  fsQuad.render(renderer, blurShader);
420
524
 
421
525
  //二次描边
@@ -440,7 +544,7 @@ export default function stroke_pass(renderer: WebGLRenderer, camera: Camera, obj
440
544
 
441
545
  // 还原帧缓冲区 减去原始纹理保留描边
442
546
  renderer.setRenderTarget(originRenderTarget);
443
- filterSelectShader.uniforms.selectTexture.value = selectTextureTarget.texture;
547
+ filterSelectShader.uniforms.selectTexture.value = selectDethpTestTextureTarget.texture;
444
548
  filterSelectShader.uniforms.blurTexture.value = blur1TextureTarget.texture;
445
549
  filterSelectShader.blending = NormalBlending; // 与有的纹理融合计算 保留前面通道传递下来的纹理
446
550
  fsQuad.render(renderer, filterSelectShader);