将 float3[] 从 GLSL 转换为 Metal

Converting float3[] from GLSL to Metal

如何转换:

const float3 GDFVectors[19] = float3[](
                                   normalize(float3(1, 0, 0)),
                                   normalize(float3(0, 1, 0)),
                                   normalize(float3(0, 0, 1)),

                                   normalize(float3(1, 1, 1 )),
                                   normalize(float3(-1, 1, 1)),
                                   normalize(float3(1, -1, 1)),
                                   normalize(float3(1, 1, -1)),

                                   normalize(float3(0, 1, PHI+1)),
                                   normalize(float3(0, -1, PHI+1)),
                                   normalize(float3(PHI+1, 0, 1)),
                                   normalize(float3(-PHI-1, 0, 1)),
                                   normalize(float3(1, PHI+1, 0)),
                                   normalize(float3(-1, PHI+1, 0)),

                                   normalize(float3(0, PHI, 1)),
                                   normalize(float3(0, -PHI, 1)),
                                   normalize(float3(1, 0, PHI)),
                                   normalize(float3(-1, 0, PHI)),
                                   normalize(float3(PHI, 1, 0)),
                                   normalize(float3(-PHI, 1, 0))
                                   );

Metal(或 C++)?使用上面的代码我得到了一些错误:

Global variable must have a constant address space qualifier.

在 Metal 中,除了将数组限定为 const 之外,还需要将数组限定为位于 constant 地址 space 中。我会这样写:

constant const float3 GDFVectors[] = {
    normalize(float3(1, 0, 0)),
    // ...
    normalize(float3(-PHI, 1, 0))
};