独立的模型变换
撰写时间:2026-04-16
修订时间:2026-04-16
独立产生不同模型变换的需求
上一章中,所渲染的两个网格物体,虽然都经过了模型变换,但实际上只经历了1次的模型变换,导致两个网格物体所产生的模型变换都是完全一致的,从应用运行结果来看,就是均同时旋转、缩放并向左进行了平移。
这种完全一致的模型变换有其自己的应用场景。例如,当相机朝右移动时,则场景中的所有网格物体均应统一地向左发生相应的模型变换。当然,这种情况下,正如下一章所示,我们应直接使用视图变换而非模型变换。
还有另一种情况下,两个网格物体应同时产生相同的模型变换。即两个网格物体同属于一个上一级的网格物体,例如,它们分别代表一个小汽车上的车体与车门,则这种逻辑是对的。否则,应允许不同的网格物体产生不同的、独立的模型变换。
我们将这种将同时影响到多个网格物体的模型变换,暂称为全局模型变换。
产生全局模型变换的原因
原因在于两个方面。首先,在顶点着色器中,只有1个变量uModelMatrix用于接收从客户端传来的矩阵数据:
其次,在渲染两个网格物体前,只向顶点着色器传送了一次矩阵数据。
这就造成顶点着色器中的uModelMatrix在两次渲染中始终只有一个值,从而导致两个网格物体均应用了同一模型变换。
实现独立的模型变换
而要实现独立的模型变换的思路是,可以保留顶点着色器中的设置,但每个网格物体持有各自的模型矩阵,且在渲染每个网格物体前,向顶点着色器传送每个网格物体各自的模型矩阵。
首先,init函数修改如下:
取消了上一章中的initModelMatrix函数,因为我们不需要初始化一个公共的模型矩阵。
其次,initMeshes函数代码如下:
axisMesh为代表坐标系的网格物体,且持有一个名为modelMatrix的对象属性,用以存储其模型矩阵。因为我们不准备该矩阵,因此该矩阵类型为单位矩阵。
mesh1是一个拟渲染为三角形的网格物体,也持有名为modelMatrix的模型矩阵。在创建后,该矩阵进行了向左平移、并围绕Z轴旋转-45o的矩阵变换。
mesh2的几何数据与mesh1完全一样,但其modelMatrix矩阵在创建后进行了向右平移、并围绕Z轴旋转45o的矩阵变换。
最后,修改render函数如下:
在渲染每个网格物体前,将各自的modelMatrix值向顶点着色器中的uModelMatrix赋值。
运行应用。各个网格物体独立进行了矩阵变换。
