Three.js 自定义遮罩通道

提示词

PROMPT
1
使用 Three.js 创建自定义遮罩通道,使用 ShaderPass 实现屏幕遮罩效果。

效果描述

这是一个展示如何创建自定义遮罩通道的示例,使用 ShaderPass 实现屏幕遮罩效果。

效果特性

  • 自定义遮罩:创建自定义遮罩
  • ShaderPass:使用 ShaderPass
  • 径向渐变:径向渐变遮罩
  • 遮罩颜色:可调遮罩颜色
  • 遮罩强度:可调遮罩强度
  • 后处理:使用 EffectComposer

核心参数

参数 说明
遮罩半径 0.1 遮罩半径
遮罩强度 2.0 遮罩强度
遮罩颜色 (1, 1, 1) 遮罩颜色
遮罩开始 1.2 遮罩开始
透明度 1.0 透明度

核心代码解析

创建自定义遮罩通道

JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class ScreenMaskPass extends ShaderPass {
    constructor() {
        super({
            name: "ScreenMaskShader",

            uniforms: {
                tDiffuse: { value: null },
                opacity: { value: 1.0 },
                intensity: { value: 2.0 },
                maskColor: { value: new THREE.Color(1, 1, 1) },
                R: { value: 0.1 },
                sr: { value: 1.2 },
            },

            vertexShader: `
                varying vec2 vUv;
                void main() {
                    vUv = uv;
                    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
                }
            `,

            fragmentShader: `
                uniform float opacity;
                uniform float intensity;
                uniform sampler2D tDiffuse;
                uniform vec3 maskColor;
                uniform float R;
                uniform float sr;
                varying vec2 vUv;
                void main() {
                    vec4 texel = texture2D(tDiffuse, vUv);
                    float dist = sqrt((vUv.x-0.5)*(vUv.x-0.5)+(vUv.y-0.5)*(vUv.y-0.5));
                    float rr = (sr - smoothstep(R, R + 0.5, dist));
                    texel *= vec4(maskColor * rr * vec3(intensity,intensity,intensity), 1.0);
                    gl_FragColor = opacity * texel;
                }
            `,
        });
    }
}

创建后处理

JAVASCRIPT
1
2
3
4
5
const composer = new EffectComposer(renderer);
const renderPass = new RenderPass(scene, camera);
composer.addPass(renderPass);
const screenMaskPass = new ScreenMaskPass();
composer.addPass(screenMaskPass);

创建场景

JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
scene.add(new THREE.AxesHelper(500), new THREE.GridHelper(500, 50));

const urls = [0, 1, 2, 3, 4, 5].map(
    (k) =>
        "https://z2586300277.github.io/three-editor/dist/files/scene/skyBox0/" +
        (k + 1) +
        ".png"
);

const textureCube = new THREE.CubeTextureLoader().load(urls);
scene.background = textureCube;

技术亮点

  1. 自定义遮罩:创建自定义遮罩
  2. ShaderPass:使用 ShaderPass
  3. 径向渐变:径向渐变遮罩
  4. 遮罩颜色:可调遮罩颜色
  5. 遮罩强度:可调遮罩强度

调试技巧

  1. 遮罩半径:调整遮罩半径改变遮罩范围
  2. 遮罩强度:调整遮罩强度改变遮罩效果
  3. 遮罩颜色:调整遮罩颜色改变显示
  4. 遮罩开始:调整遮罩开始改变渐变
  5. 透明度:调整透明度改变显示

扩展方向

  1. 复杂遮罩:创建更复杂的遮罩效果
  2. 动画效果:添加动画效果
  3. 交互控制:添加交互控制
  4. 多种遮罩:支持多种遮罩
  5. 自定义遮罩:支持自定义遮罩

本文档由 ThreeLab 编辑整理,如需转载,请注明出处。