关于 premium-3d-website
Premium 3D Website 是面向开发者的技能,适用于构建基于 WebGL 的交互式 3D 网站。内容涵盖着色器效果、后期处理、物理与运动、资源加载,以及面向移动设备等场景的性能实践。
主要功能
- 01搭建 WebGL 场景和渲染循环
- 02添加 GLSL 着色器与后期处理
- 03实现交互式物理效果和运动
- 04优化并加载 3D 资源
- 05针对设备性能调整渲染
适用场景
- 01构建以 3D 为核心的创意网站
- 02使用 Three.js 或 R3F 添加着色器与 bloom 效果
- 03制作对象的交互响应
- 04改善移动设备上的加载与性能
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill premium-3d-website安装后在 Claude Code 中输入/premium-3d-website确认已加载。
详细介绍
高端 3D 网站
概述
此技能提供架构指南和代码模式,帮助开发高端、品质卓越的 3D 网站。适用于希望实现高级 WebGL 视觉效果、自定义着色器管线、交互式物理效果和沉浸式页面过渡,同时保持高性能的开发者。
何时使用此技能
- 设计包含 3D 元素的高端或屡获殊荣的创意网站时。
- 将 Three.js、React Three Fiber(R3F)或 Spline 与自定义着色器(GLSL)集成时。
- 实现辉光、景深或自定义胶片颗粒等后期处理效果时。
- 设计交互式预加载器和高性能资源加载策略时。
- 优化复杂 3D 场景的移动设备适配和性能时。
工作原理
步骤 1:建立渲染循环和场景架构
建立稳健的 WebGL 上下文,并妥善处理尺寸调整和利于性能的像素比,这一点至关重要。将像素比上限设为 2,以避免在高 DPI 屏幕上渲染过多像素。
步骤 2:实现着色器效果和后期处理
集成后期处理管线(使用 EffectComposer 或 @react-three/postprocessing),以添加辉光、色差、景深或胶片颗粒。减少处理通道数量,并合并自定义片元着色器,以尽量减少绘制调用。
步骤 3:集成交互式物理效果和动作
使用物理框架(如 Cannon.js 或 Rapier)或程序化弹簧动画,让 3D 对象能够响应鼠标悬停、拖动和点击,并呈现自然的反馈。
步骤 4:资源管线和预加载器
优化 3D 模型(使用 Draco 压缩),并通过自定义加载管理器加载模型。后台获取大型资源时,显示交互式预加载器,为用户提供体验。
示例
示例 1:在 React Three Fiber(R3F)中进行自定义后期处理
import { Canvas } from '@react-three/fiber';
import { EffectComposer, Bloom, DepthOfField, Vignette } from '@react-three/postprocessing';
export default function PremiumComposer() {
return (
<Canvas dpr={[1, 2]} gl={{ powerPreference: "high-performance", antialias: false }}>
<ambientLight intensity={0.5} />
<mesh>
<boxGeometry />
<meshStandardMaterial emissive="orange" emissiveIntensity={2.0} />
</mesh>
<EffectComposer disableNormalPass>
<DepthOfField focusDistance={0} focalLength={0.02} bokehScale={2} height={480} />
<Bloom luminanceThreshold={0.3} luminanceSmoothing={0.9} height={300} />
<Vignette eskil={false} offset={0.1} darkness={1.1} />
</EffectComposer>
</Canvas>
);
}
示例 2:用于液态/波浪效果的自定义 GLSL 着色器材质
import * as THREE from 'three';
const CustomWavyMaterial = new THREE.ShaderMaterial({
vertexShader: `
varying vec2 vUv;
uniform float uTime;
void main() {
vUv = uv;
vec3 pos = position;
pos.z += sin(pos.x * 5.0 + uTime) * 0.1;
pos.z += cos(pos.y * 5.0 + uTime) * 0.1;
gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
}
`,
fragmentShader: `
varying vec2 vUv;
uniform float uTime;
uniform vec3 uColor;
void main() {
float pulse = 0.5 + 0.5 * sin(uTime + vUv.x * 10.0);
gl_FragColor = vec4(uColor * pulse, 1.0);
}
`,
uniforms: {
uTime: { value: 0.0 },
uColor: { value: new THREE.Color('#3b82f6') }
}
});
该材质片元需要网格、细分程度足够的几何体,以及更新 uniforms.uTime.value 的动画循环;它本身不会动效化。请遵循减少动态效果的偏好,并提供键盘/触控控制以及可用的非 WebGL/错误回退方案。在有代表性的低端设备上进行性能分析,暂停屏幕外渲染,释放自行管理的 GPU 资源,并限制资源和处理通道数量。DPR=2 和压缩只是起始设置,不保证是最优选择;对于小型资源,解码和下载成本可能超过压缩带来的收益。
最佳实践
- ✅ 设置
dpr={[1, 2]},将设备像素比限制为最高 2。 - ✅ 谨慎选择渲染器/合成器的抗锯齿方式,并测量输出效果和性能;使用后期处理本身并不意味着渲染器抗锯齿设置有误。
- ✅ 使用 Blender 或其他 3D 软件将环境光遮蔽、光照和阴影烘焙到纹理中,而不是使用动态光源和实时阴影。
- ✅ 对包含多个相同网格的场景使用实例化渲染(
THREE.InstancedMesh或 R3F<Instances>)。 - ❌ 避免使用未压缩的 GLTF/OBJ 模型。务必使用 Draco 或 Meshopt 压缩模型。
- ❌ 避免在移动设备或低端设备上使用实时阴影贴图(如
THREE.DirectionalLightShadow),因为其性能开销很大。
局限性
- 此技能不能替代针对特定环境的验证、测试或专家审查。
- 如果缺少必要输入、权限或安全边界,请暂停并请求澄清。
- 复杂的着色器数学和高级物理模拟限制,需要在不同设备芯片组上手动测试。
安全说明
- 确认通过
GLTFLoader加载的外部 3D 模型 URL 托管在可信的安全 CDN(HTTPS)上。 - 不要执行未经验证的任意 shell 脚本,也不要使用版本未锁定的 NPM 软件包来优化资源。
常见问题
- 问题:在移动设备或高 DPI(Retina)屏幕上出现严重卡顿或帧率下降。
解决方案:确保将像素比限制为 2(
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))),并禁用未使用的后期处理通道。 - 问题:初始化期间加载时间过长,且出现白屏。
解决方案:使用加载管理器(
THREE.LoadingManager),并显示响应式、可交互的预加载界面,让用户保持参与。
相关技能
@3d-web-experience- WebGL、Three.js 和 Spline 的核心概念。@scroll-experience- 将 3D 动画与滚动控制器集成。@performance-optimizer- 通用代码执行性能调优。