正确的缓冲区大小

时间:2017-12-12 04:35:06

标签: swift metal

我尝试使用Metal 2设置实例渲染系统。一切正常,但似乎还有问题。我渲染~1,000个实例,每个实例都需要一些数据,这些数据以统一的形式存储。制服在CPU方面看起来像这样:

struct InstanceUniform {
    var position: float2
    var layer: Int
}

我需要每个实例一个。当我为我的实例制服创建缓冲区时,我这样做:

buffer = device.makeBuffer(length: MemoryLayout<InstanceUniform>.stride * instanceCount, options: [])

它似乎应该为我的实例分配足够的内存。然而,总会有&#34;溢出&#34;从一次抽奖调用我的下一次数据。我有两个绘制调用:第一个是渲染实例,第二个是普通调用,没有实例化。我的第一次抽奖有两个缓冲区,第二次抽奖只有一个缓冲区。但是,当我调试Metal时,第二个绘图调用显示它有第二个缓冲附件,它与第一个调用的第二个缓冲区大小相同,并且它填充了随机内存值。

另外,我应该提一下,将为实例统一缓冲区指定的长度修改为原始值除以4之类的东西不会导致任何问题,因此我猜测这个问题与大小有关缓冲区。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

  

我的第一次抽奖有两个缓冲区,第二次抽奖只有一个缓冲区。

缓冲区并非特定于绘制调用。它们在渲染命令编码器中设置。如果将缓冲区设置到渲染命令编码器的表中,它们将保留在那里,直到您清除它们或用不同的缓冲区替换它们。即使激活第二次绘制调用的着色器不使用它们,它们仍将被分配用于任何后续绘制调用。 (当然,如果你完成一个编码器并创建一个新编码器,那么新编码器将以空缓冲表开始。)

对于缓冲区的大小,结构的layer属性类型为Int,这是一种64位整数类型。 Metal不处理64位整数类型。因此,应用程序代码中的缓冲区布局与着色器之间不可避免地存在不匹配。您应该使用Swift端的Int32来对应Metal中的int

相关问题