【发布时间】:2022-01-13 09:14:51
【问题描述】:
我正在学习使用 swift 和 metal kit 开发应用程序
我想将一个 int 类型的数组转换为 Metalbuffer,因为我必须在 Shader.h 中覆盖该数组数据
在操作shader.h之前,数组的值没有问题。 但是,在shader.h中和之后,从数组转换而来的缓冲区存在一些问题。
例如,我将 [1, 2, 3, 4] 发送到 Metalbuffer,然后调用 renderEncoder.setVertexBuffer(Metalbuffer)。
然后,在 Shader.h 中,它看起来像 [1, 0, 2, 0]
有什么问题???
这是我的示例代码
var int_array = Array(reapeating: 1, count: 100)
init(){
Buffers = MetalBuffer<Int>(device: device, array: int_array, index: kBuffers.rawValue, options: [])
}
func updateIntArray(){
for i in 0..<100 {
int_array[i] = i % 20
}
Buffers = MetalBuffer<Int>(device: device, array: int_array, index: kBuffers.rawValue, options: [])
(other codes about rendering)
renderEncoder.setVertexBuffer(Buffers)
}
视图控制器每帧都会调用updateIntArray。
我在着色器调用后打印了 sizeof(Buffers[i]),它是 4!
如何在不插入0的情况下保留数据?
谢谢!
【问题讨论】:
-
Metal模块中没有MetalBuffer。您需要向我们展示这个问题的更多来源才能有意义,因为如果没有至少采用该金属缓冲区的MetalBuffer和renderEncoder.setVertexBuffer扩展的来源,它就没有任何意义。 -
我们还需要看一下kBuffers的代码。
-
哦,
MetalBuffer是一个实用结构,现在我将其替换为MTLBuffer。此外,redderEncoder被初始化为commandBuffer.makeRenderCommandEncoder(descriptor: )并且,kBuffers 之前被设置为ShaderTypes.h中的某个整数!感谢您的关注,我能够解决它。谢谢!
标签: arrays swift integer metal metalkit