Apple Metal:如何在内核着色器中使用数组(而不是纹理)?

问题描述 投票:0回答:1

我无法将 [Int32] 数组放入我的内核着色器中。

使用桥接标头,我可以得到一个结构数组,例如

typedef struct {
   int ar[100];
} MyArray;

kernel void myShader(device MyArray *in [[buffer(0)]],
                     device MyArray *out [[buffer(1)]],
                     uint threadIndex [[thread_position_in_grid]])

然后使用 threadIndex 进行索引,我可以更改该数组并将其返回给 CPU,但是……

…Swift 看到的不是一个数组,而是:一个元组!

事实上,情况比这更糟。为了初始化我的输入,我还必须提供一个元组。 100 个元素!

由于我想使用大型数组,所以这是没有希望的。我不知道如何从数组构建一个元组,而初始化一个巨大元组的想法是……好吧,你可以想象。

相反,我尝试放弃桥接头并使用 Swift 结构并在着色器中将其重新定义为

struct MyArray {
   var ar:[Int32]
}

typedef struct {
   int ar[100];
} MyArray;

着色器不会抱怨,但如果我尝试更改数组中的索引,Swift 代码就会崩溃。比如说

out[threadIndex] = in[threadIndex];            // copy array

有效,但是

int index = 99-threadIndex;
out[index] = in[threadIndex];      // reverse array
crashes.

任何人都可以解释这一点或解释如何处理元组问题吗?

tuples metal
1个回答
0
投票

只需使用;

金属:

kernel void myShader(device const int *in [[buffer(0)]],
                     device int *out [[buffer(1)]],
                     uint threadIndex [[thread_position_in_grid]])

斯威夫特:

var ar_in:[Int32]
var ar_our:[Int32]
© www.soinside.com 2019 - 2024. All rights reserved.