07/01/2020
游戏对象
游戏对象(GameObject)
游戏对象由Transform变换信息和游戏对象的网格数据组成,简单的几何网格有平面,立方体,球,棱台等等
游戏对象的变换信息
Transform类
- 位置
- 朝向
- 缩放
游戏对象网格数据(Mesh)
- vertexbuffer,点坐标,点的法向量,贴图向量等等
- indexbuffer
- texture,纹理资源视图
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);
总结
每一个物体独有信息
- 变换矩阵,即位置,朝向和大小,由常量缓冲区保存
- 网格数据,即顶点和下标数组保存,由顶点和下标缓冲区保存
- 纹理图片,如果使用了纹理贴图而不是顶点颜色,那么需要使用纹理资源视图保存
- 材质信息,可以由常量缓冲区设置
- 更新函数,用来反映每一帧的变化
- 绘图函数,重新装配上述资源
本文深入探讨游戏对象(GameObject)的构成,包括变换信息、网格数据和纹理资源视图等核心元素。详细介绍了如何使用C++和DirectX创建顶点缓冲区、索引缓冲区及纹理资源视图,实现游戏对象的绘制过程。

1053

被折叠的 条评论
为什么被折叠?



