three-base 2.0.13 → 2.0.15
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/PlaneModal1/PlaneModal1.d.ts +2 -2
- package/PlaneModal1/PlaneModal1.js +2 -2
- package/PlaneModal1/PlaneModal1.ts +2 -2
- package/PointLight/PointLight.js +2 -1
- package/PointLight/PointLight.ts +2 -1
- package/SpriteText.js +1 -0
- package/SpriteText.ts +1 -0
- package/SpriteText2.js +1 -0
- package/SpriteText2.ts +1 -0
- package/ThreeBase.d.ts +6 -3
- package/ThreeBase.js +46 -6
- package/ThreeBase.ts +53 -7
- package/package.json +2 -2
- package/pass/glow_pass.d.ts +2 -2
- package/pass/glow_pass.js +101 -5
- package/pass/glow_pass.ts +110 -5
- package/pass/stroke_pass.d.ts +2 -2
- package/pass/stroke_pass.js +101 -5
- package/pass/stroke_pass.ts +109 -5
- package/tsconfig.json +0 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Mesh, MeshBasicMaterial, PlaneGeometry } from "three";
|
|
2
2
|
export type PlaneModal1Config = {
|
|
3
3
|
size?: number;
|
|
4
4
|
title?: string;
|
|
@@ -16,7 +16,7 @@ export default class PlaneModal1 extends Mesh {
|
|
|
16
16
|
static img: HTMLImageElement;
|
|
17
17
|
canvas: HTMLCanvasElement;
|
|
18
18
|
context: CanvasRenderingContext2D;
|
|
19
|
-
texture: CanvasTexture | import("three").Texture;
|
|
19
|
+
texture: import("three").CanvasTexture | import("three").Texture;
|
|
20
20
|
_config: {
|
|
21
21
|
size: number;
|
|
22
22
|
title: string;
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* @Last Modified by: xiaosihan
|
|
5
5
|
* @Last Modified time: 2023-03-09 19:15:35
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
8
|
-
import planeModalPNG from "./planeModal.png";
|
|
7
|
+
import { DoubleSide, Mesh, MeshBasicMaterial, PlaneGeometry, Vector2 } from "three";
|
|
9
8
|
import threeLoader from "../threeLoader";
|
|
9
|
+
import planeModalPNG from "./planeModal.png";
|
|
10
10
|
// 平面模型弹窗
|
|
11
11
|
export default class PlaneModal1 extends Mesh {
|
|
12
12
|
constructor(config = {}) {
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* @Last Modified time: 2023-03-09 19:15:35
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
9
|
-
import planeModalPNG from "./planeModal.png";
|
|
8
|
+
import { DoubleSide, Mesh, MeshBasicMaterial, PlaneGeometry, Vector2 } from "three";
|
|
10
9
|
import threeLoader from "../threeLoader";
|
|
10
|
+
import planeModalPNG from "./planeModal.png";
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
export type PlaneModal1Config = {
|
package/PointLight/PointLight.js
CHANGED
|
@@ -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);
|
package/PointLight/PointLight.ts
CHANGED
|
@@ -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
|
-
|
|
8
|
-
|
|
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, 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,31 @@ 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
|
+
// TODO 渲染目标的颜色空间问题 还没有处理好
|
|
33
|
+
// 基础纹理渲染对象
|
|
34
|
+
baseRenderTarget = new WebGLRenderTarget(128, 128, {
|
|
35
|
+
minFilter: LinearFilter,
|
|
36
|
+
magFilter: LinearFilter,
|
|
37
|
+
format: RGBAFormat,
|
|
38
|
+
stencilBuffer: false,
|
|
39
|
+
depthTexture: this.baseDepthTexture,
|
|
40
|
+
anisotropy: 16,
|
|
41
|
+
colorSpace: SRGBColorSpace,
|
|
42
|
+
// | typeof NoColorSpace
|
|
43
|
+
// | typeof SRGBColorSpace
|
|
44
|
+
// | typeof LinearSRGBColorSpace
|
|
45
|
+
// | typeof DisplayP3ColorSpace;
|
|
46
|
+
// encoding: sRGBEncoding
|
|
47
|
+
// LinearEncoding | typeof sRGBEncoding;
|
|
48
|
+
});
|
|
24
49
|
// 公用渲染目标1
|
|
25
50
|
renderTarget = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
26
51
|
// 渲染目标2
|
|
@@ -100,10 +125,11 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
100
125
|
}
|
|
101
126
|
this.renderer.setPixelRatio(window.devicePixelRatio);
|
|
102
127
|
this.renderer.setSize(width, height);
|
|
128
|
+
this.baseRenderTarget.setSize(width, height);
|
|
103
129
|
this.size.set(width, height);
|
|
104
130
|
// 渲染场景
|
|
105
|
-
this.renderer.clear();
|
|
106
|
-
this.renderer.render(this.scene, this.camera);
|
|
131
|
+
// this.renderer.clear();
|
|
132
|
+
// this.renderer.render(this.scene, this.camera);
|
|
107
133
|
}
|
|
108
134
|
// 控制器的位置缓动的计算的顶点对象
|
|
109
135
|
controlsPosition = (() => {
|
|
@@ -261,14 +287,20 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
261
287
|
if (this.controls.enabled) {
|
|
262
288
|
this.controls.update();
|
|
263
289
|
}
|
|
264
|
-
this.renderer.clear();
|
|
265
290
|
// 渲染场景
|
|
266
291
|
this.dispatchEvent({ type: "beforeRender" });
|
|
292
|
+
//TODO 渲染了2次, 还有优化空间
|
|
293
|
+
this.renderer.setRenderTarget(this.baseRenderTarget);
|
|
294
|
+
this.renderer.clear();
|
|
267
295
|
this.renderer.render(this.scene, this.camera);
|
|
296
|
+
this.renderer.setRenderTarget(null);
|
|
297
|
+
this.renderer.clear();
|
|
298
|
+
this.renderRendererTarget(this.baseRenderTarget);
|
|
299
|
+
// this.renderer.render(this.scene, this.camera);
|
|
268
300
|
// 查找需要绘制描边的对象,并且绘制描边
|
|
269
301
|
this.scene.traverse(obj => {
|
|
270
|
-
stroke_pass(this.renderer, this.camera, obj);
|
|
271
|
-
glow_pass(this.renderer, this.camera, obj);
|
|
302
|
+
stroke_pass(this.renderer, this.camera, obj, this.baseDepthTexture);
|
|
303
|
+
glow_pass(this.renderer, this.camera, obj, this.baseDepthTexture);
|
|
272
304
|
});
|
|
273
305
|
this.dispatchEvent({ type: "afterRender" });
|
|
274
306
|
}
|
|
@@ -401,4 +433,12 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
401
433
|
coptyShader.blending = alpha ? NoBlending : NormalBlending;
|
|
402
434
|
fullScreenMesh.render(this.renderer);
|
|
403
435
|
}
|
|
436
|
+
// 渲染纹理
|
|
437
|
+
renderTexture(texture, alpha = false) {
|
|
438
|
+
coptyShader.uniforms.map.value = texture;
|
|
439
|
+
coptyShader.uniforms.opacity.value = 1.0;
|
|
440
|
+
fullScreenMesh.material = coptyShader;
|
|
441
|
+
coptyShader.blending = alpha ? NoBlending : NormalBlending;
|
|
442
|
+
fullScreenMesh.render(this.renderer);
|
|
443
|
+
}
|
|
404
444
|
}
|
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,33 @@ 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
|
+
// TODO 渲染目标的颜色空间问题 还没有处理好
|
|
38
|
+
// 基础纹理渲染对象
|
|
39
|
+
baseRenderTarget = new WebGLRenderTarget(128, 128, {
|
|
40
|
+
minFilter: LinearFilter,
|
|
41
|
+
magFilter: LinearFilter,
|
|
42
|
+
format: RGBAFormat,
|
|
43
|
+
stencilBuffer: false,
|
|
44
|
+
depthTexture: this.baseDepthTexture,
|
|
45
|
+
anisotropy: 16,
|
|
46
|
+
colorSpace: SRGBColorSpace,
|
|
47
|
+
// | typeof NoColorSpace
|
|
48
|
+
// | typeof SRGBColorSpace
|
|
49
|
+
// | typeof LinearSRGBColorSpace
|
|
50
|
+
// | typeof DisplayP3ColorSpace;
|
|
51
|
+
// encoding: sRGBEncoding
|
|
52
|
+
// LinearEncoding | typeof sRGBEncoding;
|
|
53
|
+
});
|
|
54
|
+
|
|
28
55
|
// 公用渲染目标1
|
|
29
56
|
renderTarget = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
30
57
|
|
|
@@ -121,10 +148,13 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
121
148
|
|
|
122
149
|
this.renderer.setPixelRatio(window.devicePixelRatio);
|
|
123
150
|
this.renderer.setSize(width, height);
|
|
151
|
+
|
|
152
|
+
this.baseRenderTarget.setSize(width, height);
|
|
153
|
+
|
|
124
154
|
this.size.set(width, height);
|
|
125
155
|
// 渲染场景
|
|
126
|
-
this.renderer.clear();
|
|
127
|
-
this.renderer.render(this.scene, this.camera);
|
|
156
|
+
// this.renderer.clear();
|
|
157
|
+
// this.renderer.render(this.scene, this.camera);
|
|
128
158
|
}
|
|
129
159
|
|
|
130
160
|
// 控制器的位置缓动的计算的顶点对象
|
|
@@ -314,16 +344,23 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
314
344
|
this.controls.update();
|
|
315
345
|
}
|
|
316
346
|
|
|
317
|
-
this.renderer.clear();
|
|
318
|
-
|
|
319
347
|
// 渲染场景
|
|
320
348
|
this.dispatchEvent({ type: "beforeRender" });
|
|
349
|
+
|
|
350
|
+
//TODO 渲染了2次, 还有优化空间
|
|
351
|
+
this.renderer.setRenderTarget(this.baseRenderTarget);
|
|
352
|
+
this.renderer.clear();
|
|
321
353
|
this.renderer.render(this.scene, this.camera);
|
|
322
354
|
|
|
355
|
+
this.renderer.setRenderTarget(null);
|
|
356
|
+
this.renderer.clear();
|
|
357
|
+
this.renderRendererTarget(this.baseRenderTarget);
|
|
358
|
+
// this.renderer.render(this.scene, this.camera);
|
|
359
|
+
|
|
323
360
|
// 查找需要绘制描边的对象,并且绘制描边
|
|
324
361
|
this.scene.traverse(obj => {
|
|
325
|
-
stroke_pass(this.renderer, this.camera, obj);
|
|
326
|
-
glow_pass(this.renderer, this.camera, obj);
|
|
362
|
+
stroke_pass(this.renderer, this.camera, obj, this.baseDepthTexture);
|
|
363
|
+
glow_pass(this.renderer, this.camera, obj, this.baseDepthTexture);
|
|
327
364
|
});
|
|
328
365
|
|
|
329
366
|
this.dispatchEvent({ type: "afterRender" });
|
|
@@ -482,4 +519,13 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
482
519
|
fullScreenMesh.render(this.renderer);
|
|
483
520
|
}
|
|
484
521
|
|
|
522
|
+
// 渲染纹理
|
|
523
|
+
renderTexture(texture: Texture, alpha: boolean = false) {
|
|
524
|
+
coptyShader.uniforms.map.value = texture;
|
|
525
|
+
coptyShader.uniforms.opacity.value = 1.0;
|
|
526
|
+
fullScreenMesh.material = coptyShader;
|
|
527
|
+
coptyShader.blending = alpha ? NoBlending : NormalBlending;
|
|
528
|
+
fullScreenMesh.render(this.renderer);
|
|
529
|
+
}
|
|
530
|
+
|
|
485
531
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "three-base",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.15",
|
|
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.
|
|
38
|
+
"three": "^0.154.0",
|
|
39
39
|
"dexie": "^3",
|
|
40
40
|
"vite": "*",
|
|
41
41
|
"html2canvas": "^1.4.1"
|
package/pass/glow_pass.d.ts
CHANGED
|
@@ -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, {
|
|
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 =
|
|
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 =
|
|
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, {
|
|
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 =
|
|
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 =
|
|
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; // 与有的纹理融合计算 保留前面通道传递下来的纹理
|
package/pass/stroke_pass.d.ts
CHANGED
|
@@ -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;
|
package/pass/stroke_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, {
|
|
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 =
|
|
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 =
|
|
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);
|
package/pass/stroke_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, {
|
|
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 =
|
|
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 =
|
|
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);
|
package/tsconfig.json
CHANGED
|
@@ -10,9 +10,6 @@
|
|
|
10
10
|
"vite/client",
|
|
11
11
|
"node"
|
|
12
12
|
],
|
|
13
|
-
"typeRoots": [
|
|
14
|
-
"./",
|
|
15
|
-
],
|
|
16
13
|
"sourceMap": false,
|
|
17
14
|
"declaration": true,
|
|
18
15
|
"declarationDir": "./",
|
|
@@ -28,7 +25,6 @@
|
|
|
28
25
|
"isolatedModules": false,
|
|
29
26
|
"noEmit": false,
|
|
30
27
|
"noImplicitAny": false,
|
|
31
|
-
"locale": "zh-cn",
|
|
32
28
|
},
|
|
33
29
|
"include": [
|
|
34
30
|
"./",
|