Qt3D - 2 个正方形的实例渲染。原始类型?实例数?

Qt3D - Instance rendering of 2 squares. PrimitiveType? InstanceCount?

我想使用实例渲染在屏幕上显示 2 个方块。

问题是:
当我画 2 个正方形时,它们是相连的。我无法绘制多个单独的正方形。

我知道它与 PrimitiveType 有关:我正在使用 Qt3DRender::QGeometryRenderer::LineLoopQt3DRender::QGeometryRenderer::TriangleFan 但是有没有办法告诉 Qt 在多个实例中分隔我的数据缓冲区?以便 PrimitiveType 应用于每个实例而不是所有顶点。

我有一个创建形状的函数:

Qt3DCore::QEntity* SceneBuilder::createShapeInstancing(const QList<QVector3D> & listVertices, int nbPointGeometry, const QColor color, Qt3DCore::QEntity * rootEntity) 
{
    // Material
    Qt3DExtras::QPhongMaterial *material = new Qt3DExtras::QPhongMaterial(rootEntity);
    material->setAmbient(color);

    // Custom entity
    Qt3DCore::QEntity *customMeshEntity = new Qt3DCore::QEntity(rootEntity);

    // Custom Mesh
    Qt3DRender::QGeometryRenderer *customMeshRenderer = new Qt3DRender::QGeometryRenderer(rootEntity);
    Qt3DRender::QGeometry *customGeometry = new Qt3DRender::QGeometry(customMeshRenderer);

    Qt3DRender::QBuffer *vertexDataBuffer = new Qt3DRender::QBuffer(Qt3DRender::QBuffer::VertexBuffer, customGeometry);

    int nbPointGeometry = nbPoint;

    QByteArray vertexBufferData;
    vertexBufferData.resize(listVertices.size() * nbPointGeometry * sizeof(QVector3D));
    QVector3D *posData = reinterpret_cast<QVector3D *>(vertexBufferData.data());

    QList<QVector3D>::const_iterator it;
    for (it = listVertices.begin(); it != listVertices.end(); it++)
    {
        *posData = *it;
        ++posData;
    }

    vertexDataBuffer->setData(vertexBufferData);

    //Attributes

    Qt3DRender::QAttribute *positionAttribute = new Qt3DRender::QAttribute();
    positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
    positionAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
    positionAttribute->setBuffer(vertexDataBuffer);
    positionAttribute->setVertexBaseType(Qt3DRender::QAttribute::Float);
    positionAttribute->setVertexSize(3);
    positionAttribute->setByteOffset(0);
    positionAttribute->setByteStride((0 + 3) * sizeof(float));
    positionAttribute->setCount(listVertices.size());
    //positionAttribute->setDivisor(1);

    customGeometry->addAttribute(positionAttribute);

    customMeshRenderer->setGeometry(customGeometry);
    //customMeshRenderer->setInstanceCount(listVertices.size()/nbPoint);
    if (nbPointGeometry == 1)
        customMeshRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::Points);
    else if (nbPointGeometry == 2)
        customMeshRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::Lines);
    else if (nbPointGeometry == 3)
        customMeshRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::Triangles);
    else
        customMeshRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::LineLoop);

    customMeshEntity->addComponent(customMeshRenderer);
    customMeshEntity->addComponent(material);

    return customMeshEntity;
}

当我调用这个函数时,我将我的 2 个方块放在 listVertices 变量中。这样我所有的方块都显示在一次绘制调用中。

但形状是这样或那样连接的。有没有办法删除它?我没有使用 InstanceCountDivisor 但我不知道它是如何工作的。我用它做了一些测试,但没有任何效果

其实我只是找到了一个实例化渲染的例子here

他们将 QSphereGeometry 子类化并在着色器中执行实例化渲染。您可以创建一个 RectangleGeometry 来保存一个三角形的顶点,并为其配备与示例中的 InstancedGeometry 相同的功能。

结果: