你如何使用SKTextureFilteringNearest与SKTextureAtlas

我似乎使用SKTextureAtlas和最近的邻居过滤纹理有问题。 当我使用没有SKTextureAtlas的最近邻居过滤时,它可以正常工作,但是当我使用SKTextureAtlas时,一切都变成了线性过滤。

代码和结果没有SKTextureAtlas:

SKTexture* texture = [SKTexture textureWithImageNamed:@"grass"]; texture.filteringMode = SKTextureFilteringNearest; SKSpriteNode* node = [SKSpriteNode spriteNodeWithTexture:texture size:CGSizeMake(512,512)]; 

应该产生最近邻居过滤&做 在这里输入图像说明

代码和结果与SKTextureAtlas:

 SKTextureAtlas* atlas = [SKTextureAtlas atlasNamed:@"myAtlas"]; SKTexture* texture = [atlas textureNamed:@"grass"]; texture.filteringMode = SKTextureFilteringNearest; SKSpriteNode* node = [SKSpriteNode spriteNodeWithTexture:texture size:CGSizeMake(512,512)]; 

应该产生最近的邻居过滤& 在这里输入图像说明

有什么build议么?

我一直在苦苦挣扎,完全一样的问题。

看起来,当你设置来自SKTextureAtlas的SKTexture的过滤模式时,它为来自该地图集的所有内容设置过滤模式。

我最终通过制作两个SKTextureAtlas(AtlasLinear和AtlasNearest)来解决这个问题。 一个是我的普通艺术品,另一个是pixelart。 这是一种魅力。

但是,对于非常小的类别,我有时会遇到奇怪的小像素错误。 如果这个popup给你,它实际上有助于添加一些大的白色块PNG的像素艺术图集。

祝你好运。

这确实是一个奇怪的问题。 在我看来,有一个缺less的API: [SKTextureAtlas atlasNamed:atlasName withFilteringMode:filteringMode]

暂时代替这样的API,我使用下面的方法:

 -(SKTextureAtlas *) textureAtlasWithName:(NSString *)atlasName filteringMode:(SKTextureFilteringMode)filteringMode { SKTextureAtlas * result = [SKTextureAtlas atlasNamed:atlasName]; NSArray * textureNames = [result textureNames]; if ([textureNames count] > 0) { SKTexture * aTexture = [result textureNamed:[textureNames lastObject]]; [aTexture setFilteringMode:filteringMode]; } else { NSLog(@"WARNING: couldn't find any textures in the atlas %@; filtering mode set likely failed.", result); } return result; } 

我在我的程序中设法解决了这个问题。 我发现,如果纹理图集被多次实例化,即使所有来自图集的纹理加载都设置为SKTextureFilteringNearest,纹理也会通过线性过滤进行渲染。 我最终做的是通过一个singleton提供我的图集,并确保所有的纹理加载过滤设置为SKTextureFilteringNearest,它的工作完美。