2016-08-31 9 views
3

pixelDataからSKSpriteNodeを作成する際に問題があります。SKTexture(data:size :)から作成されたSKSpriteNodeは、Alpha(不透明度)の問題

以下は私のコードです。

var pixelData: [UInt32] = [UInt32](count: 256, repeatedValue: 0xff0000ff) 
pixelData.appendContentsOf([UInt32](count: 256, repeatedValue: 0xff00ff00)) 
pixelData.appendContentsOf([UInt32](count: 256, repeatedValue: 0xffff0000)) 
pixelData.appendContentsOf([UInt32](count: 256, repeatedValue: 0x000000ff)) 

let data = NSData(bytes: pixelData, length: pixelData.count * sizeof(UInt32)) 

let texture = SKTexture(data: data, size: CGSize(width: 32, height: 32)) 

let node = SKSpriteNode(texture: texture, size: CGSize(width: 32, height: 32)) 
node.position.x = self.frame.midX 
node.position.y = self.frame.midY 

self.addChild(node) 

私は(ピクセルデータ配列、0xff0000ff0xff00ff000xffff0000の最初の3つの部分である:赤、緑、青)3つの一番下の行の望むようにそれは行ってきました。

しかし、私は一番上の行が完全に透明であることを期待しました:0x000000ffこれはrgba(1,0,0,0)を意味するはずです。これが起こる理由を私は知らない

:しかし、このとして登場しました。 pixelDataの理解が間違っていますか?それともSpriteKitのバグですか?

ありがとうございました! SKTextureへピクセルデータを変換するための便利な方法のドキュメントから

答えて

1

色成分は、すでにアルファ値が乗算されていなければなりません。

アルファ値も0である場合、赤色成分は、成分である場合に特に進値を有する画素の色を表現するためにいくらかの非直感的である、0xffできないのでその結果、値0x000000ffは、未定義です逆の順序で。

あるいは、色を表し、次に初期化中にアルファ値により各色成分を事前に乗算するデータ構造を定義することができます。あなたは、次に定義することができ

struct Color { 
    var red:UInt8 
    var green:UInt8 
    var blue:UInt8 
    var alpha:UInt8 

    // You can omit the parameters that have default values. 
    init(red:UInt8=0, green:UInt8=0, blue:UInt8=0, alpha:UInt8=UInt8.max) { 
     let alphaValue:Float = Float(alpha)/255 
     self.red = UInt8(round(Float(red) * alphaValue)) 
     self.green = UInt8(round(Float(blue) * alphaValue)) 
     self.blue = UInt8(round(Float(green) * alphaValue)) 
     self.alpha = alpha 
    } 
} 

とでpixelData配列を初期化」あなたのコードと同じ」値

var pixelData:[Color] = [Color](count: 256, repeatedValue: Color(red: UInt8.max)) 
    pixelData += [Color](count:256, repeatedValue: Color(green: UInt8.max)) 
    pixelData += [Color](count:256, repeatedValue: Color(blue: UInt8.max)) 
    pixelData += [Color](count:256, repeatedValue: Color(red: UInt8.max, alpha: 0)) 

let data = NSData(bytes: pixelData, length: pixelData.count * sizeof(Color)) 
NSDataオブジェクトを作成することにより、
関連する問題