31

我想将一个对象设置为场景的环境图,因为根据文档MTLTexture似乎是可能的。我可以使用以下代码将环境贴图设置为:UIImage

let roomImage = UIImage(named: "room")
scene.lightingEnvironment.contents = roomImage

这很有效,我看到图像在金属物体上的反射。我尝试将图像转换为 aMTLTexture并使用以下代码将其设置为环境贴图:

let roomImage = UIImage(named: "room")
let loader = MTKTextureLoader(device: MTLCreateSystemDefaultDevice()!)
let envMap = try? loader.newTexture(cgImage: (roomImage?.cgImage)!, options: nil)
scene.lightingEnvironment.contents = envMap

但是,这不起作用,我最终得到一个空白的环境贴图,我的对象没有反射。

此外,我没有设置optionsas nil,而是尝试使用它可以获得的所有可能值MTKTextureLoader.Option.textureUsage设置密钥,但这也不起作用。

编辑:您可以查看repo 中的示例项目并使用它来重现此用例。

4

1 回答 1

2

使用 MTK 纹理照明 SCN 环境

在 macOS 12.2 上为 iOS 15.2 应用程序使用 Xcode 13.2.1。


诀窍是,环境照明需要立方体纹理,而不是平面图像。

  • 为 MetalKit 立方体纹理创建 6 个方形图像

在此处输入图像描述

  • 在 XcodeAssets文件夹中创建 Cube Texture Set

在此处输入图像描述

  • 将纹理放置到其对应的插槽中

在此处输入图像描述

  • 如果需要,水平和垂直镜像

在此处输入图像描述

粘贴代码:

import ARKit
import MetalKit

class ViewController: UIViewController {

    @IBOutlet var sceneView: ARSCNView!
    
    override func viewDidLoad() {
        super.viewDidLoad()    
        let scene = SCNScene()
        
        let imageName = "CubeTextureSet"
        let textureLoader = MTKTextureLoader(device: sceneView.device!)

        let environmentMap = try! textureLoader.newTexture(name: imageName, 
                                                    scaleFactor: 2, 
                                                         bundle: .main, 
                                                        options: nil)
        
        let daeScene = SCNScene(named: "art.scnassets/testCube.dae")!

        let model = daeScene.rootNode.childNode(withName: "polyCube", 
                                             recursively: true)!
        
        scene.lightingEnvironment.contents = environmentMap
        scene.lightingEnvironment.intensity = 2.5
        scene.background.contents = environmentMap

        sceneView.scene = scene
        sceneView.allowsCameraControl = true
        scene.rootNode.addChildNode(model)
    }
}

将金属材料应用于模型。现在 MTL 环境照明已打开。

在此处输入图像描述


如果您需要程序化天空盒纹理 - 使用MDLSkyCubeTexture类。

于 2018-09-06T11:21:44.313 回答