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,但这与浮点样本有同样的问题。
所以我的问题是:
- 是否可以将 NSBitmapImageRep 转换为我们需要的格式(8 位整数样本,32bpp)?
- 或者,如果我使用允许我指定我想要的格式的 NSBitmapImageRep 初始值设定项之一,我如何从 NSImage 中获取数据?
- 或者,还有其他方法可以做到这一点吗?
我发现了两种方法来完成这项工作:
- 事实证明,更新我们的 Metal 渲染器以支持浮点纹理非常简单,因此这是我们目前使用的解决方案。
使用 NSBitmapImageRep initWithBitmapDataPlanes... 指定我们要使用的确切格式。然后将当前上下文设置为使用图像表示创建的 NSGraphicsContext 以直接向其绘制:
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:bitmapRep]];
我们有一段代码可以绘制到 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,但这与浮点样本有同样的问题。
所以我的问题是:
- 是否可以将 NSBitmapImageRep 转换为我们需要的格式(8 位整数样本,32bpp)?
- 或者,如果我使用允许我指定我想要的格式的 NSBitmapImageRep 初始值设定项之一,我如何从 NSImage 中获取数据?
- 或者,还有其他方法可以做到这一点吗?
我发现了两种方法来完成这项工作:
- 事实证明,更新我们的 Metal 渲染器以支持浮点纹理非常简单,因此这是我们目前使用的解决方案。
使用 NSBitmapImageRep initWithBitmapDataPlanes... 指定我们要使用的确切格式。然后将当前上下文设置为使用图像表示创建的 NSGraphicsContext 以直接向其绘制:
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:bitmapRep]];