首页 文章

从Qt3D PickEvent获取漫反射 Map RGB数据

提问于
浏览
0

我正在使用Qt3D的Scene3D组件开发一个应用程序 . 我已将网格obj加载到 Scene3D 并通过 QDiffuseMapMaterial 将PNG图像应用为漫反射贴图 . 到目前为止,对象渲染与 Map 正确 .

现在,我需要使用 QPickEvent 获取拾取顶点的RGB属性 . 我获得了一些顶点属性,如下所示:

ESEctoPoint ES3DAnalysisEntity::getVertexDataFromIndex(quint32 idx)
{
    ESEctoPoint vData;
    vData.vIndex = idx;

    const QGeometry *geometry = m_mesh->geometry();
    for (QAttribute* attribute : geometry->attributes())
    {
        if (attribute->name() == defaultTextureCoordinateAttributeName())
        {
            vData.vTexCoord = extractVertexData<QVector2D, uint>(attribute, idx);
        }
...
    }

    return vData;
}

然后我有顶点索引,位置和uv纹理坐标 . 现在,我需要的是来自给定顶点的uv位置的RGB数据 . 我该如何获取这些数据?我将漫反射材质和包含漫反射贴图的 QTextureImage 保留在内存中 . 我_729511是一种获取RGB值的方法,我只需要一些帮助,了解如何将uv纹理坐标转换为QTextureImage并获取像素数据 .

FOLLOWUP

使用给出的答案,我将图像保存在 QImage 对象中,我得到顶点位置,然后是纹理坐标 . 使用纹理坐标,我可以使用这个小函数获取像素位置和像素的颜色:

QColor getPixelColorForTexturePos(QVector2D const& uvPos, QImage* map)
{
    auto x = uvPos.x() * map->width();
    auto y = map->height() - (uvPos.y() * map->height());
    return map->pixelColor((int)x, (int)y);
}

1 回答

  • 1

    QTextureImage 本身不保存图像数据,它只保存有关上传到OpenGL的纹理的信息 .

    可以使用原始OpenGL返回纹理数据 . 使用Qt可能有一些方法可以做到,但我不推荐它 . 在GPU和CPU之间复制数据的速度很慢,因此如果没有必要,最好避免使用它 .

    我建议将纹理保存在 QImage 中,然后您可以使用 pixel(..)pixelColor(..) 方法轻松查询像素颜色 . 加载两次可能看起来很浪费,但如果你需要从CPU访问像素数据,那就没有更好的方法 .

相关问题