当alpha值不是1或0时,Metal MTLTexture用黑色替换半透明区域
在使用Apple的纹理导入器或我自己的时候,用软件(带有透明的bg)或Photoshop(保存为PNG)绘制的白色软边圆圈在渲染时会将其半透明颜色替换为黑色。
下面是Xcode的Metal调试器的屏幕抓取,你可以在发送到着色器之前看到纹理。
图像位于此处(我的排名不够高,无法嵌入)
在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, 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(width), 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, 0, width, 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
由于您使用的CGContext
配置为使用与alpha通道预乘的颜色,因此使用标准RGB = src.rgb * src.a + dst.rgb * (1-src.a)
将导致黑暗区域,因为src.rgb
值已经与src.a
预乘 。 这意味着你想要的是src.rgb + dst.rgb * (1-src.a)
,其配置如下:
pipeline.colorAttachments[0].isBlendingEnabled = true pipeline.colorAttachments[0].rgbBlendOperation = .add pipeline.colorAttachments[0].alphaBlendOperation = .add pipeline.colorAttachments[0].sourceRGBBlendFactor = .one pipeline.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha pipeline.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha pipeline.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha
.one
表示按原样保留RGB。 预乘颜色的原因是您只需要在创建时将颜色乘以一次,而不是每次混合时。 您的配置也实现了这一点,但是是间接的。
- 当两个单独的NSFetchRequests都完成时采取行动
- Xamarin iOS验证文本字段教程
- 使用GCD执行sudzc webservice
- 如何检索iOS中的ssl服务器证书?
- 检测UITextView中的字符
- 捆绑标识符iOS Provisioning Portal
- launchOptions’UIApplicationLaunchOptionsLocalNotificationKey’是否包含NSDictionary或UILocalNotification
- 在屏幕上获取某种颜色占用的区域 – iOS
- iOS 9 Facebooklogin模拟器-canOpenURL:URL失败:“fbauth2:///” – 错误:“(null)”