在DirectX的Mesh文件中,通常一个纹理可能作被几个材质共用。这是因为顶点是以属性分组的,只要材质和纹理不一样,就需要使用不同的属性。 而在一般的建模软件中,纹理常常被当成材质的一部分,导出时每个“材质”都有自己的纹理,这样做也是因为有时Mesh在不同的部分尽管使用相同的纹理,但是有不同的光照特性。DirectX的Mesh也是按照同样的方式组织材质,纹理和网格。
DirectX提供的案例中,每个材质都分别加载一个纹理,可是,调试程序的时候,你会发现,有时只有几个纹理的物体,加载上来,有十几个材质,这样显然会有纹理被反复加载,那么我们可以使用COM的参照计数来避免这个问题。
在加载一个材质对应纹理之前,先找一下前面的纹理有没有同名的,如果有,就把那个纹理的指针拷贝到这个材质对应的纹理指针,同时给这个被拷贝指针的纹理加上一个参考。那么以后释放它的时候就不用担心前面一个是否已经被释放了。
COM是参照计数的,当增加一个参考时,计数器加1,释放一次时,计数器减1,如果计数器减到0,就把它从内存中释放掉。如果是使用了智能的指针,这个问题就更简单了,直接拷贝就可以了:
![](/Images/OutliningIndicators/None.gif)
在DirectX的类型声明中可以看到,LPDIRECT3DTEXTURE9并不是一个智能指针:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
所以在拷贝指针后要给这个COM对象的参考加1
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
在释放时,按照正常的方法释放就可以了
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)