Освещение 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];
}
}