返回

让 3D 世界变得更加真实:探索 WebGPU 透视投影

前端

在上一篇文章中,我们介绍了如何制作 3D 图形,但这些图形没有任何透视效果。它使用的是所谓的“正交”视图,它有其用途,但通常不是人们说“3D”时想要的。现在,我们需要添加透视效果。

那么,究竟什么是透视?它的基本特征就是离相机越远,物体就显得越小。这是因为相机就像一个针孔,光线从物体表面反射到相机,然后在胶片或传感器上形成图像。离相机越远的物体,光线与相机之间的夹角就越小,因此在图像上占据的面积也就越小。

在计算机图形学中,透视投影是模拟相机成像过程的一种技术。它通过将 3D 物体投影到 2D 平面上来创建具有空间纵深感的图像。透视投影可以分为三个步骤:

  1. 将 3D 物体转换为裁剪空间。裁剪空间是一个三维空间,它将物体限制在一个有限的体积内。
  2. 将裁剪空间中的物体投影到视锥体。视锥体是一个三维空间,它由相机的位置和方向确定。
  3. 将视锥体中的物体投影到视口。视口是 2D 平面,它定义了图像在屏幕上的位置和大小。

透视投影是创建逼真 3D 图形的重要技术。它可以用来制作游戏、电影、动画和其他类型的 3D 内容。

在 WebGPU 中,可以使用 PerspectiveMatrix 对象来创建透视投影矩阵。PerspectiveMatrix 对象有两个构造函数:

PerspectiveMatrix(fieldOfView: number, aspectRatio: number, near: number, far: number): PerspectiveMatrix;
PerspectiveMatrix(fovy: number, aspect: number, zNear: number, zFar: number): PerspectiveMatrix;

第一个构造函数使用视场角(fieldOfView)、宽高比(aspectRatio)、近裁剪平面(near)和远裁剪平面(far)作为参数。视场角是指相机可以捕捉到的视野范围,它通常用弧度表示。宽高比是指图像的宽度与高度之比。近裁剪平面和远裁剪平面是指视锥体的两个平面,它们决定了哪些物体会被渲染。

第二个构造函数使用垂直视场角(fovy)、宽高比(aspect)、近裁剪平面(zNear)和远裁剪平面(zFar)作为参数。垂直视场角是指相机可以捕捉到的垂直视野范围,它通常用弧度表示。

一旦创建了透视投影矩阵,就可以将其应用于 3D 物体。这可以通过调用 setProjectionMatrix() 方法来实现。

setProjectionMatrix(matrix: PerspectiveMatrix): void;

setProjectionMatrix() 方法将透视投影矩阵应用于当前的着色器程序。

透视投影是一种创建逼真 3D 图形的重要技术。在 WebGPU 中,可以使用 PerspectiveMatrix 对象来创建透视投影矩阵。通过调用 setProjectionMatrix() 方法,可以将透视投影矩阵应用于当前的着色器程序。