Как вы используете 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)];

Должен производить фильтрацию ближайшего соседа и не выполняет

Какие-либо предложения?

3 ответа

Я боролся с точно такой же проблемой.

Кажется, что когда вы устанавливаете режим фильтрации для SKTexture, поступающей из SKTextureAtlas, он устанавливает режим фильтрации для всего, что выходит из этого атласа.

В итоге я решил эту проблему, сделав два SKTextureAtlas (AtlasLinear и AtlasNearest). Один для моей обычной иллюстрации, другой для pixelart. Это работает как шарм.

Однако с очень маленькими очками я иногда получаю странные маленькие пиксельные ошибки. Если это всплывет для вас, это на самом деле помогает добавить несколько больших белых png блоков в ваш пиксельный арт-атлас.

Удачи.

Это действительно странная проблема. Мне кажется, что отсутствует 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, текстуры визуализируются с помощью линейной фильтрации. В итоге я предоставил свой атлас через синглтон и удостоверился, что все текстуры загружены с фильтрацией, установленной в SKTextureFilteringNearest, и она работала отлично.

Другие вопросы по тегам