Рендеринг текста в металле - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь разработать свой собственный мини-игровой движок для Apple metal на Mac, и я застрял в том месте, где хочу рендерить текст на GPU. У меня нет большого опыта графического программирования, и, следовательно, я не уверен, как это сделать. Я наткнулся на статью, написанную Уорреном, используя подписанные поля расстояния. Но я не знаю, как это работает, и я не могу понять это полностью (отсутствие моих графических знаний), чтобы реализовать это самостоятельно. В блоге есть пример кода, который написан на obj-c, но, к сожалению, я не знаю obj-c. Есть ли какая-то быстрая версия этого? Или кто-то может объяснить / дать указания о том, как визуализировать текст в металле?

1 Ответ

0 голосов
/ 08 сентября 2018

Я был на этом пути раньше. Я думаю, что вам может пригодиться SceneKit, если вам нужен 3D-текст.

Если вы согласны с использованием SceneKit для управления рендерингом: SCNText с SCNView.

Если у вас есть собственный буфер команд, и вы можете избежать смешивания текста в ТОП остальной части вашей графики: вы все равно можете использовать SCNText, используя render() метод SCNRenderer для рендеринг для кодирования команд рендеринга сцены в буфер команд.

Если вы хотите избежать процесса рендеринга SceneKit, я бы порекомендовал сделать это: создать SCNText в транзакции SCN следующим образом:

    import SceneKit
    SCNTransaction.begin()
    let sceneText = SCNText(string: text, extrusionDepth: extrusionDepth)
    SCNTransaction.commit()
    let mdlMesh = MDLMesh(scnGeometry: sceneText, bufferAllocator: yourBufferAllocator)
    let mesh = try MTKMesh(mesh: mdlMesh, device: MTLCreateSystemDefaultDevice()!)

Этот MTKMesh будет иметь три буфера вершин; первая (0) - это список позиций в формате packed_float3, вторая (1) - список нормалей в формате packed_float3, третья (2) - список координат текстуры в формате packed_float2. Просто убедитесь, что это отражено в вашем вершинном шейдере. Он будет иметь 1-5 подмеш с их собственными индексными буферами, что соответствует передней, задней, передней фаске, задней фаске и экструзионной стороне.

Теперь, если вам нужен 2D-текст, вы можете использовать этот метод выше с extrusionDepth, близким к нулю, или вы можете напрямую использовать CoreText для создания метрик шрифта и рендеринга текстурированных четырехугольников с текстурой атласа шрифта, такой как commenter. предложил.

Способность понимать Objective-C, безусловно, также полезна, но она может вам и не понадобиться специально для этой проблемы. Я пытался быть кратким в своих объяснениях, так как я не знаю, какова ваша точная цель с этой проблемой, но я могу предоставить более подробную информацию о любом из этих методов по запросу.

...