【问题标题】:Get diffuse map RGB data from Qt3D PickEvent从 Qt3D PickEvent 获取漫反射贴图 RGB 数据
【发布时间】:2017-11-15 19:13:50
【问题描述】:

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

现在,我需要使用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 保存在内存中。我确信有一种方法可以获取 RGB 值,我只需要一点帮助来了解如何将 uv 纹理坐标转换为 QTextureImage 并获取像素数据。

跟进

使用给出的答案,我将图像保存在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);
}

【问题讨论】:

    标签: c++ qt opengl qt5 qt3d


    【解决方案1】:

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

    可以使用原始 OpenGL 取回纹理数据。也可能有一些方法可以使用 Qt 来完成,但我不推荐它。在 GPU 和 CPU 之间复制数据很慢,所以如果没有必要,最好避免。

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

    【讨论】:

    • 好的,如果QTextureImage 本身不保存图像数据,那是有道理的。你知道吗,纹理坐标会直接映射到QImage中的像素位置吗?
    • 不,纹理坐标范围从左下角开始的 0.0 到 1.0。 QImage 使用从左上角开始的从 0 到宽度/高度的常规像素坐标。所以你必须乘以宽度和高度,翻转 Y 轴和圆形。
    • 纹理坐标也可能超出 [0.0, 1.0] 范围。在这种情况下,OpenGL 会包裹或夹紧它们(默认包裹),因此如果您的网格数据可能包含此类坐标,您也需要包裹/夹紧它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多