mcpField
P
premium-3d-website

premium-3d-website

github.com/sickn33设计与 UI48.7k57 次安装今天更新
代码仓库

关于 premium-3d-website

Premium 3D Website 是面向开发者的技能,适用于构建基于 WebGL 的交互式 3D 网站。内容涵盖着色器效果、后期处理、物理与运动、资源加载,以及面向移动设备等场景的性能实践。

主要功能

  1. 01搭建 WebGL 场景和渲染循环
  2. 02添加 GLSL 着色器与后期处理
  3. 03实现交互式物理效果和运动
  4. 04优化并加载 3D 资源
  5. 05针对设备性能调整渲染

适用场景

  1. 01构建以 3D 为核心的创意网站
  2. 02使用 Three.js 或 R3F 添加着色器与 bloom 效果
  3. 03制作对象的交互响应
  4. 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 - 通用代码执行性能调优。

评论

支持 Markdown