查看: 2437|回复: 5

关于OSG的VBO

[复制链接]

该用户从未签到

发表于 2011-5-6 17:56:13 | 显示全部楼层 |阅读模式
请问如下opengl的VBO创建函数在OSG里的等同步骤是什么?
  glGenBuffers(1, vbo);
  glBindBuffer(GL_ARRAY_BUFFER, *vbo);
  
  // initialize buffer object
  unsigned int size = mesh_width * mesh_height * typeSize;
  glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);
  
  glBindBuffer(GL_ARRAY_BUFFER, 0);


我想能够自己指定*vbo并获取使用它。。

多谢大家

该用户从未签到

发表于 2011-5-9 09:16:21 | 显示全部楼层
这些步骤被很好地封装了,您很难再单独操作它们。也许您可以考虑写一个自己的Drawable类并在其中实现需要的功能

该用户从未签到

 楼主| 发表于 2011-5-10 07:52:32 | 显示全部楼层
本帖最后由 5224204 于 2011-5-10 08:02 编辑

多谢回复!!已经实现了,不熟悉osg底层太麻烦了,憋了一个星期。。。。。。
附上代码,有同样需要的可以参考一下!   
class MyDrawable : public osg:rawable
{
public:
MyDrawable() {}
/** Copy constructor using CopyOp to manage deep vs shallow copy.*/
MySmokeDrawable(const MyDrawable& MyDrawable,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY):
osg::Drawable(MyDrawable,copyop) {}
META_Object(MyApp,MyDrawable)
virtual void drawImplementation(osg::RenderInfo& renderInfo) const
{
  osg::State* state = renderInfo.getState();
  state->disableAllVertexArrays();
  const osg::Drawable::Extensions* glExt = osg::Drawable::getExtensions(state->getContextID(), true);
//vbo create.....
  glExt->glGenBuffers(1, &vboID);
  glExt->glBindBuffer(GL_ARRAY_BUFFER_ARB, vboID);
  glExt->glBufferData(GL_ARRAY_BUFFER_ARB, sizeof(Vertex)*24, NULL, GL_DYNAMIC_DRAW );
  glExt->glBufferSubData(GL_ARRAY_BUFFER_ARB, 0, sizeof(Vertex)*24, verts);
  state->setTexCoordPointer(0, 2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(12));
  state->setNormalPointer(GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(20));
  state->setColorPointer(4, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(32));
  state->setVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));
  glExt->glGenBuffers(1, &indexVBOID);
  glExt->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER_ARB, indexVBOID);
  glExt->glBufferData(GL_ELEMENT_ARRAY_BUFFER_ARB, 36*sizeof(GLubyte), index, GL_STATIC_DRAW);

//   glGenBuffers(1, &vboID); // Create the buffer ID, this is basically the same as generating texture ID's
//   glBindBuffer(GL_ARRAY_BUFFER, vboID); // Bind the buffer (vertex array data)
//
//   glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 24, NULL, GL_DYNAMIC_DRAW);
//   glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertex) * 24, verts);
//
//
//   glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(12));
//   glNormalPointer(GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(20));
//   glColorPointer(4, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(32));
//   glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));
//
//
//   glGenBuffers(1, &indexVBOID); // Generate buffer
//   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID); // Bind the element array buffer
//   glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36 * sizeof(GLubyte), index, GL_STATIC_DRAW);
//create done........do anything you want
   ...
   ...
}
}



再请教一下array, 这是否是唯一的实现方法? 还有没有别的渠道? 比如创建完Geometry 或者 通过Geometry来指定或者获取vbo ID?

该用户从未签到

发表于 2011-5-10 09:00:37 | 显示全部楼层
事实上我想这可以通过Array::setVertexBufferObject以及对BufferObject对象的操作来实现,但是做起来会比较繁杂,我也没有具体研究过

该用户从未签到

发表于 2011-5-10 11:51:54 | 显示全部楼层
谢谢分享

该用户从未签到

发表于 2011-7-27 15:00:36 | 显示全部楼层
敢问楼主是在使用CUDA吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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