【问题标题】:Transparent pixel in SKMutableTextureSKMutableTexture 中的透明像素
【发布时间】:2018-01-14 11:55:43
【问题描述】:

我正在使用 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 时则不行(就像像素是在现有纹理之上渲染的......而不是像您正在修改实际像素数据)。

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

【问题讨论】:

    标签: swift sprite-kit sktexture


    【解决方案1】:

    来自SKMutableTexture 文档,

    您提供的颜色分量应该已经相乘了 按 alpha 值。

    通常,如果您想要 alpha 为 0.5 的红色颜色,您会使用 RGBA 组件

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

    premultiplied-alpha 颜色的等价物是

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

    RGB 分量乘以 alpha 值。

    对于您的具体情况,您可以在Color 结构中添加一个初始化器来执行乘法运算。这是一种实现方式...

    首先,定义扩展以将UInt8 缩放Float

    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 值

    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
        }
    }
    

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

    let color = Color(red:255, green:0, blue:0, alpha:127)
    

    和一个完全透明的颜色

    let color = Color(red:255, green:0, blue:0, alpha:0)
    

    【讨论】:

    • 谢谢 :) 完全错过了文档中关于预乘 alpha 的部分。
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    相关资源
    最近更新 更多