【问题标题】:Is it possible to draw text via [NSString drawAtPoint] or display a NSButton inside a Metal view?是否可以通过 [NSString drawAtPoint] 绘制文本或在 Metal 视图中显示 NSButton?
【发布时间】:2021-04-03 04:43:13
【问题描述】:

我需要在我的 Metal 应用程序中呈现一些文本。与其手动操作,我更愿意使用 Apple 的文本渲染 API。

在一个简单的空窗口的drawRect 中调用此代码会打印字符串:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[NSFont fontWithName:@"Helvetica" size:26], NSFontAttributeName,[NSColor blackColor], NSForegroundColorAttributeName, nil];

NSAttributedString * s = [[NSAttributedString alloc] initWithString:@"Hello!"
attributes: attributes];


[s drawAtPoint:NSMakePoint(300, 300)];

但这在具有金属视图的窗口中不起作用。我猜一切都被冲洗掉了?

有可能吗?在 Metal 视图上显示按钮 (NSButton) 也是如此。

谢谢。

【问题讨论】:

    标签: objective-c macos cocoa metal metalkit


    【解决方案1】:

    这是可能的,但并不简单。您需要将drawViewHierarchyInRectUILabelUIButton 一起使用,并传递从CVPixelBufferRef 创建的上下文。从那里,您需要使用金属 api 将 CVPixelBufferRef 链接到金属纹理,然后您可以正常绘制。我不建议每帧都这样做。

    如果您需要一些用金属渲染的精美 UI,可能有更好的选择,或者您可以在金属视图顶部的 UIView 内渲染标签、按钮等。

    您的文本需要在 3D 世界中还是在 2D 中叠加在顶部?

    【讨论】:

    • 谢谢。文本需要在 2D 之上。
    • 在这种情况下,金属视图顶部的透明 ui 视图应该会很好用!
    • 非常感谢。最后一件事。我可以使用 Apple 的字体渲染将字符串写入纹理以通过 Metal 显示它吗?这应该比使用 UILabel 更简单。我认为 Valve 在这里与 GDI+ 做类似的事情:github.com/lua9520/source-engine-2018-hl2_src/blob/master/vgui2/…
    • 是的,您可以写入纹理,请参阅我关于使用 cv 像素缓冲区并将其映射到纹理的答案的顶部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多