Как указать формат текстуры металла, совместимый с симулятором iOS, из файла на диске? - PullRequest
0 голосов
/ 20 июня 2020

Работая с другим сообщением здесь в качестве отправной точки, я пытаюсь сделать что-то подобное. Получив текстуру .jpg из этого поста, мой код отлично работает на реальном устройстве, но не работает в симуляторе. Причина, по-видимому, связана с форматом изображения.

Как упоминалось в документации Apple здесь , вы не можете использовать формат MTLPixelFormat.r8Unorm_srgb, который, как я полагаю, кодирует эту текстуру, на основе следующей ошибки:

failed assertion `pixelFormat (11) is not a valid MTLPixelFormat.'

Пытаюсь выяснить, как изменить формат, но не знаю, как go об этом. Я не знаю, можно ли его загрузить в конкретное цветовое пространство во время создания, или мне нужно сделать что-то конкретное c в Photoshop, возможно, даже полностью изменить тип файла, но даже там я не вижу как отключить цветовые профили, просто измените их на что-нибудь другое.

Так есть ли у кого-нибудь информация о том, как можно создать / загрузить текстуру, которая также совместима с симулятором?

Обновить

Кто-то спрашивает, вот как я настраиваю текстуру.

let noiseImage = UIImage(resourceName: "Noise", extension: "jpg")!
myMaterial.setValue(SCNMaterialProperty(contents: noiseImage), forKey: "noiseTexture")

Вот инициализатор удобства, который используется выше ...

extension UIImage {

    convenience init?(resourceName:String, extension:String? = nil, bundle:Bundle? = nil) {

        let bundle = bundle ?? Bundle.main

        guard let resourceFileName = bundle.path(forResource: resourceName, ofType: `extension`) else {
            return nil
        }

        self.init(contentsOfFile: resourceFileName)
    }
}

1 Ответ

0 голосов
/ 21 июня 2020

Похоже, это ошибка в SceneKit, которая не учитывает тот факт, что определенные форматы пикселей не поддерживаются симулятором iOS. Вы можете обойти это, создав вручную текстуру Metal с помощью MetalKit:

let textureLoader = MTKTextureLoader(device: scnView.device!)

let noiseImage = UIImage(resourceName: "Noise", extension: "jpg")?.cgImage
let texture = try! textureLoader.newTexture(cgImage: noiseImage!, options: [:])
myMaterial.setValue(SCNMaterialProperty(contents: texture), forKey: "noiseTexture")
...