Я был на этом пути раньше. Я думаю, что вам может пригодиться 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, безусловно, также полезна, но она может вам и не понадобиться специально для этой проблемы. Я пытался быть кратким в своих объяснениях, так как я не знаю, какова ваша точная цель с этой проблемой, но я могу предоставить более подробную информацию о любом из этих методов по запросу.