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

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++的正则表达式构建词法分析器