Как вы используете 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, и она работала отлично.