从 Qt3D PickEvent 获取漫反射贴图 RGB 数据
Get diffuse map RGB data from Qt3D PickEvent
我正在使用 Qt3D 的 Scene3D 组件开发应用程序。我已经将网格对象加载到 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 数据。我该如何获取这些数据?我将漫反射 material 和包含漫反射贴图的 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 访问像素数据,没有更好的方法。
我正在使用 Qt3D 的 Scene3D 组件开发应用程序。我已经将网格对象加载到 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 数据。我该如何获取这些数据?我将漫反射 material 和包含漫反射贴图的 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 访问像素数据,没有更好的方法。