查看: 5928|回复: 6

使用多个osg::Geometry绘制几何体的时候,VBO模式和DisplayList模式不能混用吗?

[复制链接]

该用户从未签到

发表于 2010-1-13 12:02:29 | 显示全部楼层 |阅读模式
大概代码如下:
osg::Geometry* g1 = new osg::Geometry;
osg::Geometry* g2 = new osg::Geometry;

osg::Geode* pGeode = new osg::Geode;

pGeode->addDrawable( g1 );
pGeode->addDrawable( g2 );

// 顶点数据构造
// ……

g1->setDataVariance( osg::Object:YNAMIC );
g1->setSupportsDisplayList( false );
g1->setUseVertexBufferObjects( true );


我只把其中一个设置为动态绘制,并把pGeode设置为场景根节点,但是程序运行的时候中断在了osg::Drawable::draw里面,是否没法这样用呢,谢谢!

该用户从未签到

发表于 2010-1-13 12:07:53 | 显示全部楼层
可以混用,我想是别的地方存在问题

该用户从未签到

 楼主| 发表于 2010-1-13 14:03:23 | 显示全部楼层
本帖最后由 小行星 于 2010-1-13 14:05 编辑

您能帮我看一下这些代码吗?

CreateGeometry_1和CreateGeometry_2几乎完全一样,唯一不同的就是在CreateGeometry_1多了那三句话:

  1. pGeometry->setDataVariance( osg::Object::DYNAMIC );
  2. pGeometry->setUseDisplayList( false );
  3. pGeometry->setUseVertexBufferObjects( true );
复制代码


并且如果把CreateGeometry_2中n的值从8改到7,这段程序就不会崩掉,实在是没头绪……
  1. #include <osg/Geode>
  2. #include <osg/Geometry>

  3. #include <osgViewer/Viewer>


  4. osg::Geometry* CreateGeometry_1()
  5. {
  6.         osg::Geometry* pGeometry = new osg::Geometry;

  7.         double space_ = 10;

  8.         double  left_ = -100;
  9.         double right_ =  100;

  10.         double n = 8;

  11.         osg::Vec3Array* pVertices = new osg::Vec3Array;

  12.         for( int i = -n; i <= n; ++i )
  13.         {
  14.                 pVertices->push_back( osg::Vec3(  left_, i * space_, 0 ) );
  15.                 pVertices->push_back( osg::Vec3( right_, i * space_, 0 ) );
  16.         }

  17.         osg::Vec3Array::size_type s = pVertices->size();

  18.         pGeometry->setVertexArray( pVertices );
  19.         pGeometry->addPrimitiveSet( new osg:rawArrays( osg:rimitiveSet:INES, 0, s ) );

  20.         pGeometry->setDataVariance( osg::Object:YNAMIC );
  21.         pGeometry->setUseDisplayList( false );
  22.         pGeometry->setUseVertexBufferObjects( true );

  23.         return pGeometry;
  24. }


  25. osg::Geometry* CreateGeometry_2()
  26. {
  27.         osg::Geometry* pGeometry = new osg::Geometry;

  28.         double space_ = 10;

  29.         double bottom_ = -100;
  30.         double    top_ =  100;

  31.         // 这里改成7就没事
  32.         double n = 8;

  33.         osg::Vec3Array* pVertices = new osg::Vec3Array;

  34.         for( int i = -n; i <= n; ++i )
  35.         {
  36.                 pVertices->push_back( osg::Vec3( i * space_, bottom_, 0 ) );
  37.                 pVertices->push_back( osg::Vec3( i * space_,    top_, 0 ) );
  38.         }

  39.         osg::Vec3Array::size_type s = pVertices->size();

  40.         pGeometry->setVertexArray( pVertices );
  41.         pGeometry->addPrimitiveSet( new osg:rawArrays( osg:rimitiveSet:INES, 0, s ) );

  42.         return pGeometry;
  43. }






  44. int main( int argc, char** argv )
  45. {
  46.         osg::Geode* pGeode = new osg::Geode;

  47.         pGeode->addDrawable( CreateGeometry_1() );
  48.         pGeode->addDrawable( CreateGeometry_2() );

  49.         osgViewer::Viewer viewer;

  50.         viewer.setUpViewInWindow( 50, 50, 800, 600 );
  51.         viewer.setSceneData( pGeode );
  52.         viewer.run();

  53.         return 0;
  54. }
复制代码

该用户从未签到

发表于 2010-1-13 14:36:33 | 显示全部楼层
简单地把您的代码复制过去试了一下,运行正常;并且那段程序本身也没有什么不合理的地方。我想您可以检查一下自己的依赖库设置
此外,不必设置VBO渲染的几何体为DYNAMIC,除非您需要对其进行动态的改动

该用户从未签到

 楼主| 发表于 2010-1-13 15:09:30 | 显示全部楼层
本帖最后由 小行星 于 2010-1-13 15:12 编辑

的确是需要改动,这段代码仅是简化问题,WinXP VC2008,Debug和Release都试过了,依赖库也检查了没问题,这个代码复制到同事的机器上新建一个干净的工程运行也出同样的问题,断点也一样,Drawable第865行glCallList( globj ),无论怎样我没法解释为什么崩不崩溃取决于一个不怎么大的整数值,但如果两者都使用VBO或都不使用VBO就ok了……还是谢谢array

该用户从未签到

发表于 2010-1-13 15:14:10 | 显示全部楼层
可以试一试更新一下显卡驱动,这世界上不存在“没法解释”的问题~~

该用户从未签到

 楼主| 发表于 2010-1-13 16:20:39 | 显示全部楼层
嗯,估计你说对了,看来支持VBO对硬件是有要求的,我们这研发的破机器,再怎么更新也白搭,把程序拷到一台比较新的笔记本电脑上呼呼的跑……折腾死我了,那就要做两手准备了~谢谢array!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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