Создать текстуру MTL с полноцветной глубиной MTLTextureDescriptor - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть следующая функция для создания текстуры 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-битную глубину цвета?Цвета этой текстуры слишком ограничены для моих нужд.

Дальнейшее объяснение:

Причина, по которой я спрашиваю об этом, заключается в следующем.

Я рендеринг шейдера (оранжевые светящиеся точки, которые вы видите ниже) на текстуру, используя SKRenderer, который применяется к SCNMaterial.

Когда я рендерим шейдер нормально в сцене SpriteKit иПримените его в качестве текстуры для SCNMaterial, я получаю получающийся в результате насыщенный оранжевый цвет, который я хочу видеть, как видно на верхнем изображении.

Однако, когда я обрабатываю изображение с использованием метода SKRenderer, результаты получаются похожими на ДНО.изображение, где цвета выглядят более желтыми, разбавленными и не такими насыщенными.

enter image description here

enter image description here

Я объясняю это тем, что я 'm создание текстуры MTL без достаточной точности цвета.Я недостаточно разбираюсь в создании текстур, чтобы понять, что я могу делать неправильно, но я верю, что есть способ повысить насыщенность / точность цвета.Как ??

...