使用MTLTexture作为SCNScene的环境映射

hal*_*lei 17 ios scenekit swift metal mtlbuffer

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

let roomImage = UIImage(named: "room")
scene.lightingEnvironment.contents = roomImage
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

编辑:您可以查看仓库中的示例项目,并使用它来重现此用例.

ARG*_*Geo 2

使用 MTK 纹理照明 SCN 环境

\n

在 macOS 12.3.1 上使用 Xcode 13.3.1 for iOS 15.4 应用程序。

\n


\n

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

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

在此输入图像描述

\n
    \n
  • 在Xcode中Assets文件夹中创建立方体纹理集
  • \n
\n

在此输入图像描述

\n
    \n
  • 将纹理放置到相应的插槽中
  • \n
\n

在此输入图像描述

\n
    \n
  • 如果需要,可以水平和垂直镜像
  • \n
\n

在此输入图像描述

\n

粘贴代码:

\n
import ARKit\nimport MetalKit\n\nclass ViewController: UIViewController {\n\n    @IBOutlet var sceneView: ARSCNView!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()    \n        let scene = SCNScene()\n        \n        let imageName = "CubeTextureSet"\n        let textureLoader = MTKTextureLoader(device: sceneView.device!)\n\n        let environmentMap = try! textureLoader.newTexture(name: imageName, \n                                                    scaleFactor: 2, \n                                                         bundle: .main, \n                                                        options: nil)\n        \n        let daeScene = SCNScene(named: "art.scnassets/testCube.dae")!\n\n        let model = daeScene.rootNode.childNode(withName: "polyCube", \n                                             recursively: true)!\n        \n        scene.lightingEnvironment.contents = environmentMap\n        scene.lightingEnvironment.intensity = 2.5\n        scene.background.contents = environmentMap\n\n        sceneView.scene = scene\n        sceneView.allowsCameraControl = true\n        scene.rootNode.addChildNode(model)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

在此输入图像描述

\n

如果您需要程序天空盒纹理 \xe2\x80\x93 使用MDLSkyCubeTexture类。

\n

还有这个帖子可能对您有用。

\n