【Overload游戏引擎】源码分析之七:OvRendering函数库(五)

本文深入分析Overload游戏引擎中AssimpParser的源码,探讨如何利用Assimp库导入和处理3D模型数据。重点介绍了LoadModel、ProcessMaterials、ProcessNode和ProcessMesh等函数,详细解释了模型导入过程,包括从文件读取、材质处理、节点和网格的遍历,以及如何处理顶点信息。
摘要由CSDN通过智能技术生成

2021SC@SDUSC

目录

Parser

1.IModelParser

2.EModelParserFlags

3.AssimpParser

3.1LoadModel

3.2ProcessMaterials

3.3ProcessNode

3.4ProcessMesh


本章我们继续来讲OvRendering中的函数。首先需要简单了解两种类型的函数,这将会对以后的章节有所帮助。

Parser

1.IModelParser

	/**
	* Interface for any model parser
	*/
	class IModelParser
	{
	public:
		/**
		* Load meshes from a file
		* Return true on success
		* @param p_filename
		* @param p_meshes
		* @param p_parserFlags
		*/
		virtual bool LoadModel
		(
			const std::string& p_fileName,
			std::vector<Mesh*>& p_meshes,
			std::vector<std::string>& p_materials,
			EModelParserFlags p_parserFlags
		) = 0;
	};

我们可以看到这是一个用于解析模型的接口类,其中只有一个纯虚函数,通过注释我们了解到,它的作用是从文件中加载网格信息。函数的参数包括了文件名、网格容器的引用、材质贴图的引用,以及一个EModelParserFlags类型的解析器枚举值。

LoadModel将会返回当前文件的网格是否加载成功,它的具体操作将会在派生的子类中实现。

2.EModelParserFlags

下列的枚举值与内联函数是对EModelParserFlags的补充,主要用于对模型中的区分与识别不同的模型节点,并对其进行算术运算。

/**
	* Some flags that can be used for model parsing
	*/
	enum class EModelParserFlags : uint32_t
	{
		NONE						= 0x0,
		CALC_TANGENT_SPACE			= 0x1,
		JOIN_IDENTICAL_VERTICES		= 0x2,
		MAKE_LEFT_HANDED			= 0x4,
		TRIANGULATE					= 0x8,
		REMOVE_COMPONENT			= 0x10,
		GEN_NORMALS					= 0x20,
		GEN_SMOOTH_NORMALS			= 0x40,
		SPLIT_LARGE_MESHES			= 0x80,
		PRE_TRANSFORM_VERTICES		= 0x100,
		LIMIT_BONE_WEIGHTS			= 0x200,
		VALIDATE_DATA_STRUCTURE		= 0x400,
		IMPROVE_CACHE_LOCALITY		= 0x800,
		REMOVE_REDUNDANT_MATERIALS	= 0x1000,
		FIX_INFACING_NORMALS		= 0x2000,
		SORT_BY_PTYPE				= 0x8000,
		FIND_DEGENERATES			= 0x10000,
		FIND_INVALID_DATA			= 0x20000,
		GEN_UV_COORDS				= 0x40000,
		TRANSFORM_UV_COORDS			= 0x80000,
		FIND_INSTANCES				= 0x100000,
		OPTIMIZE_MESHES				= 0x200000,
		OPTIMIZE_GRAPH				= 0x400000,
		FLIP_UVS					= 0x800000,
		FLIP_WINDING_ORDER			= 0x1000000,
		SPLIT_BY_BONE_COUNT			= 0x2000000,
		DEBONE						= 0x4000000,
        GLOBAL_SCALE				= 0x8000000,
        EMBED_TEXTURES				= 0x10000000,
        FORCE_GEN_NORMALS			= 0x20000000,
        DROP_NORMALS				= 0x40000000,
        GEN_BOUNDING_BOXES			= 0x80000000
	};
	
	inline EModelParserFlags operator~ (EModelParserFlags a) { return (EModelParserFlags)~(int)a; }
	inline EModelParserFlags operator| (EModelParserFlags a, EModelParserFlags b) { return (EModelParserFlags)((int)a | (int)b); }
	inline EModelParserFlags operator& (EModelParserFlags a, EModelParserFlags b) { return (EModelParserFlags)((int)a & (int)b); }
	inline EModelParserFlags operator^ (EModelParserFlags a, EM
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值