DX(十二):简单图元的游戏对象

    技术2022-07-10  80

    07/01/2020

    游戏对象

    游戏对象(GameObject)游戏对象的变换信息游戏对象网格数据(Mesh)C++代码SetBuffer函数几何图元(Mesh) 创建顶点缓冲区和索引缓冲区顶点缓冲区 纹理资源视图(ID3D11ShaderResourceView)绘制函数 Draw 总结

    游戏对象(GameObject)

    游戏对象由Transform变换信息和游戏对象的网格数据组成,简单的几何网格有平面,立方体,球,棱台等等

    游戏对象的变换信息

    Transform类

    位置朝向缩放

    游戏对象网格数据(Mesh)

    vertexbuffer,点坐标,点的法向量,贴图向量等等indexbuffertexture,纹理资源视图

    C++代码

    class GameObject { public: GameObject(); // 获取物体变换 Transform& GetTransform(); // 获取物体变换 const Transform& GetTransform() const; // 设置缓冲区 template<class VertexType, class IndexType> void SetBuffer(ID3D11Device * device, const Geometry::MeshData<VertexType, IndexType>& meshData); // 设置纹理 void SetTexture(ID3D11ShaderResourceView * texture); // 绘制 void Draw(ID3D11DeviceContext * deviceContext); // 设置调试对象名 // 若缓冲区被重新设置,调试对象名也需要被重新设置 void SetDebugObjectName(const std::string& name); private: Transform m_Transform; // 物体变换信息 ComPtr<ID3D11ShaderResourceView> m_pTexture; // 纹理资源视图 ComPtr<ID3D11Buffer> m_pVertexBuffer; // 顶点缓冲区 ComPtr<ID3D11Buffer> m_pIndexBuffer; // 索引缓冲区 UINT m_VertexStride; // 顶点字节大小 UINT m_IndexCount; // 索引数目 };

    SetBuffer函数

    SetBuffer主要创建顶点缓冲区和索引缓冲区,在创建它们之前,我们必须知道游戏对象的顶点信息

    void SetBuffer(ID3D11Device * device, const Geometry::MeshData<VertexType, IndexType>& meshData);

    几何图元(Mesh)

    网格数据保存信息:顶点数组和索引数组 顶点数组

    点坐标法向量切向量颜色纹理坐标

    索引数组

    索引下标 // 创建球体网格数据,levels和slices越大,精度越高。 //VertexType 表示顶点数组储存的类型 //IndexType 表示索引数组储存的类型 template<class VertexType = VertexPosNormalTex, class IndexType = DWORD> MeshData<VertexType, IndexType> CreateSphere(float radius = 1.0f, UINT levels = 20, UINT slices = 20, const DirectX::XMFLOAT4& color = { 1.0f, 1.0f, 1.0f, 1.0f }); // 创建立方体网格数据 template<class VertexType = VertexPosNormalTex, class IndexType = DWORD> MeshData<VertexType, IndexType> CreateBox(float width = 2.0f, float height = 2.0f, float depth = 2.0f, const DirectX::XMFLOAT4& color = { 1.0f, 1.0f, 1.0f, 1.0f });

    创建顶点缓冲区和索引缓冲区

    当确定完游戏对象的顶点数组和索引数组后,我们就可以创建顶点缓冲区和索引缓冲区了,在局部坐标系下,这两个缓冲区保存了游戏对象的网格数据

    顶点缓冲区

    顾名思义,顶点缓冲区存放的是一连串的顶点数据,尽管缓冲区的数据实际上还是一堆二进制流,但在传递给输入装配阶段的时候,就会根据顶点输入布局将其装配成HLSL的顶点结构体数据。顶点缓冲区的数据可以用自定义的顶点结构体数组来初始化。顶点可以包含的成员有:顶点坐标(必须有),顶点颜色,顶点法向量,纹理坐标,顶点切线向量等等。每个顶点的成员必须匹配合适的DXGI数据格式。

    当然,纯粹的顶点数组只是针对单个物体而言的。如果需要绘制大量相同的物体,需要同时用到多个顶点缓冲区。这允许你将顶点数据分开成多个顶点缓冲区来存放。

    纹理资源视图(ID3D11ShaderResourceView)

    每一个游戏对象,都应该对应一个或多个纹理资源视图

    绘制函数 Draw

    每一个游戏对象需要重新装配着色器,加载它们独有的顶点缓冲区,索引缓冲区,常量缓冲区,纹理资源视图等等,最后一步才是上下文的绘图函数

    // 绘制 void Draw(ID3D11DeviceContext * deviceContext);

    总结

    每一个物体独有信息

    变换矩阵,即位置,朝向和大小,由常量缓冲区保存网格数据,即顶点和下标数组保存,由顶点和下标缓冲区保存纹理图片,如果使用了纹理贴图而不是顶点颜色,那么需要使用纹理资源视图保存材质信息,可以由常量缓冲区设置更新函数,用来反映每一帧的变化绘图函数,重新装配上述资源

    X_Jun博客园

    Processed: 0.013, SQL: 9