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


一、项目介绍

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

项目地址:


二、背景与目标

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

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐