- Qt 5.15
- Qt 3D
- Qt 3D Render Geometry
- Qt 5.15.18 Reference Documentation

# Qt 3D Render Geometry

Qt 3D Render provides a generic way of storing geometry data and specifying how it should be read by the renderer.

- Buffer
- Attribute
- Geometry
- GeometryRenderer

### Buffer

The Qt3DRender::QBuffer class stores the raw data. This acts purely as an array of memory. In most cases a Qt3DRender::QBuffer will be used indirectly by being referenced by one or more Qt3DRender::QAttributes. However there are times when a QBuffer may be used directly as the value property of a QParameter when dealing with Uniform Buffer Objects (UBO) or Shader Storage Buffer Objects (SSBO).

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

### Attribute

Qt3DRender::QAttribute specifies how data contained in the referenced buffer should be extracted and passed to an input of a vertex shader. It references a Qt3DRender::QBuffer and can specify the layout of the attributes by definining the vertex size, the data type, the stride between two vertices and a starting offset. The type of the attribute will also define whether it is to be used as a vertex buffer or as an index buffer. This allows you complete flexibility of how you structure your data in buffers. It is possible to use separate buffers for each vertex attribute, an interleaved buffer containing data for all attributes or a combination of separate and interleaved buffers.

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

### Geometry

A Qt3DRender::QGeometry aggregates various attributes to form a piece of geometry. Usually a proper geometry will provide an attribute for vertex positions, an attribute for vertex normals and an attribute for texture coordinates. If you want your geometry to also work with normal mapped materials it will need to provide a consistent set of vertex tangent vectors too.

     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
     }

### GeometryRenderer

Qt3DRender::QGeometryRenderer is a QComponent which when aggregated by a QEntity allows to draw the Qt3DRender::QGeometry it references. It provides properties to control the draw call such as the number of instances to be drawn, the starting instance, the type of Qt3DRender::QGeometryRenderer::PrimitiveType to be used, etc. A Qt3DRender::QGeometryRenderer is translated into a draw call to the underlying graphics API.

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