2013-06-23 1 views
0

Я хочу передать вершины & переменные цвета в моем графическом процессоре. К сожалению, он не может отображаться при запуске программы. определение состоит в следующем:Реализация VBO QGLBuffer

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

Наконец , Я пытаюсь изменить значения массива цветов. Сначала я сделал это с 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(); 

Любое предложение?

+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-вызовов (это включает в себя, конечно, рендеринг с ним).

+0

Я новичок в Qt QGLBuffer, может ли кто-нибудь, кто испытал QT, прочесть руководство по моему вопросу. –

+0

Это не имеет никакого отношения к QGLBuffer - это проблема OpenGL. Начните с замены этих двух строк. Кроме того, не сохраняйте m_colorData, отображаемую при рисовании с ним. Сопоставьте его только при необходимости, затем отмените его. – peppe

+0

Я сделал, это не помогло. –