从iOS 12.1.1 Metal着色器看来,引用形式为(float4)(1,2,3,4)的向量会以静默方式解析为其他内容-想想(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;
您的示例虽然在语法上有效,但不会产生预期的结果,因为该语法并不表示您认为的那样。