如何使用金属框架在iOS swift中绘制文本

如何使用金属框架在iOS swift中绘制文本,swift,text,gpu,metalkit,Swift,Text,Gpu,Metalkit,我正在开发一个实时数据监控应用程序。我已经使用金属框架成功地绘制了波浪,但在绘制简单文本/字符串时遇到了问题。比如如何在MTKView中打印“Hello”。在这里,我使用计时器更新顶点,然后调用draw()执行绘制。只需要GPU渲染 func绘图(视图中:MTKView){ 周围有许多库,其中大多数库直接使用字体中的信息来生成线条、贝塞尔曲线和其他“程序性”而非代表性(后者类似于位图)的基本体,然后使用金属基本体对它们进行细分以进行表示 沃伦·摩尔(Warren Moore)在2018年的一篇文

我正在开发一个实时数据监控应用程序。我已经使用金属框架成功地绘制了波浪,但在绘制简单文本/字符串时遇到了问题。比如如何在MTKView中打印“Hello”。在这里,我使用计时器更新顶点,然后调用draw()执行绘制。只需要GPU渲染

func绘图(视图中:MTKView){


周围有许多库,其中大多数库直接使用字体中的信息来生成线条、贝塞尔曲线和其他“程序性”而非代表性(后者类似于位图)的基本体,然后使用金属基本体对它们进行细分以进行表示

沃伦·摩尔(Warren Moore)在2018年的一篇文章(带代码)中描述了使用libtess(一个已建立的tessilation库)的这种方法。我没有使用过这个版本,但使用了摩尔发布的早期代码,并取得了一些成功。您可以在以下网站找到它:

这篇文章描述了3D文本渲染(真正的艺术化的东西),但也有其他描述更简单2D解决方案的网站链接

Warren在GitHub上发布了一个旧的2D Objective-C解决方案,网址:

这并不是为了那些胆小鬼,但是考虑到相关的代码,我认为你应该能够取得进展

您可能会觉得,使用Metal Kit导入一个核心图形纹理(您已经在其中写入了一些文本)没有那么可怕,尽管结果有点粗糙。请参阅:

    // print("calling")



    //  guard let drawablelayer = metalLayer!.nextDrawable(),
    guard //let mainDrawable = view.currentDrawable,
       // let _pipeLineState = self.pipelineState,
        let discriptor = view.currentRenderPassDescriptor else  {
            return
    }

    let commandBuffer = commandQue.makeCommandBuffer()
    let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: discriptor)

    //commandEncoder?.setRenderPipelineState(_pipeLineState)





    viewPort = MTLViewport.init(originX: 0.0, originY: 0.0, width: 750, height: 1334, znear: 0.0, zfar: 0.0)
    commandEncoder?.setViewport(viewPort!)




    commandEncoder?.setVertexBuffer(layoutBuffer, offset: 0, index: 0)
    commandEncoder?.setRenderPipelineState(noninterleavedRenderPipeline)
    commandEncoder?.drawPrimitives(type: .triangle, vertexStart:0, vertexCount: verticesLayout.count)


    commandEncoder?.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
    commandEncoder?.setRenderPipelineState(interleavedRenderPipeline)
    commandEncoder?.drawPrimitives(type: .line, vertexStart:0, vertexCount: vertices.count)


    commandEncoder?.setVertexBuffer(topBuffer, offset: 0, index: 0)
    commandEncoder?.setRenderPipelineState(topInterleavedRenderPipeline)
    commandEncoder?.drawPrimitives(type: .triangle, vertexStart:0, vertexCount: verticesRect.count)



    commandEncoder?.endEncoding()
   // commandBuffer?.present(mainDrawable)

    if let drawable = view.currentDrawable {
        commandBuffer?.present(drawable)
    }

    commandBuffer?.commit()


}