Qt3D:纹理是黑色的

问题描述

我正在尝试使用 Qt3D 渲染 3D 扫描仪捕获的帧。网格在几何体中构造正确,但显示为黑色。 下面是我转换顶点、纹理坐标、法线并将结果对象添加到场景的函数。出于调试目的,我试图将纹理从一个源 .png 文件映射到所有帧。但它看起来仍然是黑色的。归一化纹理坐标向量没有帮助。 请查看我的代码并说明我在做什么。提前致谢。

    Qt3DCore::QEntity* object = new Qt3DCore::QEntity(parent);
    Qt3DRender::QGeometryRenderer* renderer = new Qt3DRender::QGeometryRenderer(object);
    Qt3DRender::QGeometry* geometry = new Qt3DRender::QGeometry(renderer);

    Qt3DRender::QBuffer* vertexBuffer = new Qt3DRender::QBuffer(geometry);
    Qt3DRender::QBuffer* indexBuffer = new Qt3DRender::QBuffer(geometry);

    Qt3DRender::QAttribute* positionAttribute = new Qt3DRender::QAttribute(geometry);
    Qt3DRender::QAttribute* normalAttribute = new Qt3DRender::QAttribute(geometry);
    Qt3DRender::QAttribute* texCoordAttribute = new Qt3DRender::QAttribute(geometry);
    Qt3DRender::QAttribute* indexAttribute = new Qt3DRender::QAttribute(geometry);

    const quint32 stride = (3 + 3 + 2) * sizeof(float);
    positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
    positionAttribute->setDataType(Qt3DRender::QAttribute::Float);
    positionAttribute->setDataSize(3);
    positionAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
    positionAttribute->setBuffer(vertexBuffer);
    positionAttribute->setByteOffset(0);
    positionAttribute->setByteStride(stride);

    normalAttribute->setName(Qt3DRender::QAttribute::defaultnormalAttributeName());
    normalAttribute->setDataType(Qt3DRender::QAttribute::Float);
    normalAttribute->setDataSize(3);
    normalAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
    normalAttribute->setBuffer(vertexBuffer);
    normalAttribute->setByteOffset(3 * sizeof(float));
    normalAttribute->setByteStride(stride);

    texCoordAttribute->setName(Qt3DRender::QAttribute::defaultTextureCoordinateAttributeName());
    texCoordAttribute->setDataType(Qt3DRender::QAttribute::Float);
    texCoordAttribute->setDataSize(2);
    texCoordAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
    texCoordAttribute->setBuffer(vertexBuffer);
    texCoordAttribute->setByteOffset((3 + 3) * sizeof(float));
    texCoordAttribute->setByteStride(stride);

    indexAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
    indexAttribute->setDataType(Qt3DRender::QAttribute::Int);
    indexAttribute->setDataSize(3);
    indexAttribute->setByteOffset(0);
    indexAttribute->setBuffer(indexBuffer);
    indexAttribute->setCount(indices.size());

    QByteArray* vertexArray = new QByteArray;
    const auto t = vertices.size();
    const auto r = sizeof(VertexData);
    const auto d = t * r;
    vertexArray->resize(vertices.size() * sizeof(VertexData));
    float* rawVertexArray = reinterpret_cast<float*>(vertexArray->data());
    int index = 0;

    for (int i = 0; i < vertices.size(); ++i)
    {
        rawVertexArray[index++] = vertices[i].position_.x();
        rawVertexArray[index++] = vertices[i].position_.y();
        rawVertexArray[index++] = vertices[i].position_.z();

        rawVertexArray[index++] = vertices[i].normal_.x();
        rawVertexArray[index++] = vertices[i].normal_.y();
        rawVertexArray[index++] = vertices[i].normal_.z();

        const auto x = vertices[i].texCoords_.x();
        rawVertexArray[index++] = vertices[i].texCoords_.x();
        const auto y = vertices[i].texCoords_.y();
        rawVertexArray[index++] = vertices[i].texCoords_.y();
    }

    QByteArray* indexArray = new QByteArray;
    indexArray->resize(indices.size() * sizeof(VertexData));

    auto* rawIndexArray = reinterpret_cast<int*>(indexArray->data());
    
    index = 0;
    for (int i = 0; i < indices.size(); ++i)
    {
        rawIndexArray[index++] = indices[i].x();
        rawIndexArray[index++] = indices[i].y();
        rawIndexArray[index++] = indices[i].z();
    }

    vertexBuffer->setData(*vertexArray);
    indexBuffer->setData(*indexArray);

    geometry->addAttribute(positionAttribute);
    geometry->addAttribute(normalAttribute);
    geometry->addAttribute(texCoordAttribute);
    geometry->addAttribute(indexAttribute);

    renderer->setGeometry(geometry);
    renderer->setInstanceCount(1);
    renderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::TriangleFan);
    object->addComponent(renderer);

    // Texture
    Qt3DRender::QTexture2D* targetTexture = new Qt3DRender::QTexture2D(renderer);
    Qt3DRender::QTextureImage* textureImage = new Qt3DRender::QTextureImage(targetTexture);
    Qt3DExtras::QDiffusespecularMaterial* material = new Qt3DExtras::QDiffusespecularMaterial(renderer);
    //Qt3DExtras::QnormalDiffusespecularMapMaterial* material = new Qt3DExtras::QnormalDiffusespecularMapMaterial();
    textureImage->setMirrored(true);
    textureImage->setSource(QUrl::fromLocalFile("D://Calibration tool//app-calibration-tool//output//1.jpg"));
    
    targetTexture->addTextureImage(textureImage);

   material->setDiffuse(QVariant::fromValue<Qt3DRender::QAbstractTexture *>(targetTexture));
   material->setAmbient(QColor(255,255,1));
   material->setspecular(QColor(255,1));
   material->setTextureScale(4);
   material->setAlphaBlendingEnabled(true);

   const auto transform = new Qt3DCore::QTransform(renderer);
   object->addComponent(transform);
   object->addComponent(material);

    return parent;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)