索引金属缓冲区的问题
Issue with indexing Metal buffers
当使用 Metal 设置缓冲区时,您可以通过将某个索引与其相关联来实现,此处为索引 0:
renderCommandEncoder.setVertexBuffer(someBuffer, offset: 0, index: 0)
然后从您的 Metal 着色语言代码中,您可以使用 constant float4x4* projectionMatrix [[ buffer(0) ]]
.
等参数访问这些缓冲区
我遇到的问题是,在某些情况下,库和教程似乎鼓励“自动”设置索引,例如,在加载模型 I/O 网格时,会为您提供一组缓冲区存储网格的数据。
我看到这些缓冲区有时是这样设置的:
for (index, buffer) in mesh.vertexBuffers.enumarated() {
renderCommandEncoder.setVertexBuffer(buffer, offset: 0, index: index)
}
我的问题是,与您预先知道将拥有多少缓冲区的情况相反(比如一个缓冲区用于网格数据(索引 0),一个用于网格世界变换(索引 1),一个对于相机(索引 2)),现在您自己的缓冲区的索引可能会根据您使用模型 I/O.
加载的网格进行偏移
例如,如果模型 I/O 加载一个具有两个缓冲区来表示其数据的网格,您现在必须偏移您自己的缓冲区,但是您的金属着色语言代码无法在编译时知道它。
是否只是模型 I/O 永远不会加载比您预期更多的缓冲区(因为您可以为内存中的顶点指定特定布局?)。我的问题是我正在使用程序网格生成函数(例如生成球体的函数),这些函数无法自定义它,所以我想知道这些函数的内存布局有多稳定。
您可以使用顶点描述符来解决这个问题。一种选择是将所有顶点缓冲区放在较高的缓冲区绑定槽中。有点像这样:
您可以将顶点缓冲区绑定开始计算为 let vertexBufferIndexStart = 31 - bufferLayouts.count
,其中 bufferLayouts
是您模型的顶点缓冲区布局数组。我认为你也可以高于 31,但你必须检查功能表。
然后,只需在 MTLVertexDescriptor
中的每个属性上 MTLVertexAttributeDescriptor
偏移 bufferIndex
。这样,从 0 到最大缓冲区绑定插槽减去顶点缓冲区数的所有缓冲区都将可供您绑定其他缓冲区。
当使用 Metal 设置缓冲区时,您可以通过将某个索引与其相关联来实现,此处为索引 0:
renderCommandEncoder.setVertexBuffer(someBuffer, offset: 0, index: 0)
然后从您的 Metal 着色语言代码中,您可以使用 constant float4x4* projectionMatrix [[ buffer(0) ]]
.
我遇到的问题是,在某些情况下,库和教程似乎鼓励“自动”设置索引,例如,在加载模型 I/O 网格时,会为您提供一组缓冲区存储网格的数据。
我看到这些缓冲区有时是这样设置的:
for (index, buffer) in mesh.vertexBuffers.enumarated() {
renderCommandEncoder.setVertexBuffer(buffer, offset: 0, index: index)
}
我的问题是,与您预先知道将拥有多少缓冲区的情况相反(比如一个缓冲区用于网格数据(索引 0),一个用于网格世界变换(索引 1),一个对于相机(索引 2)),现在您自己的缓冲区的索引可能会根据您使用模型 I/O.
加载的网格进行偏移例如,如果模型 I/O 加载一个具有两个缓冲区来表示其数据的网格,您现在必须偏移您自己的缓冲区,但是您的金属着色语言代码无法在编译时知道它。
是否只是模型 I/O 永远不会加载比您预期更多的缓冲区(因为您可以为内存中的顶点指定特定布局?)。我的问题是我正在使用程序网格生成函数(例如生成球体的函数),这些函数无法自定义它,所以我想知道这些函数的内存布局有多稳定。
您可以使用顶点描述符来解决这个问题。一种选择是将所有顶点缓冲区放在较高的缓冲区绑定槽中。有点像这样:
您可以将顶点缓冲区绑定开始计算为 let vertexBufferIndexStart = 31 - bufferLayouts.count
,其中 bufferLayouts
是您模型的顶点缓冲区布局数组。我认为你也可以高于 31,但你必须检查功能表。
然后,只需在 MTLVertexDescriptor
中的每个属性上 MTLVertexAttributeDescriptor
偏移 bufferIndex
。这样,从 0 到最大缓冲区绑定插槽减去顶点缓冲区数的所有缓冲区都将可供您绑定其他缓冲区。