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

时间: 2024-11-05 23:29:28

龙书11_chapter_6 二:HillsDemo解析的相关文章

龙书11_chapter_6 一:一般绘制流程

先看BoxDemo的前几节, 1.vertex input  Layout 2.vertexBuffer 3.IndexBuffer 4.vertexShader 5.constant Buffer 6.pixelShader 7.renderState 8.effect 1.vertex input  Layout Once we have defined a vertex structure, we need to provide Direct3D with a description of

龙书11_chapter_4 二:习题中的Adapter

如何计算设备的Adapter数? 主要参考MSDN:  EnumAdapters 在d3dApp.cpp文件InitDirect3D()接口中: HR(dxgiFactory->CreateSwapChain(md3dDevice, &sd, &mSwapChain)); //begin 检测本设备有几个图形卡 UINT myAdapterNums = 0; IDXGIAdapter *pAdapter; std::vector<IDXGIAdapter* > vAdap

龙书学习笔记(二)

补线代之余抽空把第四章上色学了,之所以说之余,是因为这一章内容确实不怎么多,不过为了巩固知识,便结合刚学的上色又做了一个小程序. 首先进行回顾,这一章学到的一共有四点: 一.Direct3D中颜色用RGB(Red.Green.Blue)三元组表示,用两种结构来保存 D3DCOLOR,即unsigned long,共32位,分成4个8位项,分别保存Alpha(这玩意的作用会在第七章学到).红.绿.蓝,均在0x00~0xff之间取值(就是0~255) 通过结构体来保存(D3DXCOLOR和D3DCO

龙书学习笔记(三)

在将第五章每个示例代码过了一遍之后,大致明白了光照这一章的内容,主要分为四点: 一.光照的类型分为三种,并且均通过结构D3DCOLORVALUE或D3DXCOLOR来表示光线的颜色 环境光(Ambient Light)经其它表面反射到达物体表面,并照亮整个场景,通常用做较低代价的粗略模拟. 漫射光(Diffuse Light)沿着特定的方向传播,到达某个表面后将沿着各个方向均匀反射,因此从各个方向观察物体表面亮度均相同. 镜面光(Specular Light)沿着特定的方向传播,到达一表面后将沿

龙书D3D11 Demo配置(VS2017+win7)

首先要感谢此博主的文章:https://blog.csdn.net/tjj00686/article/details/49110501  帮助了我. 我的龙书示例Demo代码来源:https://github.com/DrinkMoon/directx11-pratices 之前一直用VS 2010,突然心血来潮装了VS 2017,结果就有了此片随笔备忘. 先说结果:win7下面虽然能用VS2017编译成功,但是运行不了Demo. 提示:Demo的d3dDemo.sln文件位置:Exercise

[HLSL]HLSL 入门参考 (dx11龙书附录B译文)

原文:[HLSL]HLSL 入门参考 (dx11龙书附录B译文) HLSL 高级着色语言 参考文档 龙书DirectX12现已推出中文版,其附录B的高级着色器语言参考的翻译质量比本文更高,有条件的读者可以去支持一下. 目录 文章目录 目录 变量类型 标量类型 矢量类型 Swizzles 矩阵类型 数组 结构体 typedef 关键字 变量前缀 类型转换 (Casting) 关键字 和 (运)算符 关键字 (运)算符 流程语句 函数 自定义函数 内建函数 译注 变量类型 标量类型 bool: 值为

龙书(Dragon book) +鲸书(Whale book)+虎书(Tiger book)

1.龙书(Dragon book)书名是Compilers: Principles,Techniques,and Tools作者是:Alfred V.Aho,Ravi Sethi,Jeffrey D.Ullman国内所有的编译原理教材都是抄的它的,而且只是抄了最简单的前端的一些内容.龙书中文版第一版龙书英文版第二版 2.鲸书(Whale book)书名是:Advanced Compiler Design and Implementation作者是:Steven S.Muchnick也就是高级编译

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之8: Chap10: Lighting

这一章讲的是光照.光照(lighting)是Direct3D中非常重要的概念,而与之相对应的是材质(material)的概念.如果没有材质的话,那么光照的作用也无法体现. 在较早一些的关于DirectX 9的编程入门书籍里,一般是使用D3DLIGHT9结构体来建立一个光源,而用D3DMATERIAL9结构体来定义物体的材质.我们要做的就是一些很琐碎的家务活,基本上就是创建这些结构体对象.设定其中的参数.启用光照之类的,至于具体实现的细节就非吾等所需(和所能)操心的了. 不过在我们的"龙书&quo

龙书11_chapter_4 一: GameTime解读

看龙书DX11,首先是第四章,本文对GameTime类进行解释 问:此类主要实现了什么功能? 答:Returns the total time elapsed since Reset() was called, NOT counting any time when the clock is stopped. 从渲染窗口Reset开始记时,记录总共的时间.不包括此间的pause时间. 问:关键时间接口? 答: 1. //获取频率(取决于主板 OS相关,不是CPU的主频)参考:http://www.