上一篇文章中,我们使用了 Assimp 导入了一个模型,然后将其的顶点和索引全部提取出来并成功在屏幕上渲染。但是这样做有个很明显的问题,我们没法贴图。因为大部分模型的贴图都是针对单个 Mesh 来创建的,我们将所有顶点提出来一起渲染,自然是没有办法做这个了,所以最后我们得到的是一个纯色的蜘蛛。
而这一篇中我们将针对 Mesh 进行渲染,并且对其贴图。
首先我们会创建一个 Mesh
类 ,这个类将实现对单个网格的渲染,来看看这个类的声明。
1 | class Mesh { |
我们这个类设定的比较简单,并没有太多的功能,一个初始化,一个绘制,一个释放指针。来看看实现:
1 | HRESULT Init(ID3D11Device **pDevice , const char* vertexShaderPath , const char* pixelShaderPath) { |
其实也就是将我们之前渲染的代码移进来了而已,其他的也差不多:
1 | void Draw(ID3D11DeviceContext **pImmediateContext) { |
现在我们看看对于模型的读取:
1 | vector<Mesh> LoadModelUsingAssimp(const char* path) { |
在这里,我们并未将顶点和索引等数据扔到总数组里,而是创建了一个 Mesh
数组,为单个 Mesh
填充数据,包括纹理。(这里的纹理人家不是这么用的,只是我比较懒!!!)
OK,现在可以调用这些方法了,首先填充 Mesh
数组和初始化每个 Mesh
:
1 | vector<Mesh> meshes = LoadModelUsingAssimp("./Resources/Low-Poly\ Spider/spider.x"); |
在消息循环里调用 Draw
方法:
1 | for (auto& mesh : meshes) mesh.Draw(&pImmediateContext); |
最终效果如下:
源代码地址:DX11Tutorial-RenderMesh