MSL-如何在金属着色器中指定统一数组参数



我正试图将一个统一数组传递到金属着色器中,例如:

fragment vec4 fragment_func(constant float4& colors[3] [[buffer(0)]], ...) {...}

我得到错误:

"NSLocalizedDescription" : "Compilation failed: nnprogram_source:2:1917: error: 'colors' declared as array of references of type 'const constant float4 &'nprogram_source:2:1923: 
error: 'buffer' attribute cannot be applied to typesnprogram_source:2:1961:

我知道"buffer"属性只能应用于指针和引用。在这种情况下,在MSL中以统一数组传递的正确方式是什么?

编辑:MSL规范指出缓冲区属性支持"缓冲区类型数组"。我一定是在做语法错误的事情?

C++中不允许使用引用数组,MSL也不支持将它们作为扩展。

但是,您可以将指针指向数组中包含的类型:

fragment vec4 fragment_func(constant float4 *colors [[buffer(0)]], ...) {...}

如果需要,可以将数组的大小作为另一个缓冲区参数传递,也可以确保着色器函数读取的元素不会超过缓冲区中的元素。

访问元素就像普通的取消引用一样简单:

float4 color0 = *colors;   // or, more likely:
float4 color2 = colors[2];

您也可以使用:

fragment vec4 fragment_func(constant float4 colors [[buffer(0)]][3], ...) {...}

这是C++中属性语法工作方式的一个不幸的副作用。这样做的好处是它更直接地保留了colors上的类型。

相关内容

  • 没有找到相关文章

最新更新