NSImage 到纹理

NSImage to Texture

我们有一段代码可以绘制到 NSImage(具有漂亮背景的文本),然后将其转换为 NSBitmapImageRep 用作纹理(最初是 OpenGL,现在是 Metal)。它在数以千计的客户机器上运行多年没有问题。

伪代码:

image = [[NSImage alloc] initWithSize:size];
[image lockFocus];
//Do drawing
bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:rect];
[image unlockFocus];
//Generate texture using [bitmap bitmapData];

现在我们有一位客户使用全新的 MacBook 运行 macOS 10.15,但纹理已损坏。我们已经追踪到使用浮点样本创建的 NSBitmapImageRep。

我还注意到 initWithFocusedViewRect 现已弃用。我尝试使用 [image CGImageForProposedRect] 然后从 CGImage 创建 NSBitmapImageRep,但这与浮点样本有同样的问题。

所以我的问题是:

  1. 是否可以将 NSBitmapImageRep 转换为我们需要的格式(8 位整数样本,32bpp)?
  2. 或者,如果我使用允许我指定我想要的格式的 NSBitmapImageRep 初始值设定项之一,我如何从 NSImage 中获取数据?
  3. 或者,还有其他方法可以做到这一点吗?

我发现了两种方法来完成这项工作:

  1. 事实证明,更新我们的 Metal 渲染器以支持浮点纹理非常简单,因此这是我们目前使用的解决方案。
  2. 使用 NSBitmapImageRep initWithBitmapDataPlanes... 指定我们要使用的确切格式。然后将当前上下文设置为使用图像表示创建的 NSGraphicsContext 以直接向其绘制:

    [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:bitmapRep]];