ios – 当Alpha值不是1或0时,Metal MTLTexture用黑色替换半透明区域

在使用 Apple’s texture importer或我自己的时候,在软件中绘制的白色软边圆圈(带有透明的bg)或者在Photoshop中(保存为PNG)在渲染时会将其半透明颜色替换为黑色.

下面是Xcode的Metal调试器的屏幕抓取,你可以在发送到着色器之前看到纹理.

Image located here (I’m not high ranked enough to embed)

在Xcode,finder中,当放入UIImageView时,源纹理没有环.但是在UIImage的某个地方 – > CGContex – > MTLTexture过程(我特别考虑MTLTexture部分)透明部分变暗.

在过去的几天里,我一直在撞墙,改变我所能做的一切,但我无法理解.

为了透明(ha),这是我的个人导入代码

import UIKit
import CoreGraphics

class MetalTexture {

    class func imageToTexture(imageNamed: String,device: MTLDevice) -> MTLTexture {
        let bytesPerPixel = 4
        let bitsPerComponent = 8

        var image = UIImage(named: imageNamed)!

        let width = Int(image.size.width)
        let height = Int(image.size.height)
        let bounds = CGRectMake(0,CGFloat(width),CGFloat(height))

        var rowBytes = width * bytesPerPixel
        var colorSpace = CGColorSpaceCreateDeviceRGB()

        let context = CGBitmapContextCreate(nil,width,height,bitsPerComponent,rowBytes,colorSpace,CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue))

        CGContextClearRect(context,bounds)
        CGContextTranslateCTM(context,CGFloat(height))
        CGContextScaleCTM(context,-1.0,-1.0)
        CGContextDrawImage(context,bounds,image.CGImage)

        var texDescriptor = MTLTextureDescriptor.texture2DDescriptorWithPixelFormat(.RGBA8Unorm,width: width,height: height,mipmapped: false)

        var texture = device.newTextureWithDescriptor(texDescriptor)
        texture.label = imageNamed

        var pixelsData = CGBitmapContextGetData(context)

        var region = MTLRegionMake2D(0,height)
        texture.replaceRegion(region,mipmapLevel: 0,withBytes: pixelsData,bytesPerRow: rowBytes)

        return texture
    }
}

但我不认为这是问题所在(因为它是Swift中Apple的副本,而我使用了它们而没有差异).

任何线索都会非常有用.

解决方法

感谢Jessy,我决定看看我是如何混合我的alphas并且我已经弄清楚了.我的纹理在GPU调试器中仍然看起来很暗,但在实际应用中,一切看起来都是正确的.我对管道状态描述符进行了更改,您可以在下面看到.
pipelineStateDescriptor.colorAttachments[0].blendingEnabled = true
pipelineStateDescriptor.colorAttachments[0].rgbBlendOperation = .Add
pipelineStateDescriptor.colorAttachments[0].alphaBlendOperation = .Add
pipelineStateDescriptor.colorAttachments[0].sourceRGBBlendFactor = .DestinationAlpha
pipelineStateDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .DestinationAlpha
pipelineStateDescriptor.colorAttachments[0].destinationRGBBlendFactor = .OneMinusSourceAlpha
pipelineStateDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .OneMinusBlendAlpha

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...