从Qt3D PickEvent获取漫反射贴图RGB数据

Get diffuse map RGB data from Qt3D PickEvent

本文关键字:反射贴图 RGB 数据 获取 Qt3D PickEvent      更新时间:2023-10-16

我正在使用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);
}

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

使用原始OpenGL可以获取纹理数据。使用Qt可能也有一些方法,但我不建议这样做。在GPU和CPU之间复制数据很慢,所以如果没有必要,最好避免。

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