如何在SKTextureAtlas中使用SKTextureFilteringNearest

时间:2013-11-15 01:48:43

标签: ios objective-c sprite-kit

我似乎遇到了使用SKTextureAtlas和纹理最近邻过滤的问题。当我使用没有SKTextureAtlas的最近邻居过滤时它工作正常,但是当我使用SKTextureAtlas时,所有内容都只是更改为线性过滤。

没有SKTextureAtlas的代码和结果:

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

应该产生最近邻过滤&确实 enter image description here

代码和结果使用SKTextureAtlas:

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

应该产生最近邻过滤& enter image description here

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

我一直在努力解决同样的问题。

似乎当您为来自SKTextureAtlas的SKTexture设置过滤模式时,它会为该图集中的所有内容设置过滤模式。

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

然而,对于非常小的atlasses我有时会得到奇怪的小像素错误。如果弹出这个,实际上有助于为你的像素艺术地图集添加一些大的白色块png。

祝你好运。

答案 1 :(得分:3)

这确实是一个奇怪的问题。在我看来,缺少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;
}

答案 2 :(得分:1)

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