5.基于BLE SoC芯片GR5526开发GPU 3D图形效果(5) - 理解图形学中的矩阵变换

 系列文章:

1.基于BLE SoC芯片GR5526开发GPU 3D图形效果(1) - 概览

2.基于BLE SoC芯片GR5526开发GPU 3D图形效果(2) - 先看Demo效果

3.基于BLE SoC芯片GR5526开发GPU 3D图形效果(3) - GPU知识概念梳理

4.基于BLE SoC芯片GR5526开发GPU 3D图形效果(4) - 解析第一个GPU工程

5.基于BLE SoC芯片GR5526开发GPU 3D图形效果(5) - 理解图形学中的矩阵变换

6.基于BLE SoC芯片GR5526开发GPU 3D图形效果(6) - 开发炫酷新动画

目录

一、图形学的空间概念

局部空间 (Local Space)

世界空间 (World Space)

观察空间 (View Space)

裁切空间 (Clip Space)

屏幕空间 (Screen Space)

二、坐标系

NDC 坐标系

笛卡尔(直角)坐标系

齐次坐标系(Homogeneous Coordinates)

三、常用矩阵变换

单位矩阵

平移变换 (Translation Transform)

旋转变换 (Rotation Transform)

缩放变换 (Scale Transform)

错切变换 (Skew Transform)

正交投影变换 (Orthographic projection transformation)

盒式可视空间

正交投影变换

透视投影变换 (Perspective Projection Transform)

视场角FoV

Aspect

Near 和 Far

透视投影

四、图形学的MVP变换

五、参考文档

六、小结


前言: 通过分析GR5526 SDK 中的GPU头文件接口函数声明和 GPU刷屏指南文档 (如果需要查看的同学, 汇顶 www.goodix.com 的官网有下载). 发现跟通用 GPU一样, GR5526 的 GPU 对效果的绘制和渲染也是基于图形学定义的矩阵变换进行的. 为了更清楚的学习和使用 GR5526 GPU, 我梳理了这篇文章, 以备忘.

注: 文章内引用参考了一些网络文章的内容用于辅助说明, 在末尾有引用文章的链接.

一、图形学的空间概念

局部空间 (Local Space)

基于目标物体本身的渲染空间, 我们将其称为局部空间. 每个物体都会存在自己的空间渲染坐标系, 比如. 一般绘制单个目标物体时候, 用其几何中心作为绘制的坐标系原点(0,0,0).

在这个局部空间内, 我们可以对目标模型进行渲染, 如顶点绘制及纹理贴图等.

世界空间 (World Space)

当将在局部空间绘制的众多目标模型放置到更大空间场景时, 比如在游戏场景放置各种箱体、墙体、人物等模型, 每个模型在这个更大的空间需要有相对位置关系, 如果以模型的布局空间坐标进行放置, 那么所有的模型都会拥挤在一起, 无法展现其在这个更大空间的相对位置关系.

于是, 这个更大的空间需要一套基于空间的坐标系, 来对各个物体模型进行平移、缩放、旋转等操作, 以表达各模型的相互位置关系.

这个场景空间就叫世界空间

如果, 整个空间具备一个标准的坐标系, 然后每个物体模型也有自己的布局空间坐标. 在两个坐标系之间, 就可以运用 基础的 模型变换.

观察空间 (View Space)

在世界空间中, 可能存在多个观察者身份, 大家会从不同的位置、视觉方向对世界空间进行观察. 比如, 多人对战的射击游戏中, 各玩家都在同一个世界地图空间中进行游戏, 但不同玩家由于视觉不同, 观察到的空间物体模型形态也不一样.

这样, 不同观察者的视觉就会基于不同的观察坐标进行, 而不同人眼中看到同一个物体不同的坐标,就称作观察坐标,观察坐标所在的空间,就称作观察空间.

两个观察者在同一个世界空间中不同观察坐标下得到的观察空间, 是不相同的.

为了方便处理观察空间, 一般将观察者的坐标设置为观察空间中的原点坐标(0,0,0).
这样, 随着观察者视角的移动变化, 要将世界空间内的物体也进行各种变换,来保证观察者观察到的世界空间仍然保持相对不变.
即调整的是世界空间相对于观察者的坐标系.
这个变换也对应着 MVP 模型中的观察变换 (View Transform).

裁切空间 (Clip Space)

裁剪空间是一个抽象的齐次坐标空间,是在观察坐标到标准设备坐标(NDC )之间的过渡空间; 在观察空间经过正射/透视投影变换后,得到的就是裁剪空间.

从观察空间向裁剪空间的转换, 一般有两种投影转换模式:

• 正交投影

• 透视投影

关于这两种投影原理的描述, 请参考后续章节.

屏幕空间 (Screen Space)

屏幕空间, 可以简单的理解为Frame Buffer 帧缓存空间, 用来存储最终的图像数据变换结果, 并用于最终的图形化显示.

​在透视除法得到 NDC后,转换到屏幕空间就十分方便了,从一个 [-1, 1]的 NDC范围区间变换到屏幕视口的[0,1920]x [0,1080]空间只需要简单线性变换即可。

NDC 与屏幕空间中的点有如下关系 (如下变换关系涉及 : 视口转换 (VIEW PORT TRANSFORM )) :

不同空间的矩阵变换

1. 通过模型矩阵转换 (如: 平移、旋转、缩放等) 将 在局部空间坐标系的物体模型放置到世界空间, 在世界空间形成相对位置关系

2. 再通过观察矩阵变换(如: 平移、旋转、缩放等), 为基于每个独立的观察坐标系的观察者生成观察空间.

3. 基于观察空间, 经过投影变换矩阵(正交或透视), 生成基于 NDC 坐标系的裁切空间.

4. 裁剪空间经过视口转换矩阵操作后, 获得基于 Frame Buffer 的屏幕空间. 作为最终图形化运算结果的效果呈现.

二、坐标系

NDC 坐标系

标准设备坐标 Normalized Device Coordinate.

标准设备坐标的特征如下图:立方体的八个顶点向量的分量都是 |1| 。正是因为有规范化的空间范围,使得在从 NDC转换到屏幕坐标时非常方便。在 NDC中,每一个点的 x、y、z 坐标都在区间 [-1, 1]内,在映射到屏幕坐标时,只需关注x y 坐标即可。例如要输出到一个1920x1080 的屏幕上,就可以通过缩放矩阵来将 [-1, 1]的 x、y分别转换到 [0, 1920] 和 [0, 1080]的屏幕坐标。其中z 坐标也会从[-1,1] 转换到 [0, 1] 的区间内,作为深度测试的依据

标准设备坐标能通过对裁剪空间内的 x,y,z坐标通过除以齐次坐标 w得到,这个除以齐次坐标 w 的过程就是透视除法,在OpenGL渲染管线中,透视除法是顶点着色器最后的步骤,往往是自动进行的,然后使得顶点着色器最后的输出就是裁剪坐标经过透视除法后得到的标准设备坐标。

为什么裁剪坐标经过透视除法后,就能得到如此规范化的标准设备坐标?

这就与投影矩阵(透视/正交)的特性有关了。无论在局部空间、世界空间还是在观察空间,空间中的一个点的齐次坐标 w 都是1。而从观察空间到裁剪空间,投影矩阵就会将空间中的点坐标x 、y、 z进行一定程度的缩放,同时还改变了齐次坐标w的值。就是这个改变w 的行为,为之后的透视除法得到 NDC奠定了基础。

笛卡尔(直角)坐标系

标准的三维直角坐标系, 分为x,y,z 三个相互垂直的方向轴. 但不同的图形库, 其 x,y,z 轴的朝向选择可能不一样.

比如常见的左手坐标系以及右手坐标系

齐次坐标系(Homogeneous Coordinates)

齐次坐标系要解决的问题

在欧氏几何空间,同一平面的两条平行线永远不能相交,这是我们都熟悉的一种场景。然而,在透视空间里面,两条平行线可以相交,例如:火车轨道随着我们的视线越来越窄,最后两条平行线在无穷远处交于一点。 欧氏空间(或者笛卡尔空间)描述2D/3D几何非常适合,但是这种方法却不适合处理透视空间的问题(实际上,欧氏几何是透视几何的一个子集合),2D笛卡尔坐标可以表示为(x,y)。 如果一个点在无穷远处,这个点的坐标将会(无穷大, 无穷大),在欧氏空间中,这就变得没有意义。平行线在透视空间的无穷远处交于一点,但是在欧氏空间却不能表示,数学家发现了一种方式来解决这个问题 - 那就是 齐次坐标.

齐次坐标就是用N+1维来代表N维坐标

我们可以在一个2D笛卡尔坐标末尾加上一个额外的变量w来形成 2D齐次坐标。因此,一个在笛卡尔坐标系下的点(X, Y)在齐次坐标里面变成了 (x,y,w),并且有

X = x/w

Y = y/w

三、常用矩阵变换

单位矩阵

在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,这种矩阵被称为单位矩阵。它是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1。除此以外全都为0

4阶单位矩阵:

单位矩阵的重要性质为:

平移变换 (Translation Transform)

平面坐标系下:

扩展成三维空间下的4x4 矩阵表示:

旋转变换 (Rotation Transform)

完整的基于坐标点p(x,y)的旋转矩阵公式表示为:

  • 先将点通过平移变换到坐标原点

  • 在坐标原点基础上进行旋转变换

  • 再将变换后的点通过平移变换移动回原来的坐标点

扩展为三维立体空间的4x4 矩阵:

  • 物体在三维空间的任意旋转, 均可基于 X/Y/Z 轴 计算其旋转分量.

  • 基于某轴的旋转,则这个轴的坐标不会变化.

  • 推导出各轴的旋转变换矩阵

缩放变换 (Scale Transform)

一个点是不存在什么缩放变换的,但考虑到所有图像都是由点组成,因此,如果图像在x轴和y轴方向分别放大k1和k2倍的话,那么图像中的所有点的x坐标和y坐标均会分别放大k1和k2倍,即

x = k1*x0

y = k2*y0

用矩阵表示就是:

拓展到3维空间

错切变换 (Skew Transform)

错切变换, Skew Transform,也叫 Shear Transform.

错切变换的效果就是让所有点的x坐标(或者y坐标)保持不变,而对应的y坐标(或者x坐标)则按比例发生平移,且平移的大小和该点到x轴(或y轴)的垂直距离成正比。错切变换,属于等面积变换,即一个形状在错切变换的前后,其面积是相等的。

  • 各点的y坐标保持不变,但其x坐标则按比例发生了平移。这种情况将水平错切。

  • x坐标保持不变,但其y坐标则按比例发生了平移。这种情况叫垂直错切。

假定一个点P(x0,y0)经过错切变换后得到P(x,y),对于水平错切而言(垂直错切类似),应该有如下关系:

x = x0 + k1*y0 (k1 为斜率系数, 也等于 tana, a 为错切角度)

y = y0

矩阵表示为

扩展为 4x4 矩阵变换系数:

系数说明:

• k1 为水平错切的斜率系数

• K2 为垂直错切的斜率系数

正交投影变换 (Orthographic projection transformation)

投影就是把空间中的物体投射到某个平面的影像,这样就把3D场景转换为为了2D平面图像。

投影的方式一般分为正交投影、透视投影两种,透视投影可以产生近大远小的效果,就和人类观察世界的方式类似;而正交投影是一种平行投影,类似用一束平行光把物体的影像垂直地投射到地面上。

盒式可视空间

在计算机图形学中,为了节省计算资源,会定义一个可视空间,只有可视空间内的物体才需要进行绘制。

正交投影定义的可视空间是一个盒状可视空间,由上下左右裁切面以及近裁切面、远裁切面组成,参见下图,靠近原点的面为近裁切面,更远的为远裁切面。

主要参数说明:

• 左裁切面:x=l,left

• 右裁切面:x=r,right

• 上裁切面:y=t,top

• 下裁切面:y=b,bottom

• 近裁切面:z=n,near

• 远裁切面:z=f,far,注意观察方向是相对于z轴负方向来指定的,因此越远坐标反而越小,因此n>f

  • 正交投影变换

正交投影变换,就是已知盒状可视空间内任意点坐标(x,y,z),求解垂直投影到xy平面的对应点坐标。

按照这个定义,xyz坐标系本身就是正交坐标系,盒状可视空间内任意点的坐标(x,y,z)投影到(x,y)平面,只要简单地丢弃z坐标就可以啦,即(x,y,z)变换到(x,y,0)即可,这个理解完全没有问题,但却不是正确的结果,那么原因是什么呢?

主要原因是有两个需要考虑的问题:

  • 规范化坐标系:现实情况几乎所有的图形系统都把坐标系的空间范围限定在(-1,1)范围内,这么做是为了方便移植,使坐标系独立于各种尺寸的图形设备。

  • z坐标需要保留:想象一下可视空间内存在多个物体的场景,前面的物体可能遮挡后面的物体导致无法被看见,绘制图像时需要利用z坐标来判断前后遮挡关系来觉得那个物体需要绘制,因此保留z坐标是最终图形呈现所必须的参数。

透视投影变换 (Perspective Projection Transform)

  • 透视投影常用的参数解释

视场角FoV

视场角 FoV - Field oF View. 视角观察的区域. 示意图表示:

FoV决定了【视锥体】的顶角,顶角越大,H和W也越大,锥体覆盖到的内容也就越多

先放3张同一机位不同FOV的图:

​不同场景下,FoV 值不一样.

  • FOV在90-110范围下,比较符合人眼的观察范围,因此这个范围的FOV不易让人晕眩

  • 对于主视角游戏,PC玩家由于距离屏幕较近(更接近VR视角),一般FOV在85-90,而主机玩家距离屏幕较远(屏幕占视野比例小),通常FOV在65左右

  • 在游戏角色瞄准和专注时,为模拟人眼核心视野,FOV通常会从90降低到60

Aspect

参考FoV 图, Aspect 是 视椎体窗口的宽高比. aspect = W/H.

当 Aspect 确定时, W/H 会跟着 H/W 的变化而变化, 在 GR5526 GPU 的渲染场景, 一般将 aspect 设置为 屏幕的宽高比.

Near 和 Far

• Near : 近平面

• Far : 远平面

near 和 far 表示将要渲染在相机前面的空间范围。该范围之前或之后的任何内容都会被裁剪(不绘制)。

fov、aspect、near、far四个值,定义了一个“视锥”。视锥是3d形状的名称,它的形状像一个金字塔,顶端被切掉。换句话说,将“视锥”这个词视为另一种3D形状,例如球体,立方体,棱镜,视锥

透视投影

透视投影矩阵的推导过程较为复杂, 可参考博客: 透视投影矩阵推导_木·本的博客-CSDN博客

四、图形学的MVP变换

图形的MVP 变换矩阵:

矩阵变换从右向左执行, 分为4个典型阶段:

  • Model Transform(模型变换) - 将物体模型从局部空间通过平移、旋转、缩放等操作, 表示在世界空间

  • View Transform(视图变换) - 将世界空间的模型, 基于观察者坐标, 变换为观察者空间

  • Projection Transform(投影变换) - 使用正交或者透视投影变换法, 将观察空间变换为 [-1, 1]区域的 NDC 坐标空间

  • Viewport Transform(视口变换) - 将NDC 坐标空间, 映射到 屏幕空间Frame Buffer 的变换

上述4个阶段恰好应对 5个空间关系的转换. 可再次参考下图的转换关系来进一步理解 MVP 流程

这篇文章简化梳理了各空间变换矩阵:

MVP transformation - 简书

五、参考文档

  1. 图形学:MVP变换概述

  2. Android中图像变换Matrix的原理、代码验证和应用

  3. 图形API坐标系对比以及坐标系之间变换

  4. 初探FoV

  5. 什么是齐次坐标系

  6. 一文读懂正交投影变换

六、小结

文章梳理了一些图形学的基础概念, 把数学知识和图形学知识串起来, 理解下, 可以方面进一步理解学习 GR5526 的 GPU 知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值