查看: 883|回复: 1

【求助】Geometry下能否实现多个DrawArrays对应多个纹理(MyGUI的OSG平台接口)

[复制链接]

该用户从未签到

发表于 2015-1-14 09:39:29 | 显示全部楼层 |阅读模式
本帖最后由 xulin_2005 于 2015-1-14 10:41 编辑

为了能让MyGUI动态创建Widget能在OSG每帧的Update阶段执行,而不是在Draw阶段执行,我通仿照OpenGLPlatform的平台接口想写个OSGPlatform,但是实现渲染方式时遇到了Geometry下无法实现多个DrawArray对应多个纹理的问题,向请教下高人。
问题描述仿照MyGUI::OpenGLRenderManager改写MyGUI::IRenderTarget的doRender接口
MyGUI::OpenGLRenderManager::doRender()的代码
  1.         void OpenGLRenderManager::doRender(IVertexBuffer* _buffer, ITexture* _texture, size_t _count)
  2.         {
  3.                 OpenGLVertexBuffer* buffer = static_cast<OpenGLVertexBuffer*>(_buffer);
  4.                 unsigned int buffer_id = buffer->getBufferID();
  5.                 MYGUI_PLATFORM_ASSERT(buffer_id, "Vertex buffer is not created");

  6.                 unsigned int texture_id = 0;
  7.                 if (_texture)
  8.                 {
  9.                         OpenGLTexture* texture = static_cast<OpenGLTexture*>(_texture);
  10.                         texture_id = texture->getTextureID();
  11.                         //MYGUI_PLATFORM_ASSERT(texture_id, "Texture is not created");
  12.                 }

  13.                 glBindTexture(GL_TEXTURE_2D, texture_id);        //<---------------------- 绑定纹理

  14.                 glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffer_id);       //<------------ 绑定顶点数据

  15.                 // enable vertex arrays
  16.                 glEnableClientState(GL_VERTEX_ARRAY);
  17.                 glEnableClientState(GL_COLOR_ARRAY);
  18.                 glEnableClientState(GL_TEXTURE_COORD_ARRAY);

  19.                 // before draw, specify vertex and index arrays with their offsets
  20.                 size_t offset = 0;
  21.                 glVertexPointer(3, GL_FLOAT, sizeof(Vertex), (void*)offset);
  22.                 offset += (sizeof(float) * 3);
  23.                 glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)offset);
  24.                 offset += (4);
  25.                 glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), (void*)offset);

  26.                 glDrawArrays(GL_TRIANGLES, 0, _count);

  27.                 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  28.                 glDisableClientState(GL_COLOR_ARRAY);
  29.                 glDisableClientState(GL_VERTEX_ARRAY);

  30.                 glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
  31.                 glBindTexture(GL_TEXTURE_2D, 0);
  32.         }

复制代码
因为这一函数是        void Drawable::drawImplementation(osg::RenderInfo& renderInfo) const 调用的,所以说
MyGUI的OpenGLRenderManager是通过在一个Geometry下用多个DrawArray对应多个纹理对象实现的渲染方式。
通过继承MyGUI::IVertexBuffer可以把DrawArray的顶点坐标、纹理坐标、顶点颜色数据在Update中保存在osg::Array中,然后通过Geometry::addPrimitiveSet的方法实现glDrawArrays的方法,但是osg::Texture是集成osg::StateAttribute的,无法实现多对多的绑定。
如下图的关系
ClassDiagram1.jpg
请问除了使用多个Genode的方法有没有其他什么好的办法能实现?


您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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