修改ETM,使之支持多格多层纹理

来源:互联网 发布:删除开机引导软件 编辑:程序博客网 时间:2024/05/29 02:23

        ETM本身的多层纹理帖图功能是针对整个地图的,所有地形分块都是使用的一个材质,这样跟据我的显卡,只支持四层纹理,再去掉覆盖图,只能用三张帖图来表示整个地面,表现内容很不丰富。要使ETM基于格子附帖图就得找到Material与mesh的关联代码,可是分析完ETM刷帖图这部分的源代码后,怎么找都找不到ETM对设置进去的材质进行关联。他的setMaterial()函数只是简单的把材质赋给成员变量mMaterial,而这个mMaterial经过查找后发现这个成员变量重来就没有被使用过。这使我很诧异,变量没有使用,怎么可能绘制时确有效果呢,后来感觉可能不是ETM中的问题,问题可能是OGRE中的特殊机制。ETM中Tile这个类是从OGRE中的Renderable和MovableObject中派生出来的,Renderable是绘制mesh网格的类,最有可能与材质关联有关系了,与是我看了一下renderable类,发现getMaterial()是纯虚函数,而ETM中继承后只是简单的将mMaterial成员变量返回了下。于是我在getMaterial函数上加断点,发现每循环这个函数都被调用,在堆栈中看是RenderQueue类调用的getMaterial(),这下明白了,OGRE把getMaterial设成纯虚函数让用户去实现,然后OGRE会在渲染队阵类中自动调用用户实现后的getMaterial()去关联相关的mesh。也就是说只要修改下getMaterial函数,给每个tile增加个成员材质,get时返回这个成员,就可以实现每格相对独立的多层纹理。

原创粉丝点击