SpriteKit (OS X 10.11 ベータ版で Xcode 7 ベータ版と Xcode 6.4 を試した) で問題が発生しました。個別に使用すると機能する画像と法線ファイルから 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];
}
}