骷髅头示例Demo
1. 文件格式
虽然对于本书的某些示例来说,盒子、网格、球和圆柱形就足够了,但是还有些示例要绘制更加复杂的几何体。本书的后面我们会介绍如何从一个流行的3D模型格式加载3D网格。同时,我们已经将一个骷髅网格的几何体(见后面的图)导出为一个顶点(只包含位置和法线向量)和索引的简单列表,可以使用标准的C++文件I/O从文件中读取顶点和索引,并将它们复制到顶点和索引缓冲。文件的格式是一个非常简单的文本文件:
VertexCount:31076
TriangleCount:60339
VertexList(pos, normal)
{
0. 592978 1. 92413 -2. 62486 0. 572276 0. 816877 0. 0721907
0. 571224 1. 94331 -2. 66948 0. 572276 0. 816877 0. 0721907
0. 609047 1. 90942 -2. 58578 0. 572276 0. 816877 0. 0721907
…
}
TriangleList
{
0 1 2
3 4 5
6 7 8
…
}
2. 加载文件中的几何体
完整的Demo项目源代码请自行到DirectX11龙书的官网下载。建议用VS阅读源代码。
void SkullApp::BuildFX()
{
std::ifstream fin("fx/color.fxo", std::ios::binary);
fin.seekg(0, std::ios_base::end);
int size = (int)fin.tellg();
fin.seekg(0, std::ios_base::beg);
std::vector<char> compiledShader(size);
fin.read(&compiledShader[0], size);
fin.close();
HR(D3DX11CreateEffectFromMemory(&compiledShader[0], size,
0, md3dDevice, &mFX));
mTech = mFX->GetTechniqueByName("ColorTech");
mfxWorldViewProj = mFX->GetVariableByName("gWorldViewProj")->AsMatrix();
}