在上一篇博客中,我们探讨了如何在QtOpenGL环境下使用改进的Uniform变量管理方式绘制多彩四边形。本文将延续这一主题,深入探讨如何在QtOpenGL环境下按需加载彩虹四边形的顶点属性。这一功能是Horse3D引擎渲染系统的重要组成部分,旨在实现灵活的顶点属性管理,支持多种几何体的渲染需求。
一、项目介绍
Horse3D引擎的渲染内核基于Qt与OpenGL开发,是一款三维引擎。本项目将不提供编辑器,以SDK的形式对外提供接口。本项目将参考Three.js与Unity等众多渲染引擎的API设计,致力于开发出一款具有竞争力的渲染引擎内核。
项目地址:
- Gitee
- GitHub
二、背景与目标
在现代3D渲染引擎中,顶点属性管理是渲染系统的核心功能之一。顶点属性(如位置、纹理坐标、法线等)决定了几何体在屏幕上的呈现方式。为了支持多种几何体的渲染需求,Horse3D引擎需要实现一个灵活的顶点属性管理系统,能够按需加载和管理顶点属性。
本篇博客的目标是实现以下功能:
- 顶点属性的定义与解析:从配置文件中定义顶点属性,包括属性名称和维度。
- 顶点属性的绑定:在渲染时,将顶点属性绑定到OpenGL的顶点缓冲对象(VBO)中。
- 顶点属性的动态管理:支持按需加载顶点属性,以适应不同的几何体渲染需求。
三、功能需求
在QtOpenGL环境下,按需加载彩虹四边形的顶点属性需要实现以下功能:
- 顶点属性的定义:通过JSON文件定义顶点属性,包括属性名称和维度。
- 顶点属性的解析:从JSON文件中解析顶点属性,并生成对应的顶点缓冲对象(VBO)。
- 顶点属性的绑定:在渲染时,将顶点属性绑定到OpenGL的顶点缓冲对象中。
- 顶点属性的动态管理:支持按需加载顶点属性,以适应不同的几何体渲染需求。
四、实现细节
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引擎可以进一步优化顶点属性的管理,例如:
- 支持更多的顶点属性类型:例如法线、切线、颜色等。
- 优化顶点属性的加载性能:例如通过缓存机制减少顶点属性的重复加载。
- 支持顶点属性的动态修改:例如在渲染过程中动态修改顶点属性的值。
通过这些优化,Horse3D引擎可以进一步提升渲染性能和灵活性,为开发者提供更强大的渲染功能。
六、参考文献
-
深入理解OpenGL中的Uniform变量
链接:https://blog.csdn.net/2503_92624912/article/details/150522330 -
深入解析:Unity、Unreal Engine与Godot引擎中的Uniform变量管理
链接:https://blog.csdn.net/2503_92624912/article/details/150534504 -
Horse3D游戏引擎研发笔记(一):从使用Qt的OpenGL库绘制三角形开始
链接:https://blog.csdn.net/2503_92624912/article/details/150006641 -
Horse3D游戏引擎研发笔记(二):基于QtOpenGL使用仿Three.js的BufferAttribute结构重构三角形绘制
链接:https://blog.csdn.net/2503_92624912/article/details/150063706 -
Horse3D游戏引擎研发笔记(三):使用QtOpenGL的Shader编程绘制彩色三角形
链接:https://blog.csdn.net/2503_92624912/article/details/150114327 -
Horse3D游戏引擎研发笔记(四):在QtOpenGL下仿three.js,封装EBO绘制四边形
链接:https://blog.csdn.net/2503_92624912/article/details/150235885 -
Horse3D游戏引擎研发笔记(五):在QtOpenGL环境下,仿three.js的BufferGeometry管理VAO和EBO绘制四边形
链接:https://blog.csdn.net/2503_92624912/article/details/150400945 -
Horse3D游戏引擎研发笔记(六):在QtOpenGL环境下,仿Unity的材质管理Shader绘制四边形
链接:https://blog.csdn.net/2503_92624912/article/details/150451239 -
Horse3D游戏引擎研发笔记(七):在QtOpenGL环境下,使用改进的Uniform变量管理方式绘制多彩四边形(相较于Unity、Unreal Engine、Three.js与Godot引擎)
链接:https://blog.csdn.net/2503_92624912/article/details/150563946
Pomian语言处理器 研发笔记(一):使用C++的正则表达式构建词法分析器