SKMutableTexture中的透明像素

时间:2018-01-14 11:55:43

标签: swift sprite-kit sktexture

我正在使用SKMutableTexture在游戏中渲染可破坏的地面。出于所有意图和目的,这非常有效,除非我想将透明像素渲染到MutableTexture中已存在非透明像素的位置。

我为RGBAColor创建了一个结构,如下所示:

struct RGBAColor {

    var r: UInt8
    var g: UInt8
    var b: UInt8
    var a: UInt8


    static var clear    = RGBAColor(r: 0, g: 0, b: 0, a: 0)
}
然后我按照这样修改SKMutableTexture:

self.texture.modifyPixelData({ (voidptr, len) in

            let bytes = voidptr!.assumingMemoryBound(to: RGBAColor.self)

            for (index, color) in self.modifiedPixels {
                bytes[index] = color
                self.pixels[index] = color
            }

        })

..其中“modifiedPixels”是像[Int:RGBAColor]这样的字典(为了不更新纹理中的所有像素 - 只修改修改后的像素。

当颜色具有alpha(a)>时,它按照我的意图工作。 0 ..但不是0时(就像像素在现有纹理的顶部渲染一样......而不像你正在修改实际的像素数据)。

我做错了吗?或者这是预期的行为?

1 个答案:

答案 0 :(得分:1)

来自SKMutableTexture文档,

  

您提供的颜色成分应该已成倍增加   通过alpha值。

通常情况下,如果你想要一个红色且alpha为0.5的颜色,你可以使用RGBA组件

(red:1.0, green:0.0, blue:0.0, alpha:0.5)

预乘-α颜色的等价物是

(red:0.5, green:0.0, blue:0.0, alpha:0.5)

其中RGB分量乘以alpha值。

对于您的特定情况,您可以向Color结构添加初始值设定项以执行乘法运算。这是一种实现......

的方法

首先,定义一个扩展程序,按{/ 1}增加UInt8个值{/ 1}

Float

然后添加一个初始值设定项,自动将组件乘以alpha值

extension UInt8 {
    func scaled(by value:Float) -> UInt8 {
        var scale = UInt(round(Float(self) * value))
        scale = Swift.min(scale, UInt(UInt8.max))
        return UInt8(scale)
    }
}

然后,您可以创建一个红色,颜色为alpha = 0.5 by

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

    init(red:UInt8,green:UInt8,blue:UInt8,alpha:UInt8) {
        let alphaScale = Float(alpha) / Float(UInt8.max)
        self.red = red.scaled(by: alphaScale)
        self.blue = blue.scaled(by: alphaScale)
        self.green = green.scaled(by: alphaScale)
        self.alpha = alpha
    }
}

和完全透明的颜色

let color = Color(red:255, green:0, blue:0, alpha:127)
相关问题