苹果在Metal中更改了允许的矢量格式

时间:2018-12-14 11:44:57

标签: ios metal

从iOS 12.1.1 Metal着色器看来,引用形式为(float4)(1,2,3,4)的向量会以静默方式解析为其他内容-想想(1,1、1,1)。这适用于所有矢量格式。解决该问题的唯一方法是删除该类型周围的括号。有人会说,这种寄生术从一开始就太过费力了。但是我们有很多代码在运行,由于这种切换,突然突然开始进行错误的计算。

我的问题是这是金属错误,还是只是苹果公司成为语法纳粹并无缘无故收紧东西?

1 个答案:

答案 0 :(得分:4)

这本来应该从来没有做过。

(float4)(1,2,3,4)中用逗号分隔的括号内的值列表被视为comma operator的应用程序,而不是构造函数的参数列表,因为您也已经在类型上加上了括号。有很多方法可以从1或4个组件初始化float4。这些产生向量{1,2,3,4}:

float4 f = float4(1, 2, 3, 4);
float4 f(1, 2, 3, 4);
float4 f = (float4){ 1, 2, 3, 4 };
float4 f{1, 2, 3, 4};
float4 f = { 1, 2, 3, 4 };

并产生向量{1,1,1,1}:

float4 f = { 1 };
float4 f(1);
float4 f = 1;
float4 f = (float4)1;

您的示例虽然在语法上有效,但不会产生预期的结果,因为该语法并不表示您认为的那样。