我将统一缓冲区传递给顶点着色器和片段着色器。
let uniformBuffer = device.makeBuffer(length: 4096, options: [])
renderEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1)
renderEncoder.setFragmentBuffer(uniformBuffer,offset:0, at: 1)
这是否会将uniformBuffer从CPU复制到GPU两次?然后我会将缓冲区从顶点着色器传递到片段着色器,这发生在 GPU 内部。
没有专门涉及的副本setVertexBuffer()
or setFragmentBuffer()
。那些只放了一个参考到渲染编码器的缓冲区表中的缓冲区。
您的代码和 Metal 只需确保缓冲区的内容在 GPU 上是最新的,并从那里引用它。正如 Matthjis 提到的,如何做到这一点取决于storageMode
。如果您使用托管模式,如果您修改 CPU 上的缓冲区内容,则需要使用以下命令告诉 MetaldidModifyRange()
。一旦你这样做了,Metal 就会知道在下次需要时将修改后的范围复制到 GPU。无论编码器缓冲区表引用缓冲区多少次,该单个副本就足够了。
注意setVertexBytes()
and setFragmentBytes()
工作方式不同。每次调用它们时,它们都必须(并且确实)立即复制传入的字节数组。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)