Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用MTLTexture作为SCNScene的环境映射_Ios_Swift_Scenekit_Metal_Mtlbuffer - Fatal编程技术网

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
相同的图像。。