Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在QQuickItem中使用不同颜色绘制多个点_C++_Opengl_Qml_Qquickitem - Fatal编程技术网

C++ 在QQuickItem中使用不同颜色绘制多个点

C++ 在QQuickItem中使用不同颜色绘制多个点,c++,opengl,qml,qquickitem,C++,Opengl,Qml,Qquickitem,我想在自定义QQuickItem中渲染具有大量点(>1.000.000)和不同颜色的绘图 稍后我想设置这些点的动画(在坐标和颜色之间淡入淡出),因此我认为QQuickPaintedItem不够快,我必须使用QQuickItem的updatePaintNode界面 问题是为每个点设置颜色。我必须为每个点创建一个QSGGeometryNode并添加几何体和颜色材质吗?还是有更快的解决方案 最诚挚的问候我在openGL上做了一点工作,找到了一个适合我的解决方案 正常的OpenGL示例使用QSGGeom

我想在自定义
QQuickItem
中渲染具有大量点(>1.000.000)和不同颜色的绘图

稍后我想设置这些点的动画(在坐标和颜色之间淡入淡出),因此我认为
QQuickPaintedItem
不够快,我必须使用
QQuickItem
updatePaintNode
界面

问题是为每个点设置颜色。我必须为每个点创建一个
QSGGeometryNode
并添加几何体和颜色材质吗?还是有更快的解决方案


最诚挚的问候

我在openGL上做了一点工作,找到了一个适合我的解决方案

正常的OpenGL示例使用
QSGGeometry::Point2D
设置垂直。但是也有一个支持颜色的版本
(QSGGeometry::defaultAttributes\u ColoredPoint2D())
。这样我就可以用

  vertices[i].set(x, y, r,g, b, a);
//编辑: 下一个问题是,如果QSGeometry对象具有多个垂直方向,gui会不时冻结。我不知道为什么。 为垂直图形分配内存后,GUI速度变慢,因此这种方法的性能不佳

//编辑2:

我添加了当前
updatePaint
-方法的简化代码。如果数据对象非常大(>2.000.000点),小部件会渲染这些点,但整个gui会挂起和结巴

QSGNode *HistogramView::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *)
{
QSGGeometryNode *node = 0;
QSGGeometry *geometry = 0;

if (!oldNode) {
    node = new QSGGeometryNode;
    geometry = new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(), data.size());
    geometry->setDrawingModeelsize(GL_POINTS);
    node->setGeometry(geometry);
    node->setFlag(QSGNode::OwnsGeometry);

    QSGVertexColorMaterial *material = new QSGVertexColorMaterial();
    //material->setColor(QColor(255, 0, 0));
    node->setMaterial(material);
    node->setFlag(QSGNode::OwnsMaterial);

} else {
    node = static_cast<QSGGeometryNode *>(oldNode);
    geometry = node->geometry();
    geometry->allocate(222);
}
QSGGeometry::ColoredPoint2D *vertices = geometry->vertexDataAsColoredPoint2D();
for (int i = 0; i < data.size(); i++) {
        vertices[id].set(x, y,red, green, blue, 255);
        }
    }
}
node->markDirty(QSGNode::DirtyGeometry);
return node;



}
QSGNode*historogramview::updatePaintNode(QSGNode*oldNode,QQuickItem::UpdatePaintNodeData*)
{
QSGGeometryNode*节点=0;
QSGGeometry*几何=0;
如果(!oldNode){
node=新的QSGGeometryNode;
几何体=新的QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(),data.size());
几何->设置绘图模式大小(GL_点);
节点->设置几何体(几何体);
节点->设置标志(QSGNode::OwnsGeometry);
QSGVertexColorMaterial*材质=新QSGVertexColorMaterial();
//材质->设置颜色(QColor(255,0,0));
节点->设置物料(物料);
节点->设置标志(QSGNode::OwnsMaterial);
}否则{
节点=静态_转换(oldNode);
几何体=节点->几何体();
几何->分配(222);
}
QSGGeometry::ColoredPoint2D*顶点=几何体->顶点数据着色点2D();
对于(int i=0;i标记脏(QSGNode::DirtyGeometry);
返回节点;
}
我可以定位错误。 调用初始化
QSGGeometry
-对象后(
geometry=new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(),data.size());
)gui速度非常慢


问候

我在openGL上做了一点工作,找到了一个适合我的解决方案

正常的OpenGL示例使用
QSGGeometry::Point2D
设置垂直。但是也有一个支持颜色的版本
(QSGGeometry::defaultAttributes\u ColoredPoint2D())
。这样我就可以用

  vertices[i].set(x, y, r,g, b, a);
//编辑: 下一个问题是,如果QSGeometry对象具有多个垂直方向,gui会不时冻结。我不知道为什么。 为垂直图形分配内存后,GUI速度变慢,因此这种方法的性能不佳

//编辑2:

我添加了当前
updatePaint
-方法的简化代码。如果数据对象非常大(>2.000.000点),小部件会渲染这些点,但整个gui会挂起和结巴

QSGNode *HistogramView::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *)
{
QSGGeometryNode *node = 0;
QSGGeometry *geometry = 0;

if (!oldNode) {
    node = new QSGGeometryNode;
    geometry = new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(), data.size());
    geometry->setDrawingModeelsize(GL_POINTS);
    node->setGeometry(geometry);
    node->setFlag(QSGNode::OwnsGeometry);

    QSGVertexColorMaterial *material = new QSGVertexColorMaterial();
    //material->setColor(QColor(255, 0, 0));
    node->setMaterial(material);
    node->setFlag(QSGNode::OwnsMaterial);

} else {
    node = static_cast<QSGGeometryNode *>(oldNode);
    geometry = node->geometry();
    geometry->allocate(222);
}
QSGGeometry::ColoredPoint2D *vertices = geometry->vertexDataAsColoredPoint2D();
for (int i = 0; i < data.size(); i++) {
        vertices[id].set(x, y,red, green, blue, 255);
        }
    }
}
node->markDirty(QSGNode::DirtyGeometry);
return node;



}
QSGNode*historogramview::updatePaintNode(QSGNode*oldNode,QQuickItem::UpdatePaintNodeData*)
{
QSGGeometryNode*节点=0;
QSGGeometry*几何=0;
如果(!oldNode){
node=新的QSGGeometryNode;
几何体=新的QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(),data.size());
几何->设置绘图模式大小(GL_点);
节点->设置几何体(几何体);
节点->设置标志(QSGNode::OwnsGeometry);
QSGVertexColorMaterial*材质=新QSGVertexColorMaterial();
//材质->设置颜色(QColor(255,0,0));
节点->设置物料(物料);
节点->设置标志(QSGNode::OwnsMaterial);
}否则{
节点=静态_转换(oldNode);
几何体=节点->几何体();
几何->分配(222);
}
QSGGeometry::ColoredPoint2D*顶点=几何体->顶点数据着色点2D();
对于(int i=0;i标记脏(QSGNode::DirtyGeometry);
返回节点;
}
我可以定位错误。 调用初始化
QSGGeometry
-对象后(
geometry=new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(),data.size());
)gui速度非常慢


问候

我在openGL上做了一点工作,找到了一个适合我的解决方案

正常的OpenGL示例使用
QSGGeometry::Point2D
设置垂直。但是也有一个支持颜色的版本
(QSGGeometry::defaultAttributes\u ColoredPoint2D())
。这样我就可以用

  vertices[i].set(x, y, r,g, b, a);
//编辑: 下一个问题是,如果QSGeometry对象具有多个垂直方向,gui会不时冻结。我不知道为什么。 为垂直图形分配内存后,GUI速度变慢,因此这种方法的性能不佳

//编辑2:

我添加了当前
updatePaint
-方法的简化代码。如果数据对象非常大(>2.000.000点),小部件会渲染这些点,但整个gui会挂起和结巴

QSGNode *HistogramView::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *)
{
QSGGeometryNode *node = 0;
QSGGeometry *geometry = 0;

if (!oldNode) {
    node = new QSGGeometryNode;
    geometry = new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(), data.size());
    geometry->setDrawingModeelsize(GL_POINTS);
    node->setGeometry(geometry);
    node->setFlag(QSGNode::OwnsGeometry);

    QSGVertexColorMaterial *material = new QSGVertexColorMaterial();
    //material->setColor(QColor(255, 0, 0));
    node->setMaterial(material);
    node->setFlag(QSGNode::OwnsMaterial);

} else {
    node = static_cast<QSGGeometryNode *>(oldNode);
    geometry = node->geometry();
    geometry->allocate(222);
}
QSGGeometry::ColoredPoint2D *vertices = geometry->vertexDataAsColoredPoint2D();
for (int i = 0; i < data.size(); i++) {
        vertices[id].set(x, y,red, green, blue, 255);
        }
    }
}
node->markDirty(QSGNode::DirtyGeometry);
return node;



}
QSGNode*historogramview::updatePaintNode(QSGNode*oldNode,QQuickItem::UpdatePaintNodeData*)
{
QSGGeometryNode*节点=0;
QSGGeometry*几何=0;
如果(!oldNode){
node=新的QSGGeometryNode;
几何体=新的QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(),data.size());
几何->设置绘图模式大小(GL_点);
节点->设置几何体(几何体);
节点->设置标志(QSGNode::OwnsGeometry);
QSGVertexColorMaterial*材质=新QSGVertexColorMaterial();
//材质->设置颜色(QColor(255,0,