DX11(五):简易渲染流水线总结

06/05/2020

图解

Simple Render pipeline

输入装配阶段(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, 由于只有位置和朝向的差异,排除缩放,所以最后变为
V = W 1 = ( R T ) 1 = T 1 R 1 V = W^{-1} = (RT)^{-1} = T^{-1}R^{-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游戏开发实战第五章
背面剔除

猜你喜欢

转载自blog.csdn.net/weixin_44200074/article/details/106532728