1

我正在尝试将此代码添加到我的 Metal 语言文件中:

constant float3x3 rgb2xyz(
                      float3(0.412453f, 0.212671f, 0.019334f),
                      float3(0.357580f, 0.715160f, 0.119193f),
                      float3(0.180423f, 0.072169f, 0.950227f)
                      );

或这个

constant float3x3 rgb2xyz = float3x3(
                      float3(0.412453f, 0.212671f, 0.019334f),
                      float3(0.357580f, 0.715160f, 0.119193f),
                      float3(0.180423f, 0.072169f, 0.950227f)
                      );

金属编译器给了我以下错误:

No matching constructor for initialization of 'const constant float3x3' (aka 'const constant matrix<float, 3, 3>')

但是,如果我这样做

typedef struct {
    float3x3 matrix;
    float3 offset;
    float zoom;
} Conversion;

constant Conversion colorConversion = {
    .matrix = float3x3(
        float3 ( 1.164f,  1.164f, 1.164f ),
        float3 ( 0.000f, -0.392f, 2.017f ),
        float3 ( 1.596f, -0.813f, 0.000f )
    ),
    .offset = float3 ( -(16.0f/255.0f), -0.5f, -0.5f )
};

我没有得到任何编译错误。

任何想法出了什么问题?它也适用于矢量类型而没有问题:

constant float3 bgr2xyzCol1(0.357580f, 0.715160f, 0.119193f);

直接在代码中定义常量矩阵的好方法是什么?

4

1 回答 1

0

您应该将其作为常量引用传递,请参阅 WWDC 会话 604。

例如看matrices这里,TransformMatrices在这种情况下是自定义数据结构

vertex VertexOutput my_vertex(const global float3* position_data [[ buffer(0) ]], const global
 float3* normal_data [[ buffer(1) ]], constant TransformMatrices& matrices [[ buffer(2) ]], uint vid [[ vertex_id ]])
{
VertexOutput out;
    
float3 n_d = normal_data[vid];
    
float3 transformed_normal = matrices.normal_matrix * n_d;

float4 p_d = float4(position_data[vid], 1.0f);
     out.position = * p_d;
float4 eye_vector = * p_d;
    
...
    
return out;
    
}
于 2015-03-05T06:34:29.117 回答