Three.js 边缘模糊效果

提示词

PROMPT
1
使用 Three.js 创建边缘模糊效果,使用自定义着色器实现图像边缘的渐变透明效果。

效果描述

这是一个展示如何创建边缘模糊效果的示例,使用自定义着色器实现图像边缘的渐变透明效果。

效果特性

  • 边缘模糊:实现边缘模糊效果
  • 自定义着色器:使用自定义着色器
  • 渐变透明:边缘渐变透明
  • 九宫格处理:九宫格边缘处理
  • 透明度控制:控制透明度
  • 边缘参数:可调边缘参数

核心参数

参数 说明
边缘宽度 0.1 边缘宽度
透明度 1.0 透明度
纹理 可变 输入纹理

核心代码解析

顶点着色器

GLSL
1
2
3
4
5
6
7
8
9
10
11
precision highp float;
precision highp int;
uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
attribute vec3 position;
attribute vec2 uv;
varying vec2 vUv;
void main() {
    vUv = uv;
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}

片段着色器

GLSL
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
42
43
44
45
46
47
48
49
50
precision highp float;
precision highp int;

uniform float edge;
uniform float opacity;
uniform sampler2D map;
varying vec2 vUv;

void main(){
    float edgeMin = edge;
    float edgeMax = 1.0 - edge;

    gl_FragColor = texture2D(map, vUv);

    if(vUv.x < edgeMin){
        if(vUv.y < edgeMin){
            gl_FragColor.a = (min(vUv.x / edgeMin, vUv.y / edgeMin)) * opacity;
        }
        else if(vUv.y >= edgeMin && vUv.y <= edgeMax){
            gl_FragColor.a = (vUv.x / edgeMin) * opacity;
        }
        else if(vUv.y > edgeMax){
            gl_FragColor.a = (min(vUv.x / edgeMin, 1.0 - ((vUv.y - edgeMax) / edgeMin))) * opacity;
        }
    }
    else if(vUv.x >= edgeMin && vUv.x <= edgeMax){
        if(vUv.y < edgeMin){
            gl_FragColor.a = (vUv.y / edgeMin) * opacity;
        }
        else if(vUv.y >= edgeMin && vUv.y <= edgeMax){
            gl_FragColor.a = 1.0 * opacity;
        }
        else if(vUv.y > edgeMax){
            gl_FragColor.a = (1.0 - ((vUv.y - edgeMax) / edgeMin)) * opacity;
        }
    }
    else if(vUv.x > edgeMax){
        float xNormal = 1.0 - ((vUv.x - edgeMax) / edgeMin);
        
        if(vUv.y < edgeMin){
            gl_FragColor.a = (min(vUv.y / edgeMin, xNormal)) * opacity;
        }
        else if(vUv.y >= edgeMin && vUv.y <= edgeMax){
            gl_FragColor.a = (xNormal) * opacity;
        }
        else if(vUv.y > edgeMax){
            gl_FragColor.a = (min(xNormal, 1.0 - ((vUv.y - edgeMax) / edgeMin))) * opacity;
        }
    }
}

创建材质

JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
const material = new THREE.RawShaderMaterial({
    uniforms: UniformsUtils.clone({
        map: { type: "t", value: null },
        edge: { type: "float", value: 0.1 },
        opacity: { type: "float", value: 1 },
    }),
    transparent: true,
    opacity: 1,
    alphaTest: 1,
    depthTest: true,
    vertexShader: vertexShader,
    fragmentShader: fragmentShader,
});

技术亮点

  1. 边缘模糊:实现边缘模糊效果
  2. 自定义着色器:使用自定义着色器
  3. 渐变透明:边缘渐变透明
  4. 九宫格处理:九宫格边缘处理
  5. 透明度控制:控制透明度

调试技巧

  1. 边缘宽度:调整边缘宽度改变模糊范围
  2. 透明度:调整透明度改变显示效果
  3. 纹理参数:调整纹理参数改变显示
  4. 九宫格参数:调整九宫格参数改变边缘效果
  5. 颜色参数:调整颜色参数改变显示

扩展方向

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

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