我具有以下创建MTL纹理的功能;
let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
let bytesPerPixel = Int(4)
let bitsPerComponent = Int(8)
let bitsPerPixel:Int = 32
var textureSizeX:Int = 1200
var textureSizeY:Int = 1200
func setupTexture() {
var rawData0 = [UInt8](repeating: 0, count: Int(textureSizeX) * Int(textureSizeY) * 4)
let bytesPerRow = 4 * Int(textureSizeX)
let bitmapInfo = CGBitmapInfo.byteOrder32Big.rawValue | CGImageAlphaInfo.premultipliedLast.rawValue
let context = CGContext(data: &rawData0, width: Int(textureSizeX), height: Int(textureSizeY), bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: rgbColorSpace, bitmapInfo: bitmapInfo)!
context.setFillColor(UIColor.black.cgColor)
context.fill(CGRect(x: 0, y: 0, width: CGFloat(textureSizeX), height: CGFloat(textureSizeY)))
let textureDescriptor = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: MTLPixelFormat.rgba8Unorm, width: Int(textureSizeX), height: Int(textureSizeY), mipmapped: false)
textureDescriptor.usage = MTLTextureUsage(rawValue: MTLTextureUsage.renderTarget.rawValue | MTLTextureUsage.shaderRead.rawValue)
let textureA = device.makeTexture(descriptor: textureDescriptor)
let region = MTLRegionMake2D(0, 0, Int(textureSizeX), Int(textureSizeY))
textureA?.replace(region: region, mipmapLevel: 0, withBytes: &rawData0, bytesPerRow: Int(bytesPerRow))
offscreenTexture = textureA
}
如何更改此功能,使其产生可以处理完整32位色深的纹理?这种纹理产生的颜色太有限,无法满足我的需求。
进一步的解释:
我问这个的原因是由于以下原因。
我正在使用应用于SCNMaterial的SKRenderer渲染着色器(如下所示的橙色发光点)以进行纹理化。
当我在SpriteKit场景中正常渲染着色器并将其作为SCNMaterial的纹理应用时,我得到的结果是想要的丰富橙色外观,如在TOP图像中所示。
但是,当我使用SKRenderer方法处理图像时,结果看起来像是底部图像,其颜色看起来更黄,变淡了而又不那么丰富。
我认为这是因为我创建的MTLTexture没有足够的色彩精度。我对纹理创建的了解还不够,无法知道我可能做错了什么,但我相信有一种方法可以增加色彩的丰富度/准确性。怎么样?