图形学整理

渲染管线

细说图形学渲染管线

碰撞检测

Broad-Phase

游戏物理引擎(二) 碰撞检测之Broad-Phase

  • Broad-Phase使用某种Bounding Volume来表示刚体的碰撞信息,然后用空间划分的方式来保存这些Bounding Volume,就可以再较短的时间内筛选出可能互相碰撞的刚体对.

  • AABB包围盒

Uniform Grid

  • 将空间划分成等大方块

KD-Tree

  • 每次只沿某一个轴划分 二叉树like

Oct-Tree

  • 三维均匀切分,设置每一块的终止条件

BSP-Tree

  • 每次取一个方向(非横平竖直)将空间分为两部分 (会很麻烦)

BVH

  • 以object为单位划分空间

  • 二叉树,两个子节点分别存两部分物体的AABB

  • 一个物体只可能出现在一个包围盒中

  • 如何划分很有讲究,不好的划分会使包围盒重合,降低效率

    可以用topk算法快速找中位物体划分

Narrow-Phase

Separating Axis Theorem(SAT)算法

Gilbert-Johnson-Keerthi (GJK)算法

DrawCall

Unity:浅谈对Drawcall的理解

  • 渲染分为三个阶段:应用阶段、几何阶段、光栅化阶段
  • Drawllcall就是应用阶段收集完模型的顶点材质以及其他数据后,CPU去通知GPU去对所传递的图元进行渲染。

为啥要减少drawcall呢?

  • 传输数据消耗较大,GPU的计算能力又非常优秀,那么存在一种情况:Cpu传递的drawcall指令只渲染一小部分,GPU飞快的渲染完了,而下一条drawcall的指令还没有完成传输过程。此类的指令过多就造成了卡顿。所以提高drawcall传输效率就非常有必要了

减少drawcall的方法

  • 主要的方法就是合批(Batch),合批又分为静态合批,动态合批两个不同的操作

纹理压缩

  • mipmap(多级渐远纹理)

    它简单来说就是一系列的纹理图像,后一个纹理图像是前一个的二分之一,每提升一个Level,对相邻的四个元素进行插值。多级渐远纹理背后的理念很简单:距观察者的距离超过一定的阈值,会使用不同的多级渐远纹理,即最适合物体的距离的那个。由于距离远,解析度不高也不会被用户注意到。同时,多级渐远纹理另一加分之处是它的性能非常好。让我们看一下多级渐远纹理是什么样子的:

前向渲染和延迟渲染

齐次坐标和透视除法

齐次坐标

  • 目的:为了解决欧式几何空间中两条支线是不能相交的,但透视空间两条支线是可以相交的。

  • 齐次坐标就是用N+1维来代表N维坐标,通过添加一个额外的分量w,

如果(x,y,z)是个点,则变为(x,y,z,1);
如果(x,y,z)是个向量,则变为(x,y,z,0);

透视除法

  • 透视除法不在vs中进行,vs转换得到的是裁剪空间,透视除法在光栅化之前进行
  • 透视除法将齐次坐标的每一个分量除以w,得到NDC
  • 透视除法可以将齐次坐标转换成欧式坐标

欧拉角和万向结死锁

3D游戏世界里的万向节锁

  • 万向结死锁就是一个物体在一个3D世界里面随着旋转顺序和旋转角度的改变,导致物体只能在一个固定的平面旋转,无法旋转到你预想的角度。由于物体的旋转,物体的坐标轴方向也发生了改变,导致其中2条坐标轴发生了重合。当你围绕着重合的坐标轴旋转时,物体的旋转方向始终在一个平面上旋转。

画线算法

  • 光栅直线的特点

    X的值每次增长1

Y的值会在保持不变和增长1之间选择

DDA

Bresenham

点到平面计算距离

  • 设点为P,根据屏幕方程得到平面法向量N,取平面上一点Q,连接PQ,得到向量QP,设两条向量的夹角为Alpha,则cos(Alpha)可求,然后根据三角函数,距离可求

旋转矩阵

二维

$\left[\begin{matrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{matrix} \right]$

三维

  • 绕x轴

$\left[\begin{matrix}
1 & 0 & 0 & 0\\
0 & cos\theta & -sin\theta & 0\\
0 & sin\theta & cos\theta & 0 \\
0 & 0 & 0 & 1
\end{matrix} \right]$

  • 绕y轴

$\left[\begin{matrix}
cos\theta & 0 & sin\theta & 0\\
0 & 1 & 0 & 0\\
-sin\theta & 0 & cos\theta & 0 \\
0 & 0 & 0 & 1 \\
\end{matrix} \right]$

  • 绕z轴

$\left[\begin{matrix}
cos\theta & -sin\theta & 0 & 0\\
sin\theta & cos\theta & 0 & 0\\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{matrix} \right]$

  • 绕任意轴

    太复杂了

绕任意轴都可以轴上面三个组合得到

正交矩阵的逆矩阵

  • 转置

shaowmap

延迟渲染和前向渲染

深度是什么,深度值啥时候写入

  • 光栅化的时候就能知道深度值

怎样从一个旋转缩放矩阵中拆分出缩放矩阵

  • 缩放分量就是矩阵
  • 中每一列的模的大小,然后得出缩放后除以相应大小就能得到旋转矩阵

点乘和叉乘应用场景

  • 点乘可以快速得到两向量之间的夹角,判断两个向量是否同方向
  • 判定左右和内外

怎么判断一个点在矩形内,园内,三角形内

  • 通过叉乘判断是否这个点都在这个形状的一侧,如果都在一侧就是在内部,不然都在外部

Phong和blinnphong的区别

phong = 环境光+漫反射+镜面反射
blinnphong在phong的高光部分进行修改,用法线和半角向量

blinnphong的优缺点

  • 运算效率高在Phong模型中,必须计算反射光线R,但是在BlinnPhong模型中,用N·H的值来取代V·R。
  • 2.高光更加柔和、真实感没Phong模型强BlinnPhong 引入了 法线直接计算高光。在phong中,法线只是用于计算入射光线的反射光线,结果要比Phong更加柔和。