掌握 WebGL 渲染管线:构建实时图形的核心流程

268 阅读3分钟

前言

今天我们将深入学习 WebGL 的渲染管线。通过这一过程,你将了解图形从数据到最终呈现的完整路径。话不多说,直接开始吧!

meadow-8071932_640.jpg

渲染管线的流程

1. 顶点处理

这一步主要做了两件事:几何变换和数据传递

  1. 对所有顶点进行坐标变换:将顶点从模型空间经过一系列变换(模型矩阵、视图矩阵、法线矩阵等)转换到裁剪空间。
  2. 法向量变换:对法线进行相应的变换,用于后续的光照计算。
  3. 传递纹理和光照信息:将纹理坐标、颜色信息等顶点属性传递给片元着色器。

这一步中有两个需要特别注意的点:1. 顶点变换 2. 矩阵变换

顶点变换

模型坐标—>世界坐标—>视图坐标—>裁剪坐标

  • 模型坐标 (Model Coordinates):物体在其自身局部坐标系中的坐标。
  • 世界坐标 (World Coordinates):物体相对于整个世界空间的坐标。
  • 视图坐标 (View Coordinates):物体相对于摄像机的坐标。
  • 裁剪坐标 (Clip Coordinates):物体在裁剪坐标系中的坐标。

这些坐标是如何由一个坐标转换为另一个坐标的呢?————矩阵!!!

矩阵变换

参与变换的矩阵有:模型矩阵,视图矩阵,投影矩阵

  • 模型矩阵:将模型坐标转换为世界坐标

  • 视图矩阵:将世界坐标转换为视图坐标

  • 投影矩阵:将三维场景中的物体转换为二维视图,即将 3D 坐标映射到屏幕上的 2D 坐标,将视图坐标转换为剪裁坐标

    (1) 透视投影矩阵:透视投影会产生远小近大的视觉效果,类似于真实世界中人眼的观察方式。 (2) 正交投影矩阵 (Orthographic Projection Matrix):正交投影矩阵用于无透视的场景,所有物体不受距离影响,大小保持一致

注意:

  1. 在着色器中,你不需要定义矩阵的具体内容,只需要声明 uniform 变量
  2. 矩阵的实际数据需要在 WebGL 的 JavaScript 代码中计算并传递给着色器。

2. 图元装配

图片装配主要是干的一件事:就是把确定位置之后的顶点,按照用户所期望的(点,线,面)的方式连接起来,中间还掺杂着背面剔除,超出视锥体范围剔除等一系列优化性能操作。

3.光栅化

这步主要是将:图元————>像素(片元)

4. 片元着色

该步主要进行的操作是:逐片元执行片元着色器中定义的操作

5. 深度测试

深度测试的主要任务是比较每个片元的深度值,决定该片元是否可见。具体来说,它检查片元是否位于已渲染内容的前面或后面,如果在前面,就更新显示,否则丢弃片元。

6. 帧缓冲

将经过以上一系列处理的数据放入帧缓冲区中。渲染到屏幕上

总结

以上就是关于 WebGL 渲染管线的全部内容。如果有任何错误或不足之处,欢迎大家留言指正,感谢大家的阅读与支持!