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 に答える