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.
- 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 +44 -6
- package/ThreeBase.ts +51 -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/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, 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.
|
|
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.
|
|
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);
|