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

本文深入探讨游戏对象(GameObject)的构成,包括变换信息、网格数据和纹理资源视图等核心元素。详细介绍了如何使用C++和DirectX创建顶点缓冲区、索引缓冲区及纹理资源视图,实现游戏对象的绘制过程。

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);

总结

每一个物体独有信息

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

X_Jun博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值