Texture UV Atlas

来源:互联网 发布:王子变青蛙 知乎 编辑:程序博客网 时间:2024/04/28 03:32

UV的Atlas操作在某些场合下还是很有用途的,比如很常见的对于场景进行的LightMap烘焙时。这时就需要对于整个场景中的几何体元进行Light Map UV的生成,也即是将其投影到了一张Texture中去,且要求所有的几何体元对应唯一的Light Map UV(即在这一张纹理中没有相互重叠,以便取到正确的烘焙信息)。UV Atlas其实是一个传统的NP hard问题,一般来说都是通过某些最优化方法来实现,而且牵涉的面也较广。在DX SDK中也有实现该操作的API:D3DXUVAtlasCreate

D3DXUVAtlasCreate方法的具体使用就是给它传入一个D3DXMESH类型的数据源,然后它处理后返回一个包含UV Atlas结果的Mesh。其中有以下两点需要一些特别的注意:

  • 传入的源Mesh至少需要包含两个基本信息:位置信息与一个UV通道。不过这里源Mesh中的UV通道中的数据并不需要在D3DXUVAtlasCreate进行处理进使用,而主要是因为返回的Mesh与传入的Mesh含有相同的顶点描述结构,因而需要一个UV通道在结果Mesh中保存Atlas后的UV值。而其它的一些参数多是一些功能性设置,如结果Texture的大小,两块UV之间的间距等,具体可以参考:http://msdn.microsoft.com/en-us/library/windows/desktop/bb205479(v=vs.85).aspx
  • 结果Mesh与源Mesh一定包含相同的三角形数量,但却可能包含不同的顶点数量(结果Mesh中的顶点数量大于等于源Mesh中的顶点数量)。这个其实还是比较容易理解的,因为可能有很多顶点在空间上处于相同的位置因而合并后成为一个顶点,但是atlas后其对应的UV可能并不相同,因而就需要对顶点进行分割。
  • D3DXUVAtlasCreate处理的Mesh规模为:顶点与三角形的数量均不超过65535。这个限制的影响其实还是比较大的,特别是对于较大一些规模的场景生成Light Map UV时。这样的话就需要需要对整个场景进行再划分,对于每块儿单独操作处理;然后操作完成以后再对每块儿的Atlas texture进行合并等,这里可以需要对UV进行一些再修改操作

其实D3DXUVAtlasCreate的使用还是比较简单的,但是其得到的结果却并不是很理想,比如说对于上面的这样一个场景使用D3DXUVAtlasCreate进行UV生成以后得到的结果如下图所示,其中的碎面较多,而且在Mesh表面分布较为复杂时atlas后的UV并不是很整齐,而且排布也不是太工整,这样在场景使用贴图时再加纹理的读取插值问题可能会变得更加难看。

而较好的排布得到的结果就应该下图所示:

关于UV的Atlas,这也是一个获得广泛研究的问题(Mesh Parameterization),比较经典的就是一种叫做Least Square Conformal Map的解决方法(将问题用Conformal Map参数化后用Least Square方法来计算得到较为优化的解),而且也有不少的开源几何算法库已经实现了该算法,如OpenNLCGAL等(好像都是INRIA做的),可以尝试使用。另外,以下这些网站也比较有用,可以参考一下:

http://www.inf.usi.ch/hormann/parameterization/index.html

http://the-witness.net/news/2010/03/graphics-tech-texture-parameterization/

http://www.fseraph.com/?p=408

原创粉丝点击