我可以从Metal着色器获取缓冲区的大小吗?

Hal*_*rim 4 ios metal

在我用Swift编写的iOS应用中,我生成了一个Metal缓冲区,其中包含:

vertexBuffer = device.newBufferWithBytes(vertices, length: vertices.count * sizeofValue(vertices[0]), options: nil)
Run Code Online (Sandbox Code Playgroud)

并将其绑定到我的着色器程序:

renderCommandEncoder.setVertexBuffer(vertexBuffer, offset: 0, atIndex: 1)
Run Code Online (Sandbox Code Playgroud)

在用Metal着色语言编写的着色器程序中,可以访问缓冲区的大小吗?我想访问缓冲区中的下一个顶点以进行一些差分计算。就像是:

vertex float4 my_vertex(const device packed_float3* vertices [[buffer(1)]],
                         unsigned int vid[[vertex_id]]) {
    float4 vertex = vertices[vid];
    // Need to clamp this to not go beyond buffer, 
    // but how do I know the max value of vid? 
    float4 nextVertex = vertices[vid + 1]; 
    float4 tangent = nextVertex - vertex;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我唯一的选择是将顶点数量统一传递吗?

Nat*_*Hat 6

据我所知,不可以,因为顶点指向一个地址。就像C ++一样,必须有两件事才能知道数组的数量或大小:
1)知道数组的数据类型(浮点数或某些结构)
,以及
2a)数据类型的数组数或
2b)总字节数数组。

因此,是的,您需要将数组计数统一传递。