金属文本渲染

Ara*_*h S 5 metal

我正在尝试在 Mac 上的 Apple metal 中开发我自己的迷你游戏引擎,但我被困在我想在 GPU 上渲染文本的地方。我没有太多的图形编程经验,因此我不知道该怎么做。我偶然发现了 Warren more 使用符号距离场写的一篇文章。但我不知道它是如何工作的,我无法完全理解它(缺乏我的图形知识)来自己实现它。博客文章有一个用 obj-c 编写的代码示例,但不幸的是我不知道 obj-c。它有一些快速版本吗?或者有人可以解释/指出如何在金属中渲染文本?

Den*_*s L 5

我以前一直在这条路上。我认为如果您追求 3D 文本,您可能会发现 SceneKit 很有用。

如果您可以使用 SceneKit 来驱动渲染:SCNText with a SCNView.

如果您有自己的命令缓冲区,并且可以在其余图形的 TOP 上混合文本:您仍然可以使用SCNText, 通过使用render()a SCNRendererto render的方法将场景的渲染命令编码到命令缓冲区。

如果你想避免 SceneKit 的渲染过程,我建议你这样做:在 SCNTransaction 中创建一个 SCNText 像这样:

    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()!)
Run Code Online (Sandbox Code Playgroud)

这个 MTKMesh 将有三个顶点缓冲区;第一个 (0) 是packed_float3格式中的位置列表,第二个 (1)packed_float3格式中的法线列表,第三个 (2)packed_float2格式中的纹理坐标列表。只要确保在你的顶点着色器中反映出来。它将有 1-5 个带有自己索引缓冲区的子网格,我相信对应于前、后、前倒角、后倒角和挤压侧。

现在,如果您要处理 2D 文本,您可以使用上面的这个方法,使挤压深度接近于零,或者您可以CoreText直接利用字体度量并使用评论者建议的字体图集纹理渲染纹理四边形。

理解 Objective-C 的能力当然也很有用,但您可能不需要专门针对这个问题。我试图简要说明我的解释,因为我不知道您对这个问题的确切目标是什么,但我可以根据要求提供有关任何这些方法的更多详细信息。