书中HillsDemo 关键是类的结构,GeometryGenerator的组成和应用;
MeshData的构成,来存储Mesh的vertex和index数据;
class GeometryGenerator { public: struct Vertex { Vertex(){} Vertex(const XMFLOAT3& p):Position(p){} Vertex(float px,float py,float pz):Position(px,py,pz){} XMFLOAT3 Position; }; struct MeshData { std::vector<Vertex> Vertices; // std::vector<UINT> Indices; // }; void CreateGrid(float width,float depth,UINT m,UINT n,MeshData &meshData);
void CreateBox()...
void Create_Other_Mesh()... //...Create_Other_Mesh };
GeometryGenerator.CPP文件中对CreateGrid进行具体操作,那么,怎么应用到具体vertexBuffer和indexBuffer中去呢?
首先是初始化中雷打不动的三个接口:
bool HillsApp::Init() { if(!D3DApp::Init()) return false; BuildGeometryBuffers();//Buffer BuildFX();//FX BuildVertexLayout();//Layout return true; }
void HillsApp::BuildGeometryBuffers() { GeometryGenerator::MeshData grid; //定义Hills的MeshData GeometryGenerator geoGen; geoGen.CreateGrid(160.0f, 160.0f, 50, 50, grid);//数据输入到MeshData mGridIndexCount = grid.Indices.size(); // Extract the vertex elements we are interested and apply the height function to // each vertex. In addition, color the vertices based on their height so we have // sandy looking beaches, grassy low hills, and snow mountain peaks. std::vector<Vertex> vertices(grid.Vertices.size()); //顶点数据的存储 for(size_t i = 0; i < grid.Vertices.size(); ++i) { XMFLOAT3 p = grid.Vertices[i].Position; p.y = GetHeight(p.x, p.z); vertices[i].Pos = p; // Color the vertex based on its height. if( p.y < -10.0f ) { // Sandy beach color. vertices[i].Color = XMFLOAT4(1.0f, 0.96f, 0.62f, 1.0f); } else if( p.y < 5.0f ) { // Light yellow-green. vertices[i].Color = XMFLOAT4(0.48f, 0.77f, 0.46f, 1.0f); } else if( p.y < 12.0f ) { // Dark yellow-green. vertices[i].Color = XMFLOAT4(0.1f, 0.48f, 0.19f, 1.0f); } else if( p.y < 20.0f ) { // Dark brown. vertices[i].Color = XMFLOAT4(0.45f, 0.39f, 0.34f, 1.0f); } else { // White snow. vertices[i].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f); } } D3D11_BUFFER_DESC vbd; vbd.Usage = D3D11_USAGE_IMMUTABLE; vbd.ByteWidth = sizeof(Vertex) * grid.Vertices.size(); vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = 0; vbd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA vinitData; vinitData.pSysMem = &vertices[0]; //找到Hills的顶点数据地址 HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mVB)); //Hills数据给vertexBuffer // Pack the indices of all the meshes into one index buffer. D3D11_BUFFER_DESC ibd; ibd.Usage = D3D11_USAGE_IMMUTABLE; ibd.ByteWidth = sizeof(UINT) * mGridIndexCount; ibd.BindFlags = D3D11_BIND_INDEX_BUFFER; ibd.CPUAccessFlags = 0; ibd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA iinitData; iinitData.pSysMem = &grid.Indices[0]; HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mIB)); }
学习点:GeometryGenerator类的构成,以及对MeshData结构的应用。
定义了MeshData这个子类,定义并实现了不同Mesh数据的接口,
在应用中,CreateBuffer时候,定义相应的MeshData,获取不同Mesh的vertexData和IndexData