unity渲染的矩阵变换全流程

前言

了解渲染管线中,坐标从模型位置转变成屏幕位置的运算过程。
自行学习计算时,可以借助编辑器进行校验:Unity渲染矩阵变换编辑器

整体过程

在这里插入图片描述

模拟演算

以橙色标记点为计算点。

模型空间

空间:建模软件
维度:3维
在这里插入图片描述

示例演算:

在这里插入图片描述

世界空间

空间:引擎 unity的transform位置
维度:3维
在这里插入图片描述

示例演算

公式

在这里插入图片描述在这里插入图片描述

思路

M model 是根据cube的transform位置进行变换。
从上图可以得到数据,cube向(-1,-1,-1)进行位移,y轴旋转30°,整体缩小0.5百分比。

计算

sin(30) = 0.5
cos(30) = 0.866
在这里插入图片描述

观察空间

空间:摄像机
维度:3维
在这里插入图片描述

示例演算

公式

在这里插入图片描述
在这里插入图片描述

思路

计算视角矩阵是以正方体为原点,反向摄像机的矩阵,所以顺序是逆着的。
在unity看到的摄像机的旋转角度,在计算的方向是反方向。从方块的角度是摄像机移动了-8°。

计算

在这里插入图片描述

裁剪空间

空间:摄像机的照相范围
维度:3维
在这里插入图片描述

示例演算

公式

在这里插入图片描述
在这里插入图片描述

判断是否需要被裁剪,需要视锥体的坐标满足以下范围。在范围内不被裁剪,超出则会被裁剪。
-w ≤ x ≤ w
-w ≤ y ≤ w
-w ≤ z ≤ w

思路

有两种投影方式:正交和透视。两种投影方式计算不相同,会让屏幕看到的内容不相同。
当前从摄像机的属性:Projection 可以得知是透视投影。接下来就以投影类型进行计算。

裁剪空间到屏幕空间会进行位置裁剪。通过位置是否在视锥体内进行裁剪。

计算

Aspect 是视图的横纵比,在Unity里是Game视图里的分辨率。当前是5:4。
Fov是摄像机的开合的角度。在Unity里是Camera的FieldofView属性。当前是20。
Far和Near是摄像机的最远点和最近点。在Unity里是Camera的Clipping Planes的Near和Far属性。当前Near是0.3,Far是1000。
在这里插入图片描述

判断是否会被裁剪:
-9.247 ≤ 1.55 ≤ 9.247
-9.247 ≤ -2.652 ≤ 9.247
-9.247 ≤ 8.652 ≤ 9.247

位置符合视锥体范围,所以不会被裁剪。

屏幕空间

空间:屏幕
维度:2维
在这里插入图片描述

之前的计算都是基于三维,而屏幕呈现的是二维空间。所以这一步骤中需要先进行维度的转变。
步骤:
1.坐标进行齐次除法。
2.屏幕映射。

示例演算

公式

在这里插入图片描述

思路

齐次除法的作用在于将裁剪空间变换到立方体的空间中。
正交投影本来就是立方体,所以计算后数值不会有变化。而透视投影是锥体,所以计算后数值会改变。

计算后得到二维坐标。而三维坐标中的z值用于深度缓冲计算。

计算

在unity的屏幕坐标系中,原点在左下角。pixelWidth和pixelHeight是屏幕的大小。
使用unity接口:Screen.width,Screen.height 可以得到屏幕大小。
测试窗口通过输出,得知当前屏幕大小是:649,519。
在这里插入图片描述

演算结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sinat_34870723/article/details/113925012
今日推荐