我正在尝试在Mac上用Apple Metal开发我自己的迷你游戏引擎,并且被困在我想在GPU上渲染文本的地方。我没有太多的图形编程经验,因此我不确定该怎么做。我偶然发现了沃伦(Warren)撰写的更多使用有符号距离场的文章。但是我不知道它是如何工作的,我无法完全理解它(缺乏我的图形知识)以自己实现它。博客文章中有一个用obj-c编写的代码示例,但不幸的是我不知道obj-c。有一些快速版本吗?还是有人可以解释/提供有关如何在金属中渲染文本的指针?
答案 0 :(得分:2)
我以前一直走这条路。我想如果您追求3D文字,可能会发现SceneKit有用。
如果可以使用SceneKit驱动渲染,可以使用:SCNText和SCNView
。
如果您有自己的命令缓冲区,并且可以避免在其余图形的顶部混合文本:您仍然可以使用SCNText
,方法是使用render()
SCNRenderer
进行渲染,以将场景的渲染命令编码到命令缓冲区中。
如果要避免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()!)
此MTKMesh将具有三个顶点缓冲区;第一个(0)是packed_float3
格式的位置列表,第二(1)个是packed_float3
格式的法线列表,第三(2)个是{{1 }}格式。只要确保在您的顶点着色器中反映出来即可。它将具有1-5个带有自己的索引缓冲区的子网格,我相信它们对应于正面,背面,正面倒角,背面倒角和挤压面。
现在,如果您使用的是2D文本,则可以使用上面的方法,将挤压深度接近零,或者可以直接利用packed_float2
来执行字体指标,并使用诸如字体图集的纹理渲染纹理四边形评论者建议。
理解Objective-C的能力当然也很有用,但是您可能不需要专门解决此问题。由于我不知道您对该问题的确切目标是什么,因此我尝试简要介绍一下自己的解释,但是我可以根据要求提供有关任何这些方法的更多详细信息。