查看: 1858|回复: 4

请教VBO的问题

[复制链接]

该用户从未签到

发表于 2010-3-5 11:51:28 | 显示全部楼层 |阅读模式
本帖最后由 qele 于 2010-3-5 11:53 编辑

一个Geometry对象g1,使用VBO
g1->setUseVertexBufferObjects( true );
并设置其顶点数组
g1->setVertexArray( _myArray.get() );
显示没有问题,一切正常。

当窗口和g1销毁之后(顶点数组_myArray依然存在),重新创建一个新窗口以及Geometry对象g2,
g2->setUseVertexBufferObjects( true );
这里,设置g2与g1相同的顶点数组_myArray,
g2->setVertexArray( _myArray.get() );

此时,g2的几何体对象绘制函数报错,
DrawElementsUInt::draw(...)
{
   ...
  glDrawElements(...));//指针报错
  ...
}

解决方法:
1,g1和g2不使用VBO。
2,g1和g2分别使用_myData的一份新拷贝数据

请教各位还有更好的解决方法吗?
报错的原因是什么?

该用户从未签到

发表于 2010-3-5 12:15:32 | 显示全部楼层
我没有做过类似的试验,不过我猜想“窗口和g1同时销毁”是这个问题的原因所在。如果两个几何体在同一渲染设备中绘制,那应该是没有问题的;销毁窗口但是没有销毁g1对应这个窗口的BufferData数据,可能会在下一次使用BufferData进行绘制时引起一些错误。

因为您的做法并不常见,因此我并不确定更好的解决方法是什么。您可以尝试在g2绘制前执行一次_myArray->dirty(),不过我不知道这样是否能解决系统崩溃的问题,最好的方法还是重新拷贝一份数据(可以直接用拷贝构造函数,速度很快)

该用户从未签到

 楼主| 发表于 2010-3-5 14:54:15 | 显示全部楼层
谢谢array,呵呵~

在多窗口下显示同一份数据,为了避免数据冗余,我采用了多个窗口使用同一个顶点数组的做法。
dirty()函数好像不能解决崩溃问题。
另外,不只是顶点数组引起绘制函数报错,纹理和法向量数组共享也引起glDrawElements()崩溃。

谢谢了~

该用户从未签到

发表于 2010-3-5 14:57:31 | 显示全部楼层
是这样,因为所有的Array数组都是集成自BufferData类的,而后者正是VBO对象分配与释放的负责者

该用户从未签到

 楼主| 发表于 2010-4-9 18:08:22 | 显示全部楼层
后来,我在g1销毁之前添加
g1->setUseVertexBufferObjects( false );
解决问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表