0

描画 GPU で頂点と色の変数を転送したいと考えています。残念ながら、プログラムの実行時にレンダリングできません。定義は次のとおりです。

QVector<QVector3D> vertices;
float* colors;

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

ここでは、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() では、マトリックスを設定してシェーダー プログラムをビンジした後、render 関数を呼び出して、次のように描画をレンダリングします。

    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() と 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 ();

なにか提案を?

4

1 に答える 1

0
于 2013-06-23T12:37:38.513 に答える