从iOS 12.1.1 Metal着色器看来,引用形式为(float4)(1,2,3,4)的向量的着色器无声地被解析为其他内容-想想(1,1,1,1)。这适用于所有矢量格式。解决该问题的唯一方法是删除该类型周围的括号。有人会说,这种寄生术从一开始就是很残酷的。但是我们有很多代码正在运行,由于这种切换,突然突然开始进行错误的计算。
我的问题是这是金属错误,还是只是苹果公司成为语法纳粹分子而没有正当理由收紧东西?
最佳答案
首先,这本不应该起作用。
在(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;
您的示例虽然在语法上有效,但不会产生预期的结果,因为该语法并不表示您认为的结果。
关于ios - 苹果在Metal中更改了允许的矢量格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53779139/