【问题标题】:NSImage to TextureNSImage 到纹理
【发布时间】:2019-10-15 22:05:28
【问题描述】:

我们有一段代码绘制到 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];

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

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

所以我的问题是:

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

【问题讨论】:

    标签: objective-c cocoa opengl metal


    【解决方案1】:

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

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

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

    【讨论】:

    • 2 号是 Apple 推荐的正确解决方案。请参阅10.6 release notes 并搜索“NSBitmapImageRep:CoreGraphics 阻抗匹配和性能说明”。读那个。 (事实上​​,从“NSImage、CGImage 和 CoreGraphics 阻抗匹配”开始并通读作为背景可能很有用。)
    猜你喜欢
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2011-08-16
    • 2011-03-16
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多