2021SC@SDUSC
通过阅读源码文件和查阅相关资料,笔者发现Dust 3D使用的图形引擎是(基于Qt的)OpenGL,或者说QOpenGL。就Qt 5.0 而言,QOpenGL是建立在OpenGL ES(Embeded System) 2.0规范上的,可以说是OpenGL ES 3.0的弱化版本。事实上OpenGL ES 2.0是2004年发布的一个相当古老的版本,并不支持部分相对先进的OpenGL方法、数据格式、快捷算法等功能。笔者认为之所以选用2.0版本,一方面是因为Dust 3D是一个跨平台的开源项目,而OpenGL ES 2.0规范基本上被所有移动平台和现代PC平台支持,因此选用QOpenGL可以在很大程度上保证Dust 3D的可移植性,为跨平台开发提供更多便利。另一方面因为Dust 3D本身目的是借助辅助建模、辅助动画等功能加速游戏开发或影视制作流程,所以对渲染方面没有太多的要求,只需要保证软件的交互式操作视窗能够流畅运行即可,即使不用高版本的OpenGL方法也可以实现。
由于渲染模块涉及到多个CPP源文件,笔者会结合不同文件之间的调用关系和重要性对这些文件展开分析。
代码分析
texturetype.h 和 texturetype.cpp
Texturetype文件中定义了Dust 3D所使用的贴图类型和一些转换函数。根据枚举类TextureType,可知这些类型包括None-空类型、 BaseColor-颜色贴图(准确来说应该是Diffuse-漫射贴图)、Normal-法线贴图、Metallic-光泽度贴图、Roughness-粗糙度贴图、Ambient Occlusion-环境遮蔽贴图。Count在后面的函数暂时没有看到被使用,推测是用于计数之类的目的。
enum class TextureType
{
None,
BaseColor,
Normal,
Metallic,
Roughness,
AmbientOcclusion,
Count
};
头文件中有三个转换函数:QString TextureTypeToDispName(TextureType type), const char *TextureTypeToString(TextureType type), TextureType TextureTypeFromString(const char *typeString),用途是TextureType类型和字符串的相互转换。
其中TextureTypeToDispName()将TextureType类型转换成用于界面显示的字符串,调用了tr()函数,例如QObject::tr("Base Color")。tr()函数是Qt中软件国际化的核心功能,只要通过tr()传递将要显示在用户界面上的字符串,Qt就会根据用户的语言环境将字符串替换成翻译人员使用Qt Linguist做好本地化的版本。
其他两个函数是将材质类型字符串和对应的枚举类型相互转换,功能比较简单,这里不再赘述。
QString TextureTypeToDispName(TextureType type)
{
switch (type) {
case TextureType::BaseColor:
return QObject::tr("Base Color");
case TextureType::Normal:
return QObject::tr("Normal Map&#