我正在使用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 回答
QTextureImage
本身不保存图像数据,它只保存有关上传到OpenGL的纹理的信息 .可以使用原始OpenGL返回纹理数据 . 使用Qt可能有一些方法可以做到,但我不推荐它 . 在GPU和CPU之间复制数据的速度很慢,因此如果没有必要,最好避免使用它 .
我建议将纹理保存在
QImage
中,然后您可以使用pixel(..)
或pixelColor(..)
方法轻松查询像素颜色 . 加载两次可能看起来很浪费,但如果你需要从CPU访问像素数据,那就没有更好的方法 .