【问题标题】:How to draw text in iOS swift using Metal Framework如何使用 Metal Framework 在 iOS Swift 中绘制文本
【发布时间】:2020-01-30 15:05:08
【问题描述】:

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

func draw(in view: MTKView) {

    // 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()


}

【问题讨论】:

    标签: swift text gpu metalkit


    【解决方案1】:

    周围有许多库,其中大部分使用直接来自字体的信息来生成线条、Bezier 曲线和其他“程序性”而不是具象性的图元(后者就像位图),然后对它们进行镶嵌用于使用 Metal 基元进行演示。

    Warren Moore 有一篇 2018 年的文章(带有代码)描述了使用 libtess 的这种方法,这是一个已建立的 tessilation 库。我没有使用过这个版本,但使用过 Moore 发布的早期代码,并取得了一些成功。您可以在以下位置找到它:https://metalbyexample.com/text-3d/

    这篇文章描述了 3D 文本渲染(非常有艺术气息的东西),但也有指向其他描述更简单 2D 解决方案的网站的链接。

    Warren 在 GitHub 上发布了一个较旧的 2D Objective-C 解决方案:https://github.com/metal-by-example/sample-code/tree/master/objc/07-Mipmapping/Mipmapping

    这不是为了娇气,但考虑到相关的代码,我认为你应该能够取得进展。

    使用 Metal Kit 导入您已在其中写入一些文本的 Core Graphics 纹理,虽然结果有点粗糙,但可能会让您觉得不那么令人生畏。见:https://developer.apple.com/documentation/metalkit/mtktextureloader

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多