最近在用PLSM2处理超大地形,虽然PLSM2有些高贵,但是总算熬过来了,感觉还可以。PLSM2白送的几张地形图都成功地渲染出来了。其中我用到了那个Tool_MapSplitter工程。该工程产生的MapSplitter.exe专门擅长于分割地图。(PLSM2需要你把配制好的地图分割成Pages(Even just One page)才能使用。)
在使用MapSplitter.exe的过程中,我发现如果地图被分成了不止一个Page时,分割后的高度图块不能被PLSM2识别,我对比了纹理分块后的命名规律,确定这是MapSplitter.exe的一个Bug。
源码魅力!感谢上帝!我们只需要在源码里修改一下就可以了。
先说存在的问题:
比如说我们要分割那个gcanyon_height_4k2k.png(4097X2049),分成4行8列的32个Pages,如果不修改Bug,分成的结果是如下的样子:(竖线右侧是PLSM2能识别的格式,也是修改Bug后的成果)
最近在用PLSM2处理超大地形,虽然PLSM2有些高贵,但是总算熬过来了,感觉还可以。PLSM2白送的几张地形图都成功地渲染出来了。其中我用到了那个Tool_MapSplitter工程。该工程产生的MapSplitter.exe专门擅长于分割地图。(PLSM2需要你把配制好的地图分割成Pages(Even just One page)才能使用。)
在使用MapSplitter.exe的过程中,我发现如果地图被分成了不止一个Page时,分割后的高度图块不能被PLSM2识别,我对比了纹理分块后的命名规律,确定这是MapSplitter.exe的一个Bug。
源码魅力!感谢上帝!我们只需要在源码里修改一下就可以了。
先说存在的问题:
比如说我们要分割那个gcanyon_height_4k2k.png(4097X2049),分成4行8列的32个Pages,如果不修改Bug,分成的结果是如下的样子:(竖线右侧是PLSM2能识别的格式,也是修改Bug后的成果)
现在我们来看看存在问题的函数的源代码:
void MapSplitter::SplitAndSpaceHeightData (const String &filename, uchar *BaseData,
const uint width, const uint height,
const int tile_spacing, const int page_size,
const bool saveasRaw, const String &extension)
对于单个的Page分割,最后的文件名是这样形成的:(没问题)
String SplitFileName = pure_file_name + String(".0.0.") + ext_name;
对于多个页,先处理除了最后一行和最后一列的内部Page,然后处理最后一行,随后处理最后一列,最后处理最后一行且最后一列。这四处的文件名在源码中是这样形成的:(有大问题)
SplitFileName = pure_file_name + StringConverter::toString(i) + String(".") + StringConverter::toString(width_split_count) + String(".") + ext_name;
应该把这四处都修改为:
SplitFileName = pure_file_name + String(".") + StringConverter::toString(i) + String(".") + StringConverter::toString(width_split_count) + String(".") + ext_name;
细心的读者应该很容易看到修改后和源码的区别。
祝各位好运。
现在我们来看看存在问题的函数的源代码:
void MapSplitter::SplitAndSpaceHeightData (const String &filename, uchar *BaseData,
const uint width, const uint height,
const int tile_spacing, const int page_size,
const bool saveasRaw, const String &extension)
对于单个的Page分割,最后的文件名是这样形成的:(没问题)
String SplitFileName = pure_file_name + String(".0.0.") + ext_name;
对于多个页,先处理除了最后一行和最后一列的内部Page,然后处理最后一行,随后处理最后一列,最后处理最后一行且最后一列。这四处的文件名在源码中是这样形成的:(有大问题)
SplitFileName = pure_file_name + StringConverter::toString(i) + String(".") + StringConverter::toString(width_split_count) + String(".") + ext_name;
应该把这四处都修改为:
SplitFileName = pure_file_name + String(".") + StringConverter::toString(i) + String(".") + StringConverter::toString(width_split_count) + String(".") + ext_name;
细心的读者应该很容易看到修改后和源码的区别。
祝各位好运。