非法矢量组件名称 "x"(金属)

Illegal vector component name "x" (metal)

使用 Metal,在运行时,当我尝试编译着色器时收到错误

Error: Illegal vector component name 'x'

它在 macos 10.14/10.15 中运行良好,但在 上 macos 10.11 在旧 mac mini 上它是崩溃! 知道为什么吗?

using namespace metal;

struct Vertex {
  packed_float3 position;
};

struct ProjectedVertex {
  float4 position [[position]];
};

vertex ProjectedVertex vertexShader(constant Vertex *vertexArray [[buffer(0)]],
                                    const unsigned int vertexId [[vertex_id]],
                                    constant float4x4 &MVPMatrix [[buffer(1)]]) {
  Vertex in = vertexArray[vertexId];
  ProjectedVertex out;
  out.position = float4(in.position.x, in.position.y, in.position.z, 1) * MVPMatrix;
  return out;
}

在 Metal 2.1 之前,Metal Shading Language 不允许访问打包向量类型的命名组件。

要解决此问题,请通过下标访问此类元素,或创建相应非压缩类型的局部变量:

out.position = float4(in.position[0], in.position[1], in.position[2], 1) * MVPMatrix;

// OR:

float3 position = in.position;
out.position = float4(position.x, position.y, position.z, 1) * MVPMatrix;