当前位置: 首页 > news >正文

Horse3D游戏引擎研发笔记(九):使用现代图形引擎的元数据管理纹理创建过程(类Unity、Unreal Engine与Godot)

引言

在现代三维游戏引擎中,纹理管理是渲染管线中的关键环节之一。纹理为模型表面提供了丰富的细节和视觉效果,而高效的纹理管理则直接影响着引擎的性能和渲染质量。在Horse3D引擎的开发过程中,我们致力于打造一个灵活且高效的纹理管理系统,以支持复杂的三维场景渲染。

本篇博客将详细介绍Horse3D引擎中纹理的元数据管理机制,以及纹理从创建到渲染的完整流程。通过元数据管理,我们可以实现纹理属性的灵活配置,而无需修改引擎的核心代码。同时,结合OpenGL的底层操作,我们能够实现高质量的纹理渲染效果。


纹理元数据管理

在Horse3D引擎中,纹理的元数据是通过JSON文件进行描述的。每个纹理文件都包含了以下关键信息:

{"Type": "Target2D","Src": "Materials/Test/horse.png","WrapMode": "Repeat","MinificationFilter": "Nearest","MagnificationFilter": "Nearest"
}
  • Type:指定纹理的目标类型。当前支持Target2D纹理类型。
  • Src:指定纹理的源文件路径。
  • WrapMode:指定纹理的环绕模式,支持RepeatMirroredRepeatClampToEdgeClampToBorder
  • MinificationFilter:指定缩小过滤模式,支持NearestLinearNearestMipMapNearestNearestMipMapLinearLinearMipMapNearestLinearMipMapLinear
  • MagnificationFilter:指定放大过滤模式,支持NearestLinear

通过这种元数据管理方式,我们可以灵活地配置纹理的属性,而无需修改引擎的核心代码。同时,元数据的使用也为未来的扩展提供了便利。


纹理创建过程

在Horse3D引擎中,纹理的创建过程可以分为以下几个主要步骤:

1. 读取元数据文件

我们使用QHutu工具来读取纹理的元数据文件:

QString text = QHutu::readTextFile(QHutu::applicationDirPath(filepath));

2. 解析元数据

将读取到的文本解析为JSON对象:

QJsonDocument document = QJsonDocument::fromJson(text.toLocal8Bit());
QJsonObject rootObject = document.object();

3. 创建QOpenGLTexture对象

根据元数据中的Type属性,创建相应的QOpenGLTexture对象:

QOpenGLTexture* texture = createQOpenGLTexture(rootObject.value("Type").toString());

createQOpenGLTexture函数的实现如下:

QOpenGLTexture* createQOpenGLTexture(const QString& target)
{static std::map<QString, QOpenGLTexture::Target> targetMap = {{ "Target2D", QOpenGLTexture::Target2D }};QOpenGLTexture::Target textureTarget = QOpenGLTexture::Target2D;if (targetMap.find(target) != targetMap.cend()) {textureTarget = targetMap.at(target);}return new QOpenGLTexture(textureTarget);
}

4. 加载纹理数据

从元数据中的Src属性指定的路径加载纹理图像,并将其设置到QOpenGLTexture对象中:

texture->setData(QImage(QHutu::applicationDirPath(srcValue.toString())).mirrored());

5. 设置纹理参数

根据元数据中的WrapModeMinificationFilterMagnificationFilter属性,设置QOpenGLTexture对象的相关参数:

if (rootObject.contains("WrapMode")) {texture = setWrapMode(texture, rootObject.value("WrapMode").toString());
}
texture = setFilter(texture, rootObject);

setWrapMode函数的实现如下:

QOpenGLTexture* setWrapMode(QOpenGLTexture* texture, const QString& wrapMode)
{static std::map<QString, QOpenGLTexture::WrapMode> wrapModeMap = {{ "Repeat", QOpenGLTexture::Repeat },{ "MirroredRepeat", QOpenGLTexture::MirroredRepeat },{ "ClampToEdge", QOpenGLTexture::ClampToEdge },{ "ClampToBorder", QOpenGLTexture::ClampToBorder }};if (wrapModeMap.find(wrapMode) != wrapModeMap.cend()) {texture->setWrapMode(wrapModeMap.at(wrapMode));}return texture;
}

setFilter函数的实现如下:

QOpenGLTexture* setFilter(QOpenGLTexture* texture, const QJsonObject& rootObject)
{static std::map<QString, QOpenGLTexture::Filter> filterMap = {{ "Nearest", QOpenGLTexture::Nearest },{ "Linear", QOpenGLTexture::Linear },{ "NearestMipMapNearest", QOpenGLTexture::NearestMipMapNearest },{ "NearestMipMapLinear", QOpenGLTexture::NearestMipMapLinear },{ "LinearMipMapNearest", QOpenGLTexture::LinearMipMapNearest },{ "LinearMipMapLinear", QOpenGLTexture::LinearMipMapLinear }};if (rootObject.contains("MagnificationFilter")) {QString magnificationFilter = rootObject.value("MagnificationFilter").toString();if (filterMap.find(magnificationFilter) != filterMap.cend()) {texture->setMagnificationFilter(filterMap.at(magnificationFilter));}}if (rootObject.contains("MinificationFilter")) {QString minificationFilter = rootObject.value("MinificationFilter").toString();if (filterMap.find(minificationFilter) != filterMap.cend()) {texture->setMinificationFilter(filterMap.at(minificationFilter));}}return texture;
}

6. 返回纹理对象

将配置好的QOpenGLTexture对象包装到FileTexture对象中,并返回给调用者:

FileTexture* fileTexture = new FileTexture();
fileTexture->setQOpenGLTexture(texture);
return fileTexture;

效果展示

通过上述实现,我们可以成功地创建并加载纹理。以下是引擎渲染的结果:
在这里插入图片描述

在图中,我们可以看到纹理被正确地应用到模型表面,并且纹理的环绕模式和过滤模式也按照元数据中的配置进行了设置。


总结与展望

通过本篇博客,我们详细讲解了Horse3D引擎中纹理的元数据管理以及纹理创建的整个过程。通过元数据管理,我们可以灵活地配置纹理的属性,而无需修改引擎的核心代码。同时,通过OpenGL的纹理操作,我们可以实现高质量的纹理渲染效果。

未来,我们计划在以下方面对引擎进行改进:

  1. 支持更多纹理类型:除了当前支持的Target2D纹理类型外,我们计划支持TargetCubeMap等其他纹理类型。
  2. 优化纹理加载性能:通过引入纹理压缩和异步加载等技术,进一步优化纹理的加载性能。
  3. 增加纹理调试工具:为开发者提供更多的纹理调试工具,以便快速定位和解决问题。

通过不断的改进和优化,我们希望Horse3D引擎能够成为一个功能强大、易于使用的三维渲染引擎。


项目介绍

Horse3D引擎的渲染内核基于Qt与OpenGL开发,是一款三维引擎。本项目将不提供编辑器,以SDK的形式对外提供接口。本项目将参考Three.js与Unity等众多渲染引擎的API设计,致力于开发出一款具有竞争力的渲染引擎内核。

项目地址

  • Gitee
  • GitHub

参考文献

  1. 深入理解QtOpenGL纹理
    链接:https://blog.csdn.net/2503_92624912/article/details/151143352

  2. 深入理解OpenGL纹理
    链接:https://blog.csdn.net/2503_92624912/article/details/151084203

  3. Unity、Unreal Engine与Godot中纹理元数据管理的比较分析
    链接:https://blog.csdn.net/2503_92624912/article/details/150989703

  4. 深入理解纹理与QtOpenGL的实现
    链接:https://blog.csdn.net/2503_92624912/article/details/150656264

  5. 深入理解Unity中的.meta文件:以纹理文件为例
    链接:https://blog.csdn.net/2503_92624912/article/details/150611353

  6. Horse3D游戏引擎研发笔记(一):从使用Qt的OpenGL库绘制三角形开始
    链接:https://blog.csdn.net/2503_92624912/article/details/150006641

  7. Horse3D游戏引擎研发笔记(二):基于QtOpenGL使用仿Three.js的BufferAttribute结构重构三角形绘制
    链接:https://blog.csdn.net/2503_92624912/article/details/150063706

  8. Horse3D游戏引擎研发笔记(三):使用QtOpenGL的Shader编程绘制彩色三角形
    链接:https://blog.csdn.net/2503_92624912/article/details/150114327

  9. Horse3D游戏引擎研发笔记(四):在QtOpenGL下仿three.js,封装EBO绘制四边形
    链接:https://blog.csdn.net/2503_92624912/article/details/150235885

  10. Horse3D游戏引擎研发笔记(五):在QtOpenGL环境下,仿three.js的BufferGeometry管理VAO和EBO绘制四边形
    链接:https://blog.csdn.net/2503_92624912/article/details/150400945

  11. Horse3D游戏引擎研发笔记(六):在QtOpenGL环境下,仿Unity的材质管理Shader绘制四边形
    链接:https://blog.csdn.net/2503_92624912/article/details/150451239

  12. Horse3D游戏引擎研发笔记(七):在QtOpenGL环境下,使用改进的Uniform变量管理方式绘制多彩四边形
    链接:https://blog.csdn.net/2503_92624912/article/details/150563946

  13. Horse3D游戏引擎研发笔记(八):在QtOpenGL环境下,按需加载彩虹四边形的顶点属性
    链接:https://blog.csdn.net/2503_92624912/article/details/150774956


感谢大家的阅读,如果对Horse3D引擎感兴趣,欢迎访问我们的项目仓库或参与讨论!


文章转载自:

http://fZ1EeFDj.msgrq.cn
http://519yV4hN.msgrq.cn
http://Mq0GlKNt.msgrq.cn
http://nnV34dEl.msgrq.cn
http://VKBgAtnv.msgrq.cn
http://yqxXmrVs.msgrq.cn
http://gXh8DXj4.msgrq.cn
http://i67IyLdn.msgrq.cn
http://VzuBIHdb.msgrq.cn
http://CBYudwWU.msgrq.cn
http://fCSnEKEa.msgrq.cn
http://DItcQTtj.msgrq.cn
http://dChZZls1.msgrq.cn
http://rDrTD7DM.msgrq.cn
http://hrcw3vrb.msgrq.cn
http://2ng4BpQg.msgrq.cn
http://egZD9uj6.msgrq.cn
http://4KwZTjt2.msgrq.cn
http://DYyfXvBI.msgrq.cn
http://LlwQRYx5.msgrq.cn
http://PhIC6oHI.msgrq.cn
http://1kXDOuFp.msgrq.cn
http://TMfN6CRg.msgrq.cn
http://ZPLWoNGe.msgrq.cn
http://bSZyd3ay.msgrq.cn
http://82a2x0YG.msgrq.cn
http://n7MupFVg.msgrq.cn
http://14FE0HWl.msgrq.cn
http://QY7pP102.msgrq.cn
http://IwlqHfVg.msgrq.cn
http://www.dtcms.com/a/366130.html

相关文章:

  • vue2 打包生成的js文件过大优化
  • 【iOS】对象复制与属性关键字
  • Linux编程——网络编程(UDP)
  • 当液态玻璃计划遭遇反叛者:一场 iOS 26 界面的暗战
  • 大语言模型推理的幕后英雄:深入解析Prompt Processing工作机制
  • 计算机大数据毕业设计推荐:基于Spark的新能源汽车保有量可视化分析系统
  • 如何轻松地将联系人从 Mac 同步到 iPhone
  • 如何本地编译servicecomb-java-chassis
  • 系统越拆越乱?你可能误解了微服务的本质!
  • 商城源码后端性能优化:JVM 参数调优与内存泄漏排查实战
  • SVN和Git两种版本管理系统对比
  • Clang 编译器:下载安装指南与实用快捷键全解析
  • Java全栈开发面试实录:从基础到微服务的深度探索
  • CentOS系统如何查看当前内存容量
  • SuperSocket 动态协议服务端开发全解析
  • RTSP 协议认证机制详解:Basic 与 Digest 的原理与应用
  • 小迪安全v2023学习笔记(七十七讲)—— 业务设计篇隐私合规检测重定向漏洞资源拒绝服务
  • 【RNN-LSTM-GRU】第四篇 GRU门控循环单元:LSTM的高效替代者与实战指南
  • 为何三折叠手机只有华为可以?看华为Mate XTs非凡大师就知道
  • 2025年09月03日最热门的开源项目(Github)
  • Redis底层实现原理之五大基础结构
  • 云手机与网络游戏相结合的优势?
  • Docker学习笔记(二):镜像与容器管理
  • 20. 云计算-华为云-云服务
  • 域名注册后,为什么还需要域名解析?
  • 嵌入式硬件 - 51单片机3
  • 操作系统(二) :进程与线程
  • 力扣14:最长公共前缀
  • 【面试题】生成式搜索能否保证top-1的准确性?
  • C++类和对象(上):从设计图到摩天大楼的构建艺术