Qt 3D渲染几何形状

Qt 3D渲染提供了一种通用的方法来存储几何数据以及指定如何由渲染器读取。

缓冲区

Qt3DCore::QBuffer类存储原始数据。这纯粹是一个内存数组。在大多数情况下,Qt3DCore::QBuffer将由一个或多个Qt3DRender::QAttributes间接引用而使用。然而,在某些时候,处理统一缓冲对象(UBO)或着色器存储缓冲区对象(SSBO)时,QBuffer可以作为QParameter的值属性直接使用。

Buffer {
    id: vertexBuffer
    type: Buffer.VertexBuffer
    data: buildVertexBufferData()
}

属性

Qt3DCore::QAttribute指定如何提取引用的缓冲区中的数据并将其传递给顶点着色器的输入。它引用一个Qt3DCore::QBuffer并可以通过定义顶点大小、数据类型、两个顶点之间的步长以及起始偏移来指定属性的布局。属性的类型也将定义它是否被用作顶点缓冲区或索引缓冲区。这允许你在缓冲区中具有完全的灵活性来组织你的数据。可以使用单独的缓冲区存储每个顶点属性、包含所有属性数据的交错缓冲区或两者的组合。

Attribute {
    attributeType: Attribute.VertexAttribute
    vertexBaseType: Attribute.Float
    vertexSize: 3
    byteOffset: 0
    byteStride: 9 * 4
    count: 4
    name: defaultPositionAttributeName()
    buffer: vertexBuffer
}

几何形状

Qt3DCore::QGeometry将各种属性组合在一起,形成几何形状。通常,合适的几何形状将提供顶点位置、顶点法线和纹理坐标的属性。如果你想让你的几何形状也能与法线贴图材料一起使用,还需要提供一个一致的顶点切线向量集合。

Geometry {
    Attribute {
        attributeType: Attribute.VertexAttribute
        vertexBaseType: Attribute.Float
        vertexSize: 3
        byteOffset: 0
        byteStride: 9 * 4
        count: 4
        name: defaultPositionAttributeName()
        buffer: vertexBuffer
    }

    Attribute {
        attributeType: Attribute.VertexAttribute
        vertexBaseType: Attribute.Float
        vertexSize: 3
        byteOffset: 3 * 4
        byteStride: 9 * 4
        count: 4
        name: defaultNormalAttributeName()
        buffer: vertexBuffer
}

几何形状视图

Qt3DCore::QGeometryView接受一个Qt3DCore::QGeometry。它提供了控制绘制调用的属性,例如要绘制的实例数量、起始实例、要使用的Qt3DCore::QGeometryView::PrimitiveType类型等。

它完全定义了网格的细节,这样就可以在不需要将其渲染的情况下对网格进行边界体积计算和拾取。

GeometryView {
    instanceCount: 1
    indexOffset: 0
    firstInstance: 0
    primitiveType: GeometryRenderer.Triangles
    geometry: Geometry { ... }
}

几何形状渲染器

Qt3DRender::QGeometryRenderer是一个QComponent,它当被一个QEntity聚合时,允许绘制引用的Qt3DCore::QGeometryView。一个Qt3DRender::QGeometryRenderer被转换为一个调用底层的图形API的绘制调用。

GeometryRenderer {
    view: GeometryView { ... }
}

注意:在Qt 6之前,Qt3DRender::QGeometryRenderer 包含了一些细节,现在这些细节将由视图实例提供。这些属性在Qt 6中仍然存在,但将被弃用,并在Qt 7中删除。

© 2024 Qt公司。本文档贡献的内容均为各自所有者的版权。提供的文档是在GNU自由文档许可证版本1.3下授权的,由自由软件基金会发布。Qt及其相关标志是芬兰及/或其他国家和地区的The Qt Company Ltd.的商标。所有其他商标均为各自所有者的财产。