从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/

10-13 02:37