Horse3D游戏引擎研发笔记(八):在QtOpenGL环境下,按需加载彩虹四边形的顶点属性 (Unity、Unreal Engine、Three.js与Godot)

在上一篇博客中,我们探讨了如何在QtOpenGL环境下使用改进的Uniform变量管理方式绘制多彩四边形。本文将延续这一主题,深入探讨如何在QtOpenGL环境下按需加载彩虹四边形的顶点属性。这一功能是Horse3D引擎渲染系统的重要组成部分,旨在实现灵活的顶点属性管理,支持多种几何体的渲染需求。


一、项目介绍

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

项目地址:

  • Gitee
  • GitHub

二、背景与目标

在现代3D渲染引擎中,顶点属性管理是渲染系统的核心功能之一。顶点属性(如位置、纹理坐标、法线等)决定了几何体在屏幕上的呈现方式。为了支持多种几何体的渲染需求,Horse3D引擎需要实现一个灵活的顶点属性管理系统,能够按需加载和管理顶点属性。

本篇博客的目标是实现以下功能:

  1. 顶点属性的定义与解析:从配置文件中定义顶点属性,包括属性名称和维度。
  2. 顶点属性的绑定:在渲染时,将顶点属性绑定到OpenGL的顶点缓冲对象(VBO)中。
  3. 顶点属性的动态管理:支持按需加载顶点属性,以适应不同的几何体渲染需求。

三、功能需求

在QtOpenGL环境下,按需加载彩虹四边形的顶点属性需要实现以下功能:

  1. 顶点属性的定义:通过JSON文件定义顶点属性,包括属性名称和维度。
  2. 顶点属性的解析:从JSON文件中解析顶点属性,并生成对应的顶点缓冲对象(VBO)。
  3. 顶点属性的绑定:在渲染时,将顶点属性绑定到OpenGL的顶点缓冲对象中。
  4. 顶点属性的动态管理:支持按需加载顶点属性,以适应不同的几何体渲染需求。

四、实现细节

1. 顶点属性的定义与解析

在Horse3D引擎中,顶点属性的定义通过JSON文件实现。以下是顶点属性的JSON定义示例:

{"Attributes": [{"Name": "a_position","Dimension": 3},{"Name": "a_texcoord","Dimension": 2}]
}

在上述JSON文件中,Attributes数组定义了顶点属性。每个顶点属性包括以下信息:

  • Name:顶点属性的名称。
  • Dimension:顶点属性的维度。

在代码中,顶点属性的解析通过MaterialBuilder类实现。以下是MaterialBuilder类的代码示例:

Attribute* MaterialBuilder::createAttribute(const QJsonValue& attributeValue)
{Attribute* attribute = new Attribute();attribute->Name = attributeValue["Name"].toString();attribute->Dimension = attributeValue["Dimension"].toInt();return attribute;
}std::list<Attribute*> MaterialBuilder::createAttributes(const QJsonValue& attributesValue)
{std::list<Attribute*> attributes;QJsonArray attributeArray = attributesValue.toArray();int cnt = attributeArray.count();for (unsigned int idx = 0; idx < cnt; ++idx){Attribute* attribute = createAttribute(attributeArray.at(idx));attribute->Location = idx;attributes.push_back(attribute);}return attributes;
}

在上述代码中,createAttribute函数从JSON文件中解析单个顶点属性,createAttributes函数从JSON文件中解析所有顶点属性,并为每个顶点属性分配一个位置(Location)。


2. 顶点属性的绑定

在Horse3D引擎中,顶点属性的绑定通过IGeometry类实现。以下是IGeometry类的代码示例:

std::list<BufferAttribute*> IGeometry::createBufferAttributes(const std::list<Attribute*>& attributes)
{std::list<BufferAttribute*> bufferAttributes;for (Attribute* attribute : attributes){BufferAttribute* bufferAttribute = IGeometry::getBuilder(m_geometryName, attribute->Name)(attribute);if (bufferAttribute != nullptr){bufferAttributes.push_back(bufferAttribute);}}return bufferAttributes;
}void IGeometry::createOpenGLState(IScreen* screen, Material* material)
{screen->glGenVertexArrays(1, &m_vao);screen->glBindVertexArray(m_vao);m_bufferAttributes = createBufferAttributes(material->getAttributes());for (BufferAttribute* bufferAttribute : m_bufferAttributes){bufferAttribute->createOpenGLState(screen);}m_indicesAttribute = createIndicesAttribute();m_indicesAttribute->createOpenGLState(screen);
}

在上述代码中,createBufferAttributes函数根据顶点属性生成对应的BufferAttribute对象。createOpenGLState函数创建并绑定顶点数组对象(VAO),并将顶点属性绑定到OpenGL的顶点缓冲对象(VBO)中。


3. 顶点属性的动态管理

在Horse3D引擎中,顶点属性的动态管理通过Quadrangle类实现。以下是Quadrangle类的代码示例:

void Quadrangle::createAttributeBuilders()
{QString geometryName = QString::fromLocal8Bit(typeid(Quadrangle).name());addBuilder(geometryName, POSITION, [](Attribute* attribute) -> BufferAttribute*{return new BufferAttribute({-0.5f, 0.5f, 0.0f,-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.5f, 0.5f, 0.0f}, attribute->Location, attribute->Dimension);});addBuilder(geometryName, TEXCOORD, [](Attribute* attribute) -> BufferAttribute* {return new BufferAttribute({0.0f, 1.0f,0.0f, 0.0f,1.0f, 0.0f,1.0f, 1.0f,}, attribute->Location, attribute->Dimension);});
}

在上述代码中,createAttributeBuilders函数根据几何体类型(Quadrangle)创建顶点属性构建器。顶点属性构建器根据顶点属性的位置(Location)和维度(Dimension)生成顶点数据。


五、总结与展望

通过本文的实现,Horse3D引擎实现了在QtOpenGL环境下按需加载彩虹四边形的顶点属性。这一功能为引擎的渲染系统提供了灵活的顶点属性管理能力,支持多种几何体的渲染需求。

未来,Horse3D引擎可以进一步优化顶点属性的管理,例如:

  1. 支持更多的顶点属性类型:例如法线、切线、颜色等。
  2. 优化顶点属性的加载性能:例如通过缓存机制减少顶点属性的重复加载。
  3. 支持顶点属性的动态修改:例如在渲染过程中动态修改顶点属性的值。

通过这些优化,Horse3D引擎可以进一步提升渲染性能和灵活性,为开发者提供更强大的渲染功能。


六、参考文献

  1. 深入理解OpenGL中的Uniform变量
    链接:https://blog.csdn.net/2503_92624912/article/details/150522330

  2. 深入解析:Unity、Unreal Engine与Godot引擎中的Uniform变量管理
    链接:https://blog.csdn.net/2503_92624912/article/details/150534504

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

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

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

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

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

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

  9. Horse3D游戏引擎研发笔记(七):在QtOpenGL环境下,使用改进的Uniform变量管理方式绘制多彩四边形(相较于Unity、Unreal Engine、Three.js与Godot引擎)
    链接:https://blog.csdn.net/2503_92624912/article/details/150563946

Pomian语言处理器 研发笔记(一):使用C++的正则表达式构建词法分析器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94440.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模块化设计+微米级精度,GelSight Modulus 触觉型3D轮廓仪深入检测“盲区”

当航空航天工程师在精密舱体中搜寻微米级缺陷&#xff0c;汽车检查员在车间复杂结构里排查隐患&#xff0c;能源领域创新者尝试突破检测边界时&#xff0c;深耕视触觉 3D 显微技术的企业——GelSight&#xff0c;正以全新研发的GelSight Modulus触觉型3D轮廓仪&#xff08;简称…

Pytorch安装详细步骤

第一步&#xff1a;检查显卡支持的的CUDA版本 1.打开NVIDIA控制面板 首先鼠标右击桌面-显示更多选项-NVIDIA控制面板-点击弹出界面右上角的(系统信息)-点击弹出界面的(组件) 2.查看驱动版本 打开系统信息 点击组件,查看 以观测到红色方框内的信息可以看到(NVIDIA CUDA 13.0.…

2025职场进阶:低门槛技能实用手册

每到年初&#xff0c;都会有人问&#xff1a;如果只能投入有限的时间与预算&#xff0c;先考哪一两本证书更划算&#xff1f;本文把近两年的岗位需求、学习可获得性与花费周期做了综合权衡&#xff0c;给出一个以“先提升通用能力&#xff0c;再叠加行业资质”为主线的组合方案…

SDC命令详解:使用set_timing_derate命令进行约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定降额比例 指定降额对象列表/集合 指定沿 指定最大、最小条件 指定早、晚条件 指定路径的类型 指定降额类型 指定约束 指定增量 写在最后 由于制造…

C++语言程序设计——03 进制ASCII码

目录一、进制表示与转换&#xff08;一&#xff09;不同进制表示&#xff08;二&#xff09;进制转换方法二、ASCII 码&#xff08;一&#xff09;ASCII 码表&#xff08;二&#xff09;ASCII 码转换&#xff08;三&#xff09;大小写英文字母转换【总结&#xff1a;如何记忆AS…

AtCoder Beginner Contest 420-Toggle Maze

题目描述 有一个 H行 W 列的网格。用 (i,j) 表示位于第 i 行&#xff08;从上往下数&#xff09;第 j 列&#xff08;从左往右数&#xff09;的格子。每个格子的状态用字符 Ai,j表示&#xff0c;含义如下&#xff1a; . &#xff1a;空格子。 #’ &#xff1a;障碍格子。 S &am…

20、DMA----释放CPU压力,加快传输

1、DMA介绍DMA&#xff0c;全称为&#xff1a;Direct Memory Access&#xff0c;即直接存储器访问。DMA传输方式无需CPU直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为RAM与I/O设备开辟一条直接传送数据的通路&#xff0c;能使…

深入OpenHarmony OTA硬核升级

技术背景 OpenHarmony OTA(Over-The-Air)升级子系统为设备提供了远程升级能力,通过统一的升级接口屏蔽底层芯片差异,支持轻量系统、小型系统和标准系统的全量升级、差分升级和变分区升级。 核心特性 跨系统支持:覆盖轻量系统(Hi3861)、小型系统(Hi3516DV300)、标准系…

华为iVS1800接入SVMSPro平台

华为iVS1800接入SVMSPro平台 ** 华为好望Huawei HolosensIVS1800智能视频云平台采用首款昇腾310加持的嵌入式系统智能微边缘&#xff0c;独俱普惠AI鸿力。一台融合存储、计算、检索功能&#xff0c;满足小型园区、社区、银行网点、超市等场景安防需求&#xff0c;小机大智。 …

《异形战机2》v2.0.4数字豪华版,3D横版射击再临,机体武器海量升级

[游戏名称]: 《异形战机2》v2.0.4数字豪华版 [软件大小]: 17.7 GB [软件大小]: 夸克网盘 | 百度网盘 游戏介绍 《异形战机&#xff1a;最终版2》续作震撼登场&#xff01;经典横版射击全面升级&#xff1a;3D 画面炫目、关卡与机体海量扩充&#xff0c;只为带来酣畅淋漓的灭…

Java 异常(Throwable)

1. Throwable Throwable: 所有异常和错误的根类。实现 Throwable 或其子类的对象才能被 throw 或 catch。 Error: 表示严重的系统级问题&#xff0c;通常不应该被捕获或处理&#xff0c;程序通常无法从中恢复。 Exception: 表示程序可以处理的问题。分为 运行时异常、 受检异常…

rocketmq常用命令

官方文档 https://rocketmq.apache.org/zh/docs/ https://rocketmq.apache.org/zh/docs/domainModel/02topic/ https://rocketmq.apache.org/zh/docs/4.x/deployment/02admintool 集群配置管理 https://mp.weixin.qq.com/s/688wNSwZPraGvAnr0K7hRw RocketMQ运维管理命令mqadm…

【C++详解】哈希表概念与实现 开放定址法和链地址法、处理哈希冲突、哈希函数介绍

文章目录一、unordered系列的使用unordered_set类的介绍unordered_set和set的使⽤差异unordered_map和map的使⽤差异unordered_xxx的哈希相关接⼝二、哈希表实现哈希概念直接定址法哈希冲突负载因⼦将关键字转为整数哈希函数除法散列法/除留余数法乘法散列法处理哈希冲突开放定…

电影感人文街拍摆摊纪实摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍电影感人文街拍摆摊纪实摄影后期 Lr 调色是一种专注于捕捉街头生活烟火气的摄影风格&#xff0c;通过 Lightroom 后期调色赋予画面电影般的叙事感和情感深度。这种风格以摆摊小贩、市井行人、街头场景为主体&#xff0c;强调真实、自然的生活瞬间。调色核心在于低饱和暖…

【数据分享】298个地级市人工智能企业数量(1990-2023)

数据介绍引言人工智能产业作为数字经济的核心驱动力&#xff0c;其发展规模与分布格局深刻反映区域科技创新活力与产业升级潜力。为助力相关研究&#xff0c;本文分享一份涵盖全国 298 个地级市 1990-2023 年的人工智能企业核心数据&#xff0c;包含人工智能企业存量和人工智能…

LeetCode 面试经典 150_双指针_验证回文串(25_125_C++_简单)(双指针)

LeetCode 面试经典 150_数组/字符串_验证回文串&#xff08;25_125_C_简单&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;双指针&#xff09;&#xff1a;代码实现代码实现&#xff08;思路一&#xff08;双…

无障碍辅助模块|Highcharts引领可访问数据可视化的交流

在现代数据可视化中&#xff0c;无障碍辅助技术已成为必不可少的一部分。对于视障人士或使用屏幕阅读器的用户来说&#xff0c;传统图表往往难以获取有效信息&#xff0c;而 Highcharts 在设计之初便充分考虑了无障碍体验。 Highcharts作为可访问数据可视化的倡导者&#xff0…

从0到1:数据库进阶之路,解锁SQL与架构的奥秘

目录一、SQL 基础启航1.1 SQL 基础语法1.2 SQL 进阶查询1.3 SQL 实战案例分析二、分库分表实战2.1 分库分表的背景与原理2.2 分库分表策略设计2.3 分布式 ID 生成2.4 数据迁移方案三、中间件实战3.1 中间件概述3.2 DBLE 中间件实战3.3 MyCat 中间件实战四、高可用架构搭建4.1 高…

【数据结构入门】排序算法(2):直接选择排序->堆排序

目录 1.直接选择排序 1.1 思想 1.2 代码 2.堆排序 2.1 向下调整算法 2.1.1 代码 2.2 建堆 2.2.1 代码 2.3 正式排序 2.3.1 代码 3. 冒泡排序 3.1 思路 3.1.1 单趟排序 3.1.2 多趟排序 3.1.3优化 3.2 代码 1.直接选择排序 1.1 思想 每次从未排序区中选择一个最小…

Fluent Bit系列:字符集转码测试(下)

#作者&#xff1a;程宏斌 文章目录fluent-bit 1.9.4 转换测试结论接上篇&#xff1a;《Fluent Bit系列&#xff1a;字符集转码测试&#xff08;上&#xff09;》https://blog.csdn.net/qq_40477248/article/details/150776142?spm1001.2014.3001.5501fluent-bit 1.9.4 转换测试…