Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++ 用openglvbo绘制数千个多边形_C++_Qt_Opengl_2d_Vbo - Fatal编程技术网

C++ 用openglvbo绘制数千个多边形

C++ 用openglvbo绘制数千个多边形,c++,qt,opengl,2d,vbo,C++,Qt,Opengl,2d,Vbo,我正在尝试创建一个OpenGL应用程序,它能够渲染超过100000个2d基本对象 好吧,使用现代OpenGL和VBO应该是可能的 下面是代码(使用Qt): #包括“paintwidget.h” PaintWidget::PaintWidget(QGLWidget*父项):QGLWidget(父项) { QTimer*定时器=新的QTimer(此); 连接(计时器、信号(timeout())、此、插槽(updateTimer()); 定时器->启动(16); } GLuint指数[100000];

我正在尝试创建一个OpenGL应用程序,它能够渲染超过100000个2d基本对象

好吧,使用现代OpenGL和VBO应该是可能的

下面是代码(使用Qt):

#包括“paintwidget.h”
PaintWidget::PaintWidget(QGLWidget*父项):QGLWidget(父项)
{
QTimer*定时器=新的QTimer(此);
连接(计时器、信号(timeout())、此、插槽(updateTimer());
定时器->启动(16);
}
GLuint指数[100000];
void PaintWidget::initializeGL()
{
VBOBuffer=新的QGLBuffer(QGLBuffer::VertexBuffer);
VBOBuffer->create();
VBOBuffer->bind();
VBOBuffer->setUsagePattern(QGLBuffer::DynamicDraw);
VBOBuffer->allocate(100000*10*sizeof(双倍));
//将数据加载到VBO中:
对于(inti=0;iwrite(i*10*sizeof(double),顶点,10*sizeof(double));
}
//填充索引数组:

对于(int i=0;i那么这就是你的问题:

//绘制我的多边形:

对于(int i=0;i那么这就是你的问题:

//绘制我的多边形:

对于(int i=0;iYou正在对每个多边形使用单次绘制调用。难怪这会很慢,并消耗所有GPU负载。而且您根本没有使用现代OpenGL-现代GL没有
GL\u多边形
,也没有
glEnableClientState
Glvertexinter
。您正在对每个多边形使用单次绘制调用。i难怪这会很慢,而且会消耗你所有的GPU负载。而且你根本没有使用现代OpenGL-现代GL没有
GL\u POLYGON
,也没有
glEnableClientState
glVertexPointer
。谢谢你,这真的很有帮助,但是我应该如何索引这个VBO?我已经尝试了一些配置,但是它们根本不起作用。@Soup71:创建元素数组缓冲区(
glBindBuffer(GL\u element\u array\u buffer,…)
),用索引数组填充它,然后
glpaurements(…,NULL)
。您已经有了索引创建代码,您也可以使用QGLBuffer及其
write
方法进行索引。请记住,顶点数组对象只包含顶点属性,因此元素索引缓冲区必须单独绑定和维护。谢谢,这真的很有帮助,但我应该如何索引此VBO?我已经尝试过了很少有配置,但它们根本不起作用。@Soup71:创建元素数组缓冲区(
glBindBuffer(GL\u element\u array\u buffer,…)
),用索引数组填充它,然后
gldrawerelements(…,NULL)
。您已经有了索引创建代码,也可以使用QGLBuffer及其
write
方法进行索引。请记住,顶点数组对象只包含顶点属性,因此元素索引缓冲区必须单独绑定和维护。
#include "paintwidget.h"

PaintWidget::PaintWidget(QGLWidget *parent) : QGLWidget(parent)
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(updateTimer()));
    timer->start(16);
}

GLuint indices[100000];

void PaintWidget::initializeGL()
{
    VBOBuffer= new QGLBuffer(QGLBuffer::VertexBuffer);
    VBOBuffer->create();
    VBOBuffer->bind();
    VBOBuffer->setUsagePattern(QGLBuffer::DynamicDraw);
    VBOBuffer->allocate(100000 * 10 * sizeof(double));

    // load data into VBO:
    for(int i=0; i<100000; i++)
    {

        GLdouble vertices[] = {100 + (double)i * 100, 100 + (double)i * 100,
                               100 + (double)i * 100, 200 + (double)i * 100,
                               200 + (double)i * 100, 200 + (double)i * 100,
                               300 + (double)i * 100, 150 + (double)i * 100,
                               200 + (double)i * 100, 100 + (double)i * 100 };

        VBOBuffer->write(i * 10 * sizeof(double), vertices, 10 * sizeof(double));
    }

    // fill indices array:
    for(int i=0; i<100000; i+=10)
    {
        indices[i] = i;
        indices[i+1] = i+1;
        indices[i+2] = i+1;
        indices[i+3] = i+2;
        indices[i+4] = i+2;
        indices[i+5] = i+3;
        indices[i+6] = i+3;
        indices[i+7] = i+4;
        indices[i+8] = i+4;
        indices[i+9] = i;
    }
}

void PaintWidget::paintEvent(QPaintEvent*)
{
    QPainter paint(this);
    paint.beginNativePainting();

    glEnable(GL_LINE_SMOOTH);
    glEnable(GL_MULTISAMPLE);
    glClearColor(0.1, 0.96, 0.1, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_DOUBLE, 0, 0);

    // draw my polygons:
    for(int i=0; i<100000; i+=5)
    {
        glDrawArrays(GL_POLYGON, i, 5);
    }
    glDisableClientState(GL_VERTEX_ARRAY);

    paint.endNativePainting();
}

void PaintWidget::updateTimer()
{
    paintEvent(nullptr);
}
// draw my polygons:
for(int i=0; i<100000; i+=5)
{
    glDrawArrays(GL_POLYGON, i, 5);
}