渲染管线
碰撞检测
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
- 渲染分为三个阶段:应用阶段、几何阶段、光栅化阶段
- 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世界里面随着旋转顺序和旋转角度的改变,导致物体只能在一个固定的平面旋转,无法旋转到你预想的角度。由于物体的旋转,物体的坐标轴方向也发生了改变,导致其中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更加柔和。