QGLBuffer 和 VBO
Posted
技术标签:
【中文标题】QGLBuffer 和 VBO【英文标题】:QGLBuffer and VBO 【发布时间】:2011-04-26 02:23:53 【问题描述】:我对 QGLBuffer 有疑问。我正在尝试使用 QT + Opengl 实现动态 VBO。
在.h文件中
struct CVert
float x;
float y;
;
...
typedef struct CVert CVert;
CVert* m_data;
QGLBuffer* m_bufferData;
int m_size;
在.cpp中
构造函数。
m_size = numberOfVertex;
m_bufferData = new QGLBuffer(QGLBuffer::VertexBuffer);
m_bufferData->create();
m_bufferData->bind();
m_bufferData->setUsagePattern(QGLBuffer::DynamicDraw);
m_bufferData->allocate(2*sizeof(float)* p_size);
m_data = (CVert*)m_bufferData->map (QGLBuffer::ReadWrite);
在程序的执行中我改变了一些 m_data 值
m_data[pos].x = X1
m_data[pos].y = y1
在draw方法中。
glEnableClientState(GL_VERTEX_ARRAY);
if (m_bufferData->bind ())
glVertexPointer( 2, GL_FLOAT, 0, (char *) NULL );;
glDrawArrays( GL_LINES, 0,m_size );
glDisableClientState(GL_VERTEX_ARRAY);
但它没有被绘制。 我检查了 m_data 不为空,并且 m_bufferData->bind() 返回 true。 我做错了什么?
【问题讨论】:
【参考方案1】:我想我已经解决了。每次我都要编辑 VBO。 我必须
m_data = (CVert*)data->map (QGLBuffer::ReadWrite);
m_data[pos].x = X1;
m_data[pos].y = y1
data->unmap ();
如果我在构造函数中只映射一次,它就不起作用
【讨论】:
glMapBuffer
docs 中明确指出:“映射的数据存储在使用其缓冲区对象之前必须使用 glUnmapBuffer 取消映射。否则任何尝试取消引用缓冲区的 GL 命令都会生成错误对象的数据存储。”以上是关于QGLBuffer 和 VBO的主要内容,如果未能解决你的问题,请参考以下文章
第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等