Ios 使用MTLTexture作为SCNScene的环境映射
我想将一个Ios 使用MTLTexture作为SCNScene的环境映射,ios,swift,scenekit,metal,mtlbuffer,Ios,Swift,Scenekit,Metal,Mtlbuffer,我想将一个MTLTexture对象设置为场景的环境贴图,因为根据场景,这似乎是可能的。我可以使用以下代码将环境贴图设置为UIImage: let roomImage = UIImage(named: "room") scene.lightingEnvironment.contents = roomImage let roomImage = UIImage(named: "room") let loader = MTKTextureLoader(device: MTLCreateSystemDe
MTLTexture
对象设置为场景的环境贴图,因为根据场景,这似乎是可能的。我可以使用以下代码将环境贴图设置为UIImage
:
let roomImage = UIImage(named: "room")
scene.lightingEnvironment.contents = roomImage
let roomImage = UIImage(named: "room")
let loader = MTKTextureLoader(device: MTLCreateSystemDefaultDevice()!)
let envMap = try? loader.newTexture(cgImage: (roomImage?.cgImage)!, options: nil)
scene.lightingEnvironment.contents = envMap
这是可行的,我看到图像在我的金属物体上的反射。我尝试将图像转换为MTLTexture
,并使用以下代码将其设置为环境贴图:
let roomImage = UIImage(named: "room")
scene.lightingEnvironment.contents = roomImage
let roomImage = UIImage(named: "room")
let loader = MTKTextureLoader(device: MTLCreateSystemDefaultDevice()!)
let envMap = try? loader.newTexture(cgImage: (roomImage?.cgImage)!, options: nil)
scene.lightingEnvironment.contents = envMap
然而,这不起作用,我最终得到了一个空白的环境贴图,在我的对象上没有反射
另外,我没有将选项设置为nil
,而是尝试使用它设置MTKTextureLoader.Option.textureUsage
键,但这也不起作用
编辑:您可以查看repo中的示例项目,并使用它重现此用例。我认为问题在于创建MTLTexture对象的标准分配和初始化技术
使用MTLTexture
协议–用于存储GPU可访问的格式化图像数据的内存分配
纹理数据可以同步或异步加载MTKTextureLoader
方法返回符合MTLTexture
协议的对象,但该类不为您管理此对象不要使用标准分配和初始化技术来创建MTLTexture
对象
在iOS中,MTLBuffer
协议的方法创建并返回一个新的纹理对象,该对象将源缓冲区对象的存储分配作为其纹理图像数据共享。因为它们共享相同的存储,所以对新纹理像素的任何更改都会反映在源缓冲区中,反之亦然
let mtlTex = buffer.makeTexture(descriptor: descriptor,
offset: 0,
bytesPerRow: array.count * MemoryLayout.size)
我相信这是一个受支持的用例。你的形象有多大尺寸?它是什么格式的(我假设是PNG)?加载完成后,envMap
是否包含非nil
值?如果在加载它的行之后设置一个断点,你能在Xcode中快速查看它(目视检查它的内容)吗?@warrenm该图像是一个1024x512 PNG文件envMap
似乎已成功创建,Quick Look显示与roomImage
相同的图像。。