3d你不得不了解的知识

126 阅读11分钟

Three.js、WebGL、WebGPU 和 Shaders 是现代 Web 3D 图形开发中紧密相关的概念。它们共同构成了在浏览器中实现高性能、高质量三维体验的基础。下面我将详细讲解它们之间的关系以及各自的作用。

1. Three.js

Three.js 是什么?  Three.js 是一个用 JavaScript 编写的、轻量级的 3D 库。它的目标是尽可能简单地创建和显示 3D 内容。它封装了底层的 WebGL(以及现在也支持 WebGPU)API,提供了更高级、更易用的接口,让开发者无需直接处理复杂的 WebGL/WebGPU 细节,就能轻松构建 3D 场景、模型、动画和交互。

Three.js 的优势:

  • 易用性:  极大地简化了 3D 开发,提供了直观的对象模型(场景、相机、几何体、材质、灯光等)。
  • 功能丰富:  支持各种几何体、材质、纹理、灯光、阴影、后处理效果、物理引擎集成、VR/AR 等。
  • 活跃社区和生态系统:  拥有庞大的用户群体和丰富的示例、插件和教程。
  • 跨平台:  运行在支持 WebGL/WebGPU 的任何现代浏览器上。

Three.js 的工作方式:  开发者通过 Three.js API 定义 3D 场景中的各种元素,例如创建一个 BoxGeometry、一个 MeshStandardMaterial、一个 Mesh,然后将 Mesh 添加到 Scene 中。Three.js 负责将这些高级描述转换成 WebGL 或 WebGPU 可以理解的低级指令,发送给 GPU 进行渲染。

2. WebGL (Web Graphics Library)

WebGL 是什么?  WebGL 是一种 JavaScript API,用于在任何兼容的 Web 浏览器中呈现交互式 2D 和 3D 图形,而无需使用插件。它基于 OpenGL ES 2.0/3.0 标准,允许 JavaScript 代码直接访问 GPU 进行图形渲染。

WebGL 的特点:

  • 低级 API:  提供了对 GPU 的直接访问,需要开发者管理更多的细节,如缓冲区、着色器程序、纹理等。
  • 基于状态机:  WebGL API 的操作通常是改变 GPU 的当前状态,然后执行绘制命令。
  • 性能:  利用 GPU 的并行处理能力,提供比 CPU 渲染更高的性能。
  • 着色器语言:  使用 GLSL (OpenGL Shading Language) 编写着色器。

WebGL 与 Three.js 的关系:  在 WebGPU 出现之前,Three.js 的底层渲染器主要是 WebGLRenderer,它负责将 Three.js 场景中的对象转换为 WebGL 命令并发送到 GPU。可以说,WebGL 是 Three.js 实现 3D 渲染的“引擎”。

3. WebGPU

WebGPU 是什么?  WebGPU 是下一代 Web 图形 API,旨在取代 WebGL。它提供了一种更现代、更低级的 GPU 访问方式,借鉴了现代图形 API(如 Vulkan、Metal 和 DirectX 12)的设计理念。

WebGPU 的优势:

  • 性能提升:

    • 更低的 CPU 开销:  允许更有效地提交渲染命令,减少了 CPU 和 GPU 之间的同步开销。
    • 更好的多线程支持:  更好地利用多核 CPU。
    • 更灵活的渲染管线:  允许开发者对渲染过程有更多的控制,从而进行更深层次的优化。
  • 更强的通用计算能力 (GPGPU):  除了图形渲染,WebGPU 还提供了强大的计算着色器(Compute Shaders)能力,可以用于机器学习、物理模拟、数据处理等通用计算任务。

  • 更现代的设计:  解决了 WebGL 中一些固有的限制和痛点,例如状态管理复杂性、错误处理不足等。

  • 着色器语言:  使用 WGSL (WebGPU Shading Language) 编写着色器。WGSL 语法上更接近 Rust,并且在编译时有更严格的类型检查。

WebGPU 与 Three.js 的关系:  随着 WebGPU 的普及,Three.js 引入了 WebGPURenderer。这个新的渲染器旨在成为 WebGL/2 和 WebGPU 后端的统一接口,意味着 Three.js 开发者可以在不改变大部分 Three.js 代码的情况下,选择使用 WebGPU 作为底层渲染技术,从而获得性能提升和更多高级功能。

Three.js 对 WebGPU 的支持策略:  Three.js 正在积极拥抱 WebGPU,并推出了“Node Material System”和 TSL (Three Shading Language)。这个系统旨在让开发者以更声明式、更模块化的方式构建材质和着色器,并且能够兼容 WebGL 和 WebGPU。它减少了直接编写 WGSL 的需要,但同时也提供了直接使用 WGSL 的能力。

4. Shaders (着色器)

Shaders 是什么?  着色器是一小段运行在 GPU 上的程序,用于计算图形渲染的各个方面,如顶点的位置、颜色、光照、纹理映射等。它们是 GPU 并行处理能力的核心。

着色器的种类:  在 3D 渲染管线中,最常见的两种着色器是:

  • 顶点着色器 (Vertex Shader):

    • 输入:  接收模型中的每个顶点的数据(如位置、法线、UV 坐标等)。
    • 作用:  主要负责将 3D 空间中的顶点坐标转换到屏幕空间,并可以对顶点数据进行变换(如旋转、平移、缩放)、计算法线、传递数据给片元着色器(通过 Varying 变量)。
    • 输出:  每个顶点的最终屏幕位置,以及需要传递给片元着器的数据。
  • 片元着色器 (Fragment Shader) / 像素着色器 (Pixel Shader):

    • 输入:  接收由顶点着色器处理后的数据(经过插值后的 Varying 变量,例如颜色、UV 坐标、法线),以及纹理、光照信息等。
    • 作用:  对每个像素进行着色计算,确定该像素的最终颜色。这包括纹理采样、光照模型计算、颜色混合、透明度处理等。
    • 输出:  每个像素的最终颜色。
  • 计算着色器 (Compute Shader - WebGPU 特有):

    • 输入:  任意数据(通过缓冲区)。
    • 作用:  不直接参与图形渲染管线,而是用于通用计算任务。它可以在 GPU 上并行执行大量计算,并将结果存储在缓冲区中,可以用于模拟、机器学习推理、物理计算等。
    • 输出:  计算结果(存储在缓冲区中)。

着色器语言:

  • GLSL (OpenGL Shading Language):  WebGL 使用的着色器语言。
  • WGSL (WebGPU Shading Language):  WebGPU 使用的着色器语言。它是一种更现代、类型更安全的语言,设计上更接近 Rust。

着色器与 Three.js/WebGL/WebGPU 的关系:

  • 底层核心:  无论是 WebGL 还是 WebGPU,它们工作的核心都是执行着色器代码。

  • Three.js 中的着色器:  Three.js 提供了各种内置材质(如 MeshStandardMaterialMeshBasicMaterial等),这些材质内部都包含了预定义的着色器代码。开发者通常不需要直接编写 GLSL 或 WGSL。

  • 自定义着色器:

    • WebGL:  如果需要高度定制化的效果,Three.js 提供了 ShaderMaterial 或 RawShaderMaterial,允许开发者直接编写 GLSL 代码来控制渲染。
    • WebGPU:  Three.js 在 WebGPU 渲染器中引入了“Node Material System”和 TSL (Three Shading Language)。通过这个系统,开发者可以更方便地组合和定制材质,而 Three.js 会负责将其编译成 WGSL。当然,如果需要,也可以通过更底层的方式直接编写 WGSL。

总结

  • Three.js 是一个高级的 JavaScript 库,极大地简化了 Web 3D 开发。
  • WebGL 是一个低级的 JavaScript API,允许浏览器直接访问 GPU 进行 3D 渲染,是 Three.js 传统上的底层引擎。
  • WebGPU 是下一代 Web 图形 API,提供更低级的 GPU 访问和更强的通用计算能力,旨在取代 WebGL,并被 Three.js 积极支持。
  • Shaders (着色器)  是运行在 GPU 上的小程序,负责图形渲染的实际计算(如顶点变换和像素着色),是 WebGL 和 WebGPU 的核心。

Three.js 的目标是让开发者无需深入理解 WebGL 或 WebGPU 的复杂性,就能创建出色的 3D 应用。然而,对于希望实现更独特或更高性能效果的开发者来说,理解 WebGL/WebGPU 的原理以及着色器的工作方式至关重要。随着 WebGPU 的普及,它将为 Three.js 带来更强大的功能和更高的性能潜力。

那 ar vr XR 和它们都有什么关系? 

AR(增强现实)、VR(虚拟现实)和 XR(扩展现实)是沉浸式技术领域的核心概念,它们与 Three.js、WebGL、WebGPU 和 Shaders 之间存在着密切而递进的关系。简而言之,后一组技术是实现前一组体验的底层基石。

1. XR (Extended Reality - 扩展现实)

XR 是什么?  XR 是一个总称,涵盖了所有将现实与虚拟世界结合的技术,包括:

  • VR (Virtual Reality - 虚拟现实):  完全沉浸式的体验,将用户带入一个完全由计算机生成的虚拟环境。用户看不到真实世界。
  • AR (Augmented Reality - 增强现实):  将虚拟内容叠加到真实世界中,通常通过手机屏幕或透明眼镜。真实世界仍然可见,虚拟内容作为增强。
  • MR (Mixed Reality - 混合现实):  介于 AR 和 VR 之间,允许虚拟对象与真实环境进行交互,并且虚拟对象看起来像真实世界的一部分。通常需要带有深度传感器的设备。

XR 与 Web 的关系:WebXR Device API 为了在浏览器中实现 AR/VR/MR 体验,Web 社区开发了 WebXR Device API。这是一个 W3C 标准,它允许网页访问设备的沉浸式功能(如头戴式显示器、手柄、摄像头等),从而在浏览器中创建 XR 体验。

2. AR/VR/XR 与 Three.js、WebGL、WebGPU、Shaders 的关系

要理解它们之间的关系,可以从“层级”的角度来看:

底层:WebGL / WebGPU (渲染引擎)

  • GPU 驱动:  无论是 VR 还是 AR,核心都是在屏幕(或头显的显示屏)上渲染 3D 图形。这就需要直接与设备的图形处理单元 (GPU) 进行通信。
  • WebGL:  传统的 Web 3D 渲染 API,是 WebXR 能够运行的基础之一。WebXR API 通过 XRWebGLLayer 等接口与 WebGL 进行桥接,将 3D 场景渲染到 VR/AR 设备中。
  • WebGPU:  作为 WebGL 的下一代,WebGPU 带来了更高的性能、更低的 CPU 开销和更现代的 GPU 特性(如计算着色器)。这意味着未来 WebXR 体验将能够更加复杂、更加逼真。目前,WebXR 也在积极与 WebGPU 进行集成(例如 WebXR/WebGPU integration 功能),以利用其优势。

核心渲染逻辑:Shaders (着色器)

  • 视觉效果的灵魂:  无论 3D 场景是用于桌面、VR 还是 AR,构成场景中所有物体外观和光照效果的都是着色器。
  • 定制化需求:  在 VR/AR 中,为了实现逼真的光照、阴影、反射、折射、粒子效果等,着色器发挥着至关重要的作用。例如,要模拟 AR 中虚拟物体与真实环境的融合,可能需要自定义着色器来处理环境光照、阴影投射等。
  • 性能优化:  着色器编写的效率直接影响渲染性能。在 VR/AR 中,维持高帧率(通常 90fps 或更高)以防止眩晕感至关重要,因此着色器的优化尤为关键。

上层抽象:Three.js (开发框架)

  • 简化复杂性:  WebGL 和 WebGPU 是低级 API,直接使用它们进行开发非常复杂。Three.js 正是为了解决这个问题而诞生的。它提供了场景、相机、几何体、材质、灯光、动画等高级抽象,让开发者可以更专注于构建 3D 内容,而不是底层渲染细节。

  • VR/AR 支持:  Three.js 对 WebXR 提供了开箱即用的支持。它内置了 WebXRManager 和相关工具,开发者只需少量代码就能让 Three.js 场景在兼容 WebXR 的设备上以 VR 或 AR 模式呈现。

    • VR 模式:  Three.js 会自动处理双眼渲染(每个眼睛一个视图)、头部追踪、手柄输入等。
    • AR 模式:  Three.js 会利用设备的摄像头图像作为背景,并将 3D 场景叠加到摄像头图像上,同时处理姿态追踪,使得虚拟物体能够固定在真实世界的特定位置。
  • 开发效率:  借助 Three.js,开发者可以快速原型开发和迭代 AR/VR 体验,而无需从零开始处理 WebGL/WebGPU 的复杂性。

总而言之:

  1. Three.js 是一个高级 3D 库,它封装了底层图形 API,极大地简化了 Web 3D 内容的创建。
  2. WebGL / WebGPU 是 Three.js 在浏览器中进行 3D 渲染的底层技术。WebGL 是当前广泛使用的标准,WebGPU 则是面向未来的高性能替代方案。
  3. Shaders 是在 GPU 上运行的程序,它们是 Three.js 通过 WebGL/WebGPU 渲染出任何视觉效果的根本。
  4. WebXR Device API 是一个 Web 标准,它允许浏览器访问 XR 设备(如 VR 头显、AR 手机等)的能力。
  5. AR/VR/XR 体验 是最终呈现给用户的沉浸式应用程序。这些应用程序正是通过 Three.js 这样的库,利用 WebXR API,并依赖 WebGL/WebGPU 和 Shaders 来实现其图形渲染和交互逻辑的。

可以说,Three.js、WebGL、WebGPU 和 Shaders 构成了在 Web 上构建 AR/VR/XR 体验的技术栈的基础。Three.js 提供了易用的开发框架,WebXR 连接了硬件,而 WebGL/WebGPU 和 Shaders 则提供了底层的图形渲染能力,共同推动了 Web 沉浸式体验的发展。