zoukankan      html  css  js  c++  java
  • 龙书11_chapter_6 二:HillsDemo解析

     书中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

             

  • 相关阅读:
    PHP发送邮件
    SQL删除字段及判断字段是否存在的方法
    密码MySQL的root的密码
    java socket 最简单的例子(server 多线程)
    php编写最简单的webservice
    SQL Server 存储过程与触发器
    手动创建最简单的JSP 文件
    Oracle 卸载步骤
    编写 WebService 程序
    eclipse 常用快捷键
  • 原文地址:https://www.cnblogs.com/dust-fly/p/4533479.html
Copyright © 2011-2022 走看看