Я хочу передать вершины & переменные цвета в моем графическом процессоре. К сожалению, он не может отображаться при запуске программы. определение состоит в следующем:Реализация 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();
Любое предложение?
, который позаботился о неисправности сегментации, однако он по-прежнему не действует при запуске программы. –