2024年大数据最新DirectX12(D3D12)基础教程(十七)—(1)

本文介绍了在DirectX12中如何定义数据布局,通过D3D12_INPUT_ELEMENT_DESC结构体设置数据上传到GPU的方式。讲解了LoadMesh函数的作用,并探讨了布局定义,包括InputSlot和偏移量的概念。接着,文章阐述了多Slot情况下如何创建缓冲区,特别是针对顶点数据的处理,展示了创建多个顶点数据缓冲区的方法。
摘要由CSDN通过智能技术生成

有了结构体,下一步就是组织代码把数据稍作转换,变换到我们的结构体中,这正好就是一开始我们说的LoadMesh函数做的事情:

BOOL LoadMesh(LPCSTR pszFileName, ST_GRS_MESH_DATA& stMeshData)
{
	stMeshData.m_nCurrentAnimIndex = 0;
	stMeshData.m_paiModel = g_aiImporter.ReadFile(pszFileName, ASSIMP_LOAD_FLAGS);

	if (nullptr == stMeshData.m_paiModel)
	{
		ATLTRACE("无法解析文件(%s):%s (%d)\n", pszFileName, g_aiImporter.GetErrorString(), ::GetLastError());
		return FALSE;
	}

	// 获取根节点的变换矩阵,其实就是 Module->World 的变换矩阵
	stMeshData.m_mxModel = XMMatrixTranspose(MXEqual(stMeshData.m_mxModel, stMeshData.m_paiModel->mRootNode->mTransformation));

	// 获取网格数量
	UINT nMeshCnt = stMeshData.m_paiModel->mNumMeshes;
	if ( 0 == nMeshCnt )
	{
		ATLTRACE("文件(%s)中没有网格数据!\n", pszFileName);
		return FALSE;
	}

	const aiMesh\* paiSubMesh = nullptr;
	const aiVector3D	Zero3D(0.0f, 0.0f, 0.0f);
	UINT nNumBones = 0;
	UINT nNumVertices = 0;
	UINT nNumIndices = 0;

	stMeshData.m_arSubMeshInfo.SetCount(nMeshCnt);

	// 加载Vertex基本信息
	for (UINT i = 0; i < nMeshCnt; i++)
	{
		paiSubMesh = stMeshData.m_paiModel->mMeshes[i];

		stMeshData.m_arSubMeshInfo[i].m_nMaterialIndex = paiSubMesh->mMaterialIndex;
		stMeshData.m_arSubMeshInfo[i].m_nNumIndices = paiSubMesh->mNumFaces \* GRS_INDICES_PER_FACE;
		stMeshData.m_arSubMeshInfo[i].m_nBaseVertex = nNumVertices;
		stMeshData.m_arSubMeshInfo[i].m_nBaseIndex = nNumIndices;

		// 当前Mesh的顶点数量和索引数量累加后,就是下个Mesh顶点和索引在整体缓冲中的索引开始位置
		nNumVertices	+= stMeshData.m_paiModel->mMeshes[i]->mNumVertices;
		nNumIndices		+= stMeshData.m_arSubMeshInfo[i].m_nNumIndices;		

		// 加载顶点常规数据
		for (UINT j = 0; j < paiSubMesh->mNumVertices; j++)
		{
			stMeshData.m_arPositions.Add(XMFLOAT4(paiSubMesh->mVertices[j].x
				, paiSubMesh->mVertices[j].y
				, paiSubMesh->mVertices[j].z
				, 1.0f));

			stMeshData.m_arNormals.Add(XMFLOAT4(paiSubMesh->mNormals[j].x
				, paiSubMesh->mNormals[j].y
				, paiSubMesh->mNormals[j].z
				, 0.0f));

			// 注意这个地方只考虑一个纹理的情况,其实最多可以有八个,可以再做个循环进行加载
			const aiVector3D\* pTexCoord = paiSubMesh->HasTextureCoords(0)
				? &(paiSubMesh->mTextureCoords[0][j])
				: &Zero3D;

			stMeshData.m_arTexCoords.Add(XMFLOAT2(pTexCoord->x, pTexCoord->y));
		}

		// 加载索引数据
		for (UINT j = 0; j < paiSubMesh->mNumFaces; j++)
		{
			const aiFace& Face = paiSubMesh->mFaces[j];
			// 已经通过导入标志强制为三角形网格了,每个面就三个索引
			ATLASSERT(Face.mNumIndices == GRS_INDICES_PER_FACE);

			for (UINT k = 0; k < Face.mNumIndices; k++)
			{
				stMeshData.m_arIndices.Add(Face.mIndices[k]);
			}
		}
	}

	stMeshData.m_arBoneIndices.SetCount(nNumVertices);

	UINT		VertexID = 0;
	FLOAT		Weight = 0.0f;
	UINT		nBoneIndex = 0;
	CStringA	strBoneName;
	aiMatrix4x4 mxBoneOffset;
	aiBone\*		pBone = nullptr;

	// 加载骨骼数据
	for (UINT i = 0; i < nMeshCnt; i++)
	{
		paiSubMesh = stMeshData.m_paiModel->mMeshes[i];

		for (UINT j = 0; j < paiSubMesh->mNumBones; j++)
		{
			nBoneIn
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值