06/05/2020
渲染流水线
图解
输入装配阶段(Input Assembler)IA
输入装配器(IA)阶段会从显存种读取几何数据(顶点和索引,vertex and index),再把它们装配为几何图元(geometric primitive,三角形,线条等等)
- IASetVertexBuffer 顶点
- IASetPrimitiveTopology 图元
- IASetInputLayout 顶点布局
- IASetIndexBuffer 索引
顶点的意义
一开始我们想到顶点坐标,代表着顶点的空间位置,但是它还可以其他意义
- 为顶点添加法向量,以实现光照效果
- 为顶点添加纹理坐标,以实现纹理贴图
Direct3D为用户提供了自定义顶点格式,即定义顶点结构体种的分量
顶点缓冲区和图元拓扑(primitive topology)
顶点缓冲区利用连续的内存来存储一系列顶点,图元拓扑可以解释为每两个顶点组合一个线段,还是没三个顶点组合一个三角形等等
顶点着色器阶段(VS)
顶点着色器看作一种输入与输出数据为单个顶点的函数,每个要绘制的顶点都须经过顶点着色器的处理再送往后续阶段,如
// =====> 输入到输出
for(UINT i = 0;i<numVertices;++i)
{
vOut[i] = VertexShader(vIn[i]);
}
作用
- 变换
- 光照
- 纹理贴图
- 等等
注意: 顶点着色器不但可以访问输入的顶点数据,也能够访问纹理和其他存于显存中的数据,如变换矩阵与场景的光照信息
世界矩阵
将局部坐标系的坐标转换到全局场景坐标系中的过程叫做世界变换,所使用的变换矩阵叫做世界矩阵
- 缩放 Scale
- 旋转 Rotation
- 移动 Translation
- W = SRT 矩阵相乘,顺序不能错
观察空间
由世界空间至观察空间的坐标变换形成的矩阵叫做视图矩阵(View Matrix)
基本理解为世界矩阵的逆矩阵W-1, 由于只有位置和朝向的差异,排除缩放,所以最后变为
DirectXMath 提供的观察矩阵函数
XMMATRIX XM_CALLCONV XMMatrixLookAtLH( //输出视图矩阵
FXMVECTOR EyePositionm, //提供摄像机的位置
FXMVECTOR FocusPosition, //提供观察目标的位置
FXMVECTOR UpDirection, // 世界坐标的上方向,通常为(0,1,0)
);
投影和其次裁剪空间
摄像机在世界坐标的位置和朝向是一部分,还有另一部分关于可观察到的空间体积,此范围可用一个由四棱锥截取的平截头体(frustum,即四棱台),将四棱台体内的3D几何体投影到一个2D投影窗口。
XMMatrixPerspectiveForLH函数
//LH 左手坐标系
//Perspective 透视投影 近大远小
XMMATRIX XM_CALLCONV XMMatrixPerspectiveForLH(
float FovAngleY, //弧度制表示的垂直视场角,即Y轴;45度表示四分之一的PI
float Aspect, //纵横比 = 宽度/高度
float NearZ, //近平面距离
float FarZ, //远平面距离
);
光栅化阶段(像素化)
为投影至屏幕的3D三角形计算出对应的像素颜色
视口变换
构成2D图像的2D顶点x,y坐标就会被变换到后台缓冲区中成为视口(Viewport)的矩形里。变换完后,这些x,y坐标都将以像素为单位表示
背面剔除
每个三角形都有两个面,往往背面会被剔除,即不被绘制,通常由顶点顺序来表示正反面
顶点属性差值
通常一个三角形有三个顶点,这些顶点带有颜色,纹理信息,所以,必须精确到内部像素的属性值
像素着色器阶段
- 光照
- 反射
- 阴影
输出合并阶段
- 丢弃一些不合格的像素片段
- 混合操作
DX12 3D游戏开发实战第五章
背面剔除