Освещение SKSpriteNode не работает с текстурами из SKTextureAtlas

Я столкнулся с проблемой со SpriteKit (пробовал Xcode 7 beta и Xcode 6.4 на OS X 10.11 beta), где освещение с нормальным отображением выходит из строя, если я создаю SKTextureAtlas из изображения и обычных файлов, которые работают при индивидуальном использовании. Смотрите этот пример:

Слева направо:

  • Спрайт с текстурой + нормальный + освещение (текстуры из атласа)
  • Спрайт с текстурой + нормальный (текстуры из атласа)
  • Спрайт с текстурой (текстура из атласа)
  • Спрайт с нормальной текстурой (текстура из атласа)
  • Спрайт с текстурой + нормальный + освещение (текстуры, созданные из отдельных файлов через imageNamed:)

Атлас создается во время выполнения с помощью SKTextureAtlas atlasWithDictionary: и содержит следующие текстуры:

creating atlas with files: {
    "shield-normal.png" = "shield-normal.png";
    "shield.png" = "shield.png";
    "swords-normal.png" = "swords-normal.png";
    "swords.png" = "swords.png";
}

Примечание: я получаю ту же самую проблему, если я создаю Атлас в XCode и загружаю его через atlasNamed: - таким образом, проблема определенно не в том, как или когда атлас создан, а потому что текстуры получены из атласа в первом место.

Если я создаю спрайт с отдельными файлами, освещение работает (самое правое изображение):

tex = [SKTexture textureWithImageNamed:@"shield.png"];
normal = [SKTexture textureWithImageNamed:@"shield-normal.png"];
test2 = [SKSpriteNode spriteNodeWithTexture:tex normalMap:normal];
test2.position = CGPointMake(580, 400);
test2.lightingBitMask = 0xffffffff;
[self addChild:test2];

Я делаю ту же самую вещь с файлами атласа, и скриншот выше доказывает, что я получаю правильные изображения (3-е и 4-е слева) для текстуры спрайта и нормальные как текстуры из атласа. Тем не менее, результатом является 1-е изображение слева, освещенный спрайт без нормального отображения.

Интересно, обычные текстуры требуют такой формы постобработки, которую не использует SKTextureAtlas? Или у кого-то еще были проблемы с нормальными текстурами в атласе?

Или, может быть, это ошибка?


Обновление: я воспроизвел это поведение в новом приложении SpriteKit (OS X, загрузите его здесь и попробуйте сами) со следующим кодом:

-(void)didMoveToView:(SKView *)view {
    SKLightNode* light = [SKLightNode node];
    light.position = CGPointMake(0, 0);
    [self addChild:light];

    id move1 = [SKAction moveByX:400 y:300 duration:3];
    id move2 = [SKAction moveByX:-400 y:-300 duration:3];
    id repeat = [SKAction repeatActionForever:[SKAction sequence:@[move1, move2]]];
    [light runAction:repeat];


    SKTexture* tex, *nor;
    SKSpriteNode* spr;
    {   // sprite with textures from individual files: lighting works
        tex = [SKTexture textureWithImageNamed:@"shield.png"];
        nor = [SKTexture textureWithImageNamed:@"shield-normal.png"];
        spr = [SKSpriteNode spriteNodeWithTexture:tex normalMap:nor];
        spr.position = CGPointMake(111, 111);
        spr.lightingBitMask = 0xffffffff;
        [self addChild:spr];
    }
    {   // sprite with textures from atlas: lighting does not work (no normal-map)
        SKTextureAtlas* atlas = [SKTextureAtlas atlasNamed:@"TicTac"];
        NSLog(@"atlas texture names: %@", atlas.textureNames);

        tex = [atlas textureNamed:@"shield.png"];
        nor = [atlas textureNamed:@"shield-normal.png"];
        spr = [SKSpriteNode spriteNodeWithTexture:tex normalMap:nor];
        spr.position = CGPointMake(222, 111);
        spr.lightingBitMask = 0xffffffff;
        [self addChild:spr];
    }
}

0 ответов

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