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使用它可以获得的每个可能值来设置密钥,但这也不起作用.
编辑:您可以查看此仓库中的示例项目,并使用它来重现此用例.
在 macOS 12.3.1 上使用 Xcode 13.3.1 for iOS 15.4 应用程序。
\n诀窍是,环境照明需要立方体纹理,而不是平面图像。
\nAssets文件夹中创建立方体纹理集粘贴代码:
\nimport 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}\nRun Code Online (Sandbox Code Playgroud)\n将金属材料应用于模型。现在 MTL 环境照明已打开。
\n\n如果您需要程序天空盒纹理 \xe2\x80\x93 使用MDLSkyCubeTexture类。
\n还有这个帖子可能对您有用。
\n| 归档时间: |
|
| 查看次数: |
511 次 |
| 最近记录: |