🎯 提示词

PROMPT
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
51
52
53
54
55
56
57
使用 Three.js 实现【马赛克滤镜效果】,具体要求:

【核心特效】
- UV坐标量化实现马赛克
- 可调节马赛克块大小
- 实时预览效果

【场景与光照】
- 深色背景
- 无需光源(纹理自发光)

【交互与控制】
- OrbitControls 轨道控制器
- GUI 面板调节马赛克尺寸

【技术要求】
- Three.js 最新版本
- ShaderMaterial 自定义着色器
- TextureLoader 加载图片

---

# 📖 效果拆解

| 层次 | 视觉效果 | 技术实现 |
|------|----------|----------|
| 基础 | 平面几何体 | PlaneGeometry(1, 1) |
| 核心特效 | 马赛克效果 | UV坐标量化取整 |
| 交互 | 参数调节 | lil-gui 控制面板 |
| 响应式 | 自适应图片比例 | 根据纹理尺寸调整平面缩放 |

---

# 🔧 核心技术点

## 1. **马赛克算法核心**

通过量化UV坐标实现像素化效果,将连续的UV坐标转换为离散的块状坐标。

```glsl
void main() {
    vec2 vUv2 = vUv;
    
    // X方向量化 - 将UV坐标按马赛克大小取整
    vUv2.x = floor(vUv2.x * vScreenSize.x / fMosaicScale) / 
             (vScreenSize.x / fMosaicScale) + 
             (fMosaicScale / 2.0) / vScreenSize.x;
    
    // Y方向量化
    vUv2.y = floor(vUv2.y * vScreenSize.y / fMosaicScale) / 
             (vScreenSize.y / fMosaicScale) + 
             (fMosaicScale / 2.0) / vScreenSize.y;
    
    // 从处理后的UV坐标采样纹理颜色
    vec4 color = texture2D(tDiffuse, vUv2);
    gl_FragColor = color;
}

2. 纹理加载与错误处理

使用 TextureLoader 的完整回调机制处理加载状态。

JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
textureLoader.load(
    `/files/author/AivoGenX.png`,
    (texture) => {
        uniforms.tDiffuse.value = texture;
        loadingIndicator.classList.add("hidden");
    },
    (xhr) => {
        const percent = Math.round((xhr.loaded / xhr.total) * 100);
        loadingIndicator.textContent = `加载中: ${percent}%`;
    },
    (error) => {
        console.error("图片加载错误:", error);
        loadingIndicator.textContent = "图片加载失败";
    }
);

3. 自适应图片比例

在着色器编译前根据纹理尺寸调整平面比例。

JAVASCRIPT
1
2
3
4
5
6
7
material.onBeforeCompile = (shader) => {
    if (uniforms.tDiffuse.value) {
        const aspect = uniforms.tDiffuse.value.image.width / 
                      uniforms.tDiffuse.value.image.height;
        mesh.scale.set(aspect, 1, 1);
    }
};

💡 调试与优化

问题类型 表现形式 解决方案
马赛克效果异常 图案扭曲或错位 检查 vScreenSize 是否正确更新
图片加载失败 画面黑色 检查图片路径或使用绝对URL
性能问题 大尺寸图片帧率下降 使用较小分辨率图片
马赛克边缘锯齿 块边缘不平滑 调整 fMosaicScale 为偶数或添加抗锯齿处理

🚀 扩展思路

变体效果 核心改动 难度
动态马赛克 添加时间变量控制块大小变化 ⭐⭐
不规则马赛克 使用噪声函数生成不规则块 ⭐⭐⭐
边缘保留 添加边缘检测,边缘处使用小色块 ⭐⭐⭐
像素艺术风格 添加颜色量化,减少颜色数量 ⭐⭐

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