Three.js Logo 着色器
🎯 提示词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
使用 Three.js 实现 Three.js Logo 造型着色器,具体要求:
**核心特效**
- Three.js 官方 Logo 几何形状
- Fresnel 边缘发光
- 噪声颜色动画
- 脉冲呼吸效果
**场景与光照**
- 黑色背景 + 雾效
- 自定义颜色调色板
- 挤出几何体
**交互与控制**
- OrbitControls 阻尼旋转
- GUI 颜色控制面板
**技术要求**
- Three.js 版本 (ES Module)
- ExtrudeGeometry 挤出
- Shape + Path 复杂轮廓
- ShaderMaterial 自定义
📖 效果拆解
| 层次 |
视觉效果 |
技术实现 |
| 基础 |
镂空三角形 Logo |
Shape + holes |
| 核心特效 |
Fresnel 发光 |
pow(1.0 - dot(normal, view)) |
| 动画 |
颜色 + 脉冲 |
sin/cos 组合 |
| 控制 |
GUI 调色 |
三色独立可调 |
🔧 核心技术点
1. Logo 几何构造
为什么需要这个技术:Three.js Logo 由多个镂空三角形组成。
function createThreeJSLogoGeometry() {
const tri = [v.clone(), v.clone().rotateAround(c, (-Math.PI * 2) / 3), ...];
const holes = [];
for (let row = 0; row < 4; row++) {
const items = 1 + row * 2;
for (let i = 0; i < items; i++) {
const offsetX = w + hA * i;
const pts = (i % 2 ? triFlip : tri).map(p => p.clone().add(...));
holes.push(new THREE.Path(pts));
}
}
const shape = new THREE.Shape(contour);
shape.holes = holes;
return new THREE.ExtrudeGeometry(shape, { depth: 0.1, bevelEnabled: false });
}
2. Fresnel 边缘发光
为什么需要这个技术:边缘发亮创造玻璃质感。
float fresnel = pow(1.0 - abs(dot(vNormal, vec3(0.0, 0.0, 1.0))), 2.0);
vec3 glowColor = mix(baseColor, color3, fresnel);
3. 脉冲动画
为什么需要这个技术:Logo 整体有呼吸般的明暗变化。
float pulse = (sin(time * 2.0) + 1.0) * 0.15 + 0.85;
gl_FragColor = vec4(glowColor * pulse, 1.0);
4. 噪声颜色动画
为什么需要这个技术:三个方向的正弦波叠加创造流动色彩。
float noise = sin(vPosition.x * 2.0 + time) * 0.25
+ cos(vPosition.y * 2.0 + time * 0.5) * 0.25
+ sin(vPosition.z * 2.0 + time * 0.8) * 0.5;
vec3 baseColor = mix(color1, color2, noise + 0.5);
💡 调试与优化
| 问题类型 |
表现形式 |
解决方案 |
| 几何变形 |
拉伸扭曲 |
调整 extrude depth |
| 镂空消失 |
洞不见了 |
检查 Path 方向一致性 |
| 动画卡顿 |
不流畅 |
降低 time 增量 |
🚀 扩展思路
| 变体效果 |
核心改动 |
难度 |
| 彩虹渐变 |
HSV 颜色循环 |
⭐ |
| 金属质感 |
添加高光 |
⭐ |
| 粒子环绕 |
添加 Points |
⭐⭐ |
| 文字变形 |
TextGeometry |
⭐⭐ |
| 3D 悬浮 |
添加阴影 |
⭐⭐⭐ |
本文档由 ThreeLab 编辑整理,如需转载,请注明出处。
💬 评论区
评论功能即将上线,敬请期待!