【问题标题】:How to load black white image into metal texture如何将黑白图像加载到金属纹理中
【发布时间】:2020-10-29 22:12:51
【问题描述】:

我使用两种方法在金属中加载黑白图像纹理,如下所示:

 //1.
    mtltexture01 = [textureLoader newTextureWithName:@"texture02"
                                         scaleFactor:1.0
                                              bundle:nil
                                             options:textureLoaderOptions
                                               error:&error];



 //2.
    UIImage *img = [UIImage imageNamed:@"texture02"];

    mtltexture01 = [textureLoader newTextureWithCGImage:img.CGImage options:textureLoaderOptions error:&error];

但是都崩溃了,错误日志是

"错误域=MTKTextureLoaderErrorDomain Code=0"图像解码 failed" UserInfo={NSLocalizedDescription=图像解码失败, MTKTextureLoaderErrorKey=图像解码失败}",

如何解决这个问题?此外,如果我将彩色图像加载到金属中,它会运行。

【问题讨论】:

  • 建议将第 99 行和第 104 行相互交换(截图中的#)。在 99 中,您从包中加载纹理,然后加载 UIImage,然后再次加载纹理,但从堆栈中加载。你打算为你的加载器做任何一种回退机制吗?

标签: ios objective-c metal


【解决方案1】:
-(id<MTLTexture>)textureWithName:(NSString*)imgname UsingDevice:(id<MTLDevice>)device {

     MTKTextureLoader* textureLoader = [[MTKTextureLoader alloc] initWithDevice:device];

     NSDictionary *textureLoaderOptions = @{
         MTKTextureLoaderOptionTextureUsage : @(MTLTextureUsageShaderRead),
         MTKTextureLoaderOptionTextureStorageMode : @(MTLStorageModePrivate)
     };

     return [textureLoader newTextureWithName:imgname
         scaleFactor:1.0
         bundle:nil
         options:textureLoaderOptions
         error:nil];
}

在您的金属配置中

id<MTLTexture> mtltexture01;

mtltexture01 = [self textureWithName:@"texture02" UsingDevice:device];

请记住,texture02 是一个文件名,该文件需要在您的应用资产中可用。您可以将图像作为 MTLTexture 存储到 Xcode 中的资产中,因此转换在构建时完成。

还要检查图像是否至少包含适当的不透明度,并且是 PNG、JPEG 或 TIFF 格式之一。当纹理仅包含灰色/黑色并且使用 0% 透明度时,已知加载程序会出现问题。

稍后将您的纹理集成到 renderEncoder/commandEncoder

屏幕截图:Xcode 资产纹理配置器

【讨论】:

  • 谢谢大家。那么“当纹理仅包含灰色/黑色并且使用 0% 透明度时,存在已知的加载程序问题”是什么意思?
  • 加载器能够将图像转换为 mtlkits 原生纹理(缓冲区)格式。如果您需要制作自定义加载器developer.apple.com/documentation/metal/…,请在此处阅读,因为质量原因,我会使用 PNG 图像,而且您不会像使用 TIFF 和 JPEG 那样犯太多错误。这样您至少知道它是否正常工作。但是,嘿,把它作为资产放到你的资产目录中,并在那里声明为 MTLTexture。检查格式是否被接受的最简单方法
  • 我不是资产目录专家,因为在我的应用程序中以编程方式进行最多的图像处理。如果需要的话。值得另一个问题。祝你好运
  • 那么你是通过MTLTextureDescriptor类来处理金属纹理的吗?
  • 是的,我这样做了,但这对你来说只是在纹理缓冲区中加载图像可能有点过头了。我这样做是因为我的一些纹理是动态的,而且我的可视化显示了实时数据。
猜你喜欢
  • 2018-07-30
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
相关资源
最近更新 更多