我想转移顶点&我的绘图GPU中的颜色变量。不幸的是,它无法在程序运行时呈现。定义如下:
QVector<QVector3D> vertices;
float* colors;
QGLBuffer* m_bufferData;
QGLBuffer* m_colorData;
float* m_color;
这是我在initeGL()中所做的,因为顶点是一次性构建的,并且永远使用,所以我不分配和映射它。然而,颜色在代码中有规律地变化,所以我在代码中将颜色映射到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()中,在设置矩阵和bing着色器程序之后,我调用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();
}
最后,我尝试更改颜色数组的值。首先我用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 ();
有什么建议吗?
m_colorData->release();
m_color = (float*)m_colorData->map(QGLBuffer::ReadWrite);
这个序列对我来说很可疑——你可以映射,然后解除绑定,但你确定你可以做相反的事情吗?Qt在这里不会做任何欺骗——它将为GL_ARRAY_BUFFER
绑定点调用glMapBuffer
,而没有缓冲区绑定在那里(请参阅此处)。
此外,在映射m_colorData
缓冲区时,不允许通过OpenGL调用对其进行任何操作(当然,这包括使用它进行渲染)。