Three.js Logo 着色器

🎯 提示词

PROMPT
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 由多个镂空三角形组成。

JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 边缘发光

为什么需要这个技术:边缘发亮创造玻璃质感。

GLSL
1
2
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 整体有呼吸般的明暗变化。

GLSL
1
2
float pulse = (sin(time * 2.0) + 1.0) * 0.15 + 0.85;
gl_FragColor = vec4(glowColor * pulse, 1.0);

4. 噪声颜色动画

为什么需要这个技术:三个方向的正弦波叠加创造流动色彩。

GLSL
1
2
3
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 编辑整理,如需转载,请注明出处。