|
本帖最后由 xulin_2005 于 2015-1-14 10:41 编辑
为了能让MyGUI动态创建Widget能在OSG每帧的Update阶段执行,而不是在Draw阶段执行,我通仿照OpenGLPlatform的平台接口想写个OSGPlatform,但是实现渲染方式时遇到了Geometry下无法实现多个DrawArray对应多个纹理的问题,向请教下高人。
问题描述仿照MyGUI::OpenGLRenderManager改写MyGUI::IRenderTarget的doRender接口
MyGUI::OpenGLRenderManager::doRender()的代码
- void OpenGLRenderManager::doRender(IVertexBuffer* _buffer, ITexture* _texture, size_t _count)
- {
- OpenGLVertexBuffer* buffer = static_cast<OpenGLVertexBuffer*>(_buffer);
- unsigned int buffer_id = buffer->getBufferID();
- MYGUI_PLATFORM_ASSERT(buffer_id, "Vertex buffer is not created");
- unsigned int texture_id = 0;
- if (_texture)
- {
- OpenGLTexture* texture = static_cast<OpenGLTexture*>(_texture);
- texture_id = texture->getTextureID();
- //MYGUI_PLATFORM_ASSERT(texture_id, "Texture is not created");
- }
- glBindTexture(GL_TEXTURE_2D, texture_id); //<---------------------- 绑定纹理
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffer_id); //<------------ 绑定顶点数据
- // enable vertex arrays
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_COLOR_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- // before draw, specify vertex and index arrays with their offsets
- size_t offset = 0;
- glVertexPointer(3, GL_FLOAT, sizeof(Vertex), (void*)offset);
- offset += (sizeof(float) * 3);
- glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)offset);
- offset += (4);
- glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), (void*)offset);
- glDrawArrays(GL_TRIANGLES, 0, _count);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glDisableClientState(GL_COLOR_ARRAY);
- glDisableClientState(GL_VERTEX_ARRAY);
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
- glBindTexture(GL_TEXTURE_2D, 0);
- }
复制代码 因为这一函数是 void Drawable::drawImplementation(osg::RenderInfo& renderInfo) const 调用的,所以说
MyGUI的OpenGLRenderManager是通过在一个Geometry下用多个DrawArray对应多个纹理对象实现的渲染方式。
通过继承MyGUI::IVertexBuffer可以把DrawArray的顶点坐标、纹理坐标、顶点颜色数据在Update中保存在osg::Array中,然后通过Geometry::addPrimitiveSet的方法实现glDrawArrays的方法,但是osg::Texture是集成osg::StateAttribute的,无法实现多对多的绑定。
如下图的关系
请问除了使用多个Genode的方法有没有其他什么好的办法能实现?
|
Widget, Widget, Widget, Update, glBindTexture, 绑定, 纹理, Update, Update, Widget, Update
|