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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中使用顶点缓冲区对象渲染地形?

实例渲染 OpenGL

& 和 && 区别和联系,| 和 || 区别和联系

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]

Java基础8---面向对象代码块和继承和this和super和重写和重载和final