QGLBuffer VBO实现

时间:2013-06-23 11:57:15

标签: c++ qt opengl qt4 qt5

我想转移顶点&我的绘图GPU中的颜色变量。不幸的是,它无法在程序运行时呈现。 定义如下:

QVector<QVector3D> vertices;
float* colors;

QGLBuffer* m_bufferData;
QGLBuffer* m_colorData;
float* m_color;

这是我在iniside initializeGL()中做的事情,因为顶点是一次构建并永久使用,我不会分配和映射它。但是,颜色会在代码中定期更改,因此我将颜色映射到代码中的m_color。

void PlanPositionIndicator::QtVBO()
{
     m_bufferData = new QGLBuffer(QGLBuffer::VertexBuffer);
    m_bufferData->create();
    m_bufferData->bind();
    m_bufferData->setUsagePattern(QGLBuffer::DynamicDraw); //staticDraw
    m_bufferData->allocate(8*6*sizeof(float)* ANGLE_COUNT*RANGE_COUNT);
    m_bufferData->release();
    //m_data = (QVector<QVector3D>*)m_bufferData->map (QGLBuffer::ReadWrite);

    m_colorData = new QGLBuffer(QGLBuffer::VertexBuffer);//static
    m_colorData->create();
    m_colorData->bind();
    m_colorData->setUsagePattern(QGLBuffer::DynamicDraw);
    m_colorData->allocate(6*sizeof(float)* ANGLE_COUNT*RANGE_COUNT);

    if(m_colorData->isCreated())
    {
        qDebug() << "buffer created";
    }
    m_color = (float*)m_colorData->map(QGLBuffer::ReadWrite);
    m_colorData->unmap();
    m_colorData->release();
}

到目前为止,在paintGL()中,在设置矩阵并对着色器程序进行操作之后,我调用了渲染函数来渲染我的绘图,如下所示:

    glEnableClientState( GL_VERTEX_ARRAY);
    glEnableClientState( GL_COLOR_ARRAY);

    if (m_bufferData->bind ()) {

        m_bufferData->write(0,vertices.constData(),sizeof(vertices));
        glEnableClientState(GL_VERTEX_ARRAY);
        glVertexPointer( 3, GL_FLOAT, 0, &vertices);

        if(m_colorData->bind())
        {
            shaderProgram->setAttributeArray("vertex", vertices.constData());
            shaderProgram->enableAttributeArray("vertex");
            shaderProgram->setAttributeArray("color", GL_FLOAT,colors,1);
            shaderProgram->enableAttributeArray("color");

            glEnable    (GL_BLEND);
            glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            glDrawArrays(GL_TRIANGLES, 0, vertices.size());
//        }
        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_COLOR_ARRAY);

        m_bufferData->release();
        m_colorData->release();
    }

最后,我尝试更改colors数组的值。首先我用map()&amp; unmap()但它给了我分段错误。接下来,我使用了write(),它运行良好,但不呈现任何内容。

      float* m_color = (float*)glBuffer->map(QGLBuffer::ReadWrite);
    m_color[k++] = rnd;
    m_color[k++] = rnd;
    m_color[k++] = rnd;
    m_color[k++] = rnd;
    m_color[k++] = rnd;
    m_color[k++] = rnd;
    glBuffer->unmap ();

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

m_colorData->release();
m_color = (float*)m_colorData->map(QGLBuffer::ReadWrite);

这个序列对我来说非常可疑 - 你被允许地图然后解除绑定,但你确定你可以做相反的事吗? Qt在这里不会做任何诡计 - 它会为glMapBuffer绑定点调用GL_ARRAY_BUFFER​,而没有绑定缓冲区(请参阅here)。

此外,在映射m_colorData缓冲区时,you are not allowed可以通过OpenGL调用对其执行任何操作(当然,这包括使用它进行渲染)。