setVertexCount API QGeometryRenderer и его влияние на результаты приведения лучей - PullRequest
0 голосов
/ 29 марта 2020

Я создаю каркас меня sh из двух линий между тремя точками:

Mesh: vertices and lines

С помощью этих функций:

Qt3DRender::QGeometryRenderer *Utils::createWireframeMesh()
{
    Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer();
    Qt3DRender::QGeometry *geometry = new Qt3DRender::QGeometry(mesh);
    Qt3DRender::QBuffer *vertexDataBuffer = new Qt3DRender::QBuffer(Qt3DRender::QBuffer::VertexBuffer,
                                                                 geometry);
    Qt3DRender::QBuffer *indexDataBuffer = new Qt3DRender::QBuffer(Qt3DRender::QBuffer::IndexBuffer,
                                                                   geometry);
    QByteArray vertexBufferData;
    QByteArray indexBufferData;

    int vertexCount = 3; // Three vertices at (0, -1, 0) and (1, 0, 0) and (0, 1, 0)
    int lineCount = 2; // Two lines between three vertices

    vertexBufferData.resize(vertexCount * 3 * sizeof(float));
    indexBufferData.resize(lineCount * 2 * sizeof(ushort));

    // Arrow triangle is 2D and is inside XY plane
    float *vPtr = reinterpret_cast<float *>(vertexBufferData.data());
    vPtr[0]  = 0.0f; vPtr[1]  = -1.0f; vPtr[2]  = 0.0f; // First vertex at (0, -1, 0)
    vPtr[3]  = 1.0f; vPtr[4]  = 0.0f;  vPtr[5]  = 0.0f; // Second vertex at (1, 0, 0)
    vPtr[6]  = 0.0f; vPtr[7]  = +1.0f; vPtr[8]  = 0.0f; // Third vertex at (0, 1, 0)

    ushort *iPtr = reinterpret_cast<ushort *>(indexBufferData.data());
    iPtr[0]  = 0; iPtr[1]  = 1; // First line from index 0 to index 1
    iPtr[2]  = 1; iPtr[3]  = 2; // Second line from index 1 to index 2


    vertexDataBuffer->setData(vertexBufferData);
    indexDataBuffer->setData(indexBufferData);

    addPositionAttributeToGeometry(geometry, vertexDataBuffer, vertexCount);
    addIndexAttributeToGeometry(geometry, indexDataBuffer, lineCount * 2);

    mesh->setInstanceCount(1);
    mesh->setIndexOffset(0);
    mesh->setFirstInstance(0);
    // How to set vertex count here?
    mesh->setVertexCount(vertexCount);
    mesh->setPrimitiveType(Qt3DRender::QGeometryRenderer::Lines);
    mesh->setGeometry(geometry);

    return mesh;
}

void Utils::addPositionAttributeToGeometry(Qt3DRender::QGeometry *geometry,
                                                 Qt3DRender::QBuffer *buffer, int count)
{
    Qt3DRender::QAttribute *posAttribute = new Qt3DRender::QAttribute();
    posAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
    posAttribute->setBuffer(buffer);
    posAttribute->setDataType(Qt3DRender::QAttribute::Float);
    posAttribute->setDataSize(3);
    posAttribute->setByteOffset(0);
    posAttribute->setByteStride(0);
    posAttribute->setCount(count);
    posAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());

    geometry->addAttribute(posAttribute);
}

void Utils::addIndexAttributeToGeometry(Qt3DRender::QGeometry *geometry,
                                              Qt3DRender::QBuffer *buffer, int count)
{
    Qt3DRender::QAttribute *indexAttribute = new Qt3DRender::QAttribute();
    indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute);
    indexAttribute->setBuffer(buffer);
    indexAttribute->setDataType(Qt3DRender::QAttribute::UnsignedShort);
    indexAttribute->setDataSize(1);
    indexAttribute->setByteOffset(0);
    indexAttribute->setByteStride(0);
    indexAttribute->setCount(count);

    geometry->addAttribute(indexAttribute);
}

В приведенном выше коде я попробовал три различных утверждения в этой строке:

    // How to set vertex count here?
    mesh->setVertexCount(vertexCount);
    mesh->setVertexCount(vertexCount * 2);
    mesh->setVertexCount(vertexCount * 3);

Получив эти результаты, я выполняю несколько приведения лучей в моей 3D-сцене, что тоже удивительно сказывается:

1st case

2nd case

3rd case

Документация объясняет vertexCount свойство Qt3DRender::QGeometryRenderer как:

vertexCount: int

Содержит счетчик примитивов.

В моем случае счетчик примитивов это число строк, поэтому я попробовал его, но рисуется только одна строка:

Case of line count

Я не совсем понимаю, setVertexCount API. Кто-нибудь может дать мне подсказку?

1 Ответ

1 голос
/ 30 марта 2020

vertexCount - это то же значение, которое вы передадите glDrawArrays или glDrawElements, ie - это число вершин, задействованных в чертеже. Поскольку вы используете индексированный рендеринг, обычно это будет число индексов (при условии, что вы рисуете все данные в массиве индексов). Таким образом, в приведенном выше случае оно должно быть 4.

Обратите внимание, что мы недавно исправили ошибку с выбором строки при использовании перезапуска примитива, но это не влияет на код, который вы включили выше.

...