Metalで行列

metal-matrix.png

行行列をシェーダに渡す方法

bufferで渡すのが主流のようだ
シェーダの引数でこうする

constant float4x4& mvp_matrix [[ buffer(1) ]]

これでもあり
.metal Objective-C
// vertex shader function
vertex ColorInOut lighting_vertex(device vertex_t* vertex_array [[ buffer(0) ]],
                                  //行列を含んだ自作構造体。
                                  constant AAPL::constants_t& constants [[ buffer(1) ]],
                                  unsigned int vid [[ vertex_id ]])
{
    ColorInOut out;
 
    float4 in_position = float4(float3(vertex_array[vid].position), 1.0);
    //自作構造体のメンバはMetalでそのまま参照可能
    out.position = constants.modelview_projection_matrix * in_position;

自分でconstants_tという構造体を作る

namespace AAPL
{
    typedef struct
    {
        simd::float4x4 modelview_projection_matrix;
        simd::float4x4 normal_matrix;
        simd::float4   ambient_color;
        simd::float4   diffuse_color;
        int            multiplier;
    } constants_t;
}
constants_t *constant_buffer

サポートサイト Wikidot.com