【问题标题】:Repitition of texture on pan gesture in Metal Shading Language金属着色语言中平移手势的纹理重复
【发布时间】:2018-11-10 09:16:52
【问题描述】:

我是金属着色语言的新手。所以您的友好指导会很有帮助。 我只是使用金属重复纹理,如下图所示 (Image sequence). 但它似乎并不平滑。如何使它看起来像金属点的以下链接中所做的那样平滑线。(overlapping Metal Point primitives and blending

目前我所做的是在手势的每个触摸点为顶点缓冲区 (MTLBuffer) 分配内存。

代码:

func allocateMemoryForVetexBuffer(vertices: Array<Vertex>){
        var vertexData = Array<Float>()
        for vertex in vertices{
            vertexData += vertex.floatBuffer()
        }

        let dataSize = vertexData.count * MemoryLayout.size(ofValue: vertexData[0])
        print("dataSize:\(dataSize)")
        vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize, options: [])

        vertexCount = vertices.count

    }

我在平移手势识别器中调用此方法。但它会导致 FPS 下降。所以我的问题是不知道在金属层上的单个平移上会添加多少纹理,我如何为帧缓冲区分配内存。

【问题讨论】:

  • 您可能无法在每次收到触摸事件时都从 CPU 端更新缓冲区,但您可以分配一个足够大的缓冲区来容纳,例如 64四边形,然后在填充时将其长度加倍,仅绘制实际填充的缓冲区部分。
  • 坦克warrenm。它有帮助。我只是分配内存并将新到达的数据复制到其中。但是当添加更多和更多纹理时,FPS 会下降。 FPS 下降的原因可能是什么?
  • 量化:你画了多少点/四边形,你达到了什么 FPS?
  • FPS:60 & 一个纹理(图像)包含 6 个顶点。当触摸移动时,它会在每个触摸点绘制纹理。这意味着我的绘图中可能有数千个点。
  • 我已添加工作项目供您参考。 github.com/kasunSithiraPalihakkara/metal-example

标签: swift textures metal metalkit


【解决方案1】:

您不必要地使用实例化。

改变这个:

renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: vertexCount, 
                             instanceCount: vertexCount / 3)

到这里:

renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: vertexCount)

【讨论】:

  • 谢谢warrenm。有用。但在某些时候它显示一个错误。 “由于执行过程中的错误,命令缓冲区的执行被中止。被忽略(导致先前/过多的 GPU 错误)(IOAF 代码 4)”。那么这可能是什么原因呢?
  • 我也看到了。我认为一旦您传递了一定数量的顶点,您就会导致 GPU 读取缓冲区边界之外的内容。但我没有对此进行彻底调查。
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 2016-06-29
  • 2018-09-24
  • 1970-01-01
  • 2023-02-08
  • 2011-09-22
  • 2020-06-17
  • 1970-01-01
相关资源
最近更新 更多