繁体   English   中英

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

[英]MSL - How to specify uniform array parameters in Metal shader?

我正在尝试将统一数组传递给金属着色器,例如:

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

我收到错误:

"NSLocalizedDescription" : "Compilation failed: \n\nprogram_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 types\nprogram_source:2:1961:

我知道“缓冲区”属性只能应用于指针和引用。 在那种情况下,在 MSL 中传递统一 arrays 的正确方法是什么?

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

Arrays 的引用在 C++ 中是不允许的,MSL 也不支持它们作为扩展。

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

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

如有必要,您可以将数组的大小作为另一个缓冲区参数传递,或者您可以确保您的着色器 function 不会读取比缓冲区中存在的元素更多的元素。

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

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

您还可以使用:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM