环境:VS2017 语言:C++
总起:
红龙书所使用的Effect库已经不建议使用了,所以这边在编译Shader所使用的是X_Jun96大佬手动的方式。
附上工程链接:https://github.com/anguangzhihen/Dx11。
红龙书本身是比较难以研读的,特别是对于初学者而言,它的一般做法是先将理论全部说一遍,然后讲一整个例子,没有由浅入深进行说明,总体而言看起来比较痛苦。不过我会把它读完。
红龙书第五章主要是渲染管线的理论知识,关于这个就不做详细叙述了,主要是两个阶段:
- 几何阶段,将模型内部坐标转换到齐次剪裁空间,主要通过wvp矩阵进行转换(Unity中为mvp);
- 光栅化阶段,通过遍历所有可见模型上的三角形,对其每个像素点进行操作(类似设置法线贴图就在该流程中)。
几何阶段对应的程序控制代码的Shader就是顶点着色器,即Vertex Shader(暂不讨论曲面细分着色器和几何着色器);而光栅化阶段是片元着色器,即Pixel Shader。
第六章是介绍Dx渲染时的各个函数与数据结构,然后是实践,看起来很多很复杂,实际上比起第四章使用的函数量少的多,所以我们直接从实践出发,看看渲染一个方块究竟要做一些什么操作。
渲染一个方块:
首先我们来看一下效果:
嗯,好的,非常完美(有同学可能要问:这不是棱锥吗?嗯……可能是方块上面的四个点坍缩成了一个点吧)。
首先我们让新建的BoxDemo类继承我们第一篇博文中编写的D3DApp,然后主要重写3个方法:Init、UpdateScene、DrawScene。
首先是Init,大部分的操作都集中在此处:
bool BoxApp::Init()
{
if (!D3DApp::Init())
return false;
BuildGeometryBuffers();
BuildFX();
return true;
}
♦ 创建顶点和索引信息、设置GPU缓存(BuildGeometryBuffers)
在渲染一个模型的时候,我们考虑的第一步就是把这个模型通过顶点建立出来。
这边我们除了顶点以外,还需要设置索引信息,什么是索引信息呢。以2D空间举例:
一个方块顶点为:(0, 0) (0, 1) (1, 1) (1, 0)。
则以如果以三角形为图元,需要两个三角形才能渲染该方块,即:0 1 2和1 2 3。(Dx为左手坐标系,顶点顺序顺时针为可见)
上面的0 1 2 1 2 3便是索引信息,因为如果要使用顶点来表示索引,便会多出很多多余的内存。
首先声明3个缓存成员变量,还有常量缓存使用的数据结构: