Мне нужно отобразить текст в моем приложении Metal. Вместо того, чтобы делать это вручную, я бы хотел использовать API рендеринга текста Apple.
Вызов этого кода в простом пустом окне 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) поверх Metal view.
Спасибо.
Можно, но не просто. Вам нужно будет использовать drawViewHierarchyInRect
с UILabel
или UIButton
и передать контекст, созданный из CVPixelBufferRef
. Оттуда вам нужно использовать API металла, чтобы связать CVPixelBufferRef
с металлической текстурой, которую затем вы можете рисовать как обычно. Я бы не рекомендовал делать это каждый кадр.
Если вам нужен какой-то причудливый пользовательский интерфейс, который визуализируется с помощью металла, вероятно, есть лучшие альтернативы, или вы можете просто отображать свои метки, кнопки и т. д. Внутри UIView поверх вашего металлического вида.
Ваш текст должен быть в 3D-мире или он накладывается сверху в 2D?
В этом случае просто прозрачный вид пользовательского интерфейса поверх вашего металлического вида должен отлично работать!
Большое спасибо. Одна последняя вещь. Могу ли я использовать рендеринг шрифтов Apple, чтобы записать строку в текстуру, чтобы отобразить ее через Metal? Это должно быть проще, чем использование UILabel. Я думаю, что Valve делает что-то подобное с GDI+ здесь: github.com/lua9520/source-engine-2018-hl2_src/blob/master/vgui2/…
Да, вы можете писать в текстуру, см. начало моего ответа об использовании буфера пикселей cv и сопоставлении его с текстурой.
@jixtra Мне удалось заставить это работать с UILabel через drawViewHierarchyInRect
, но я бы не хотел создавать UILabel только для рендеринга строки. Могу ли я использовать его с [NSString drawAtPoint]
?
Спасибо. Текст должен быть поверх 2D.