🎯 提示词
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 控制面板 |
| 响应式 | 自适应图片比例 | 根据纹理尺寸调整平面缩放 |
---
通过量化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 的完整回调机制处理加载状态。
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. 自适应图片比例
在着色器编译前根据纹理尺寸调整平面比例。
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 编辑整理,如需转载,请注明出处。
💬 评论区
评论功能即将上线,敬请期待!