2017-04-12 5 views
0

MTLBufferの位置にアクセスするためのインデックスとして浮動小数点変数を使用しようとしていますが、unsigned intにキャストする必要があります。まあ、それは私の最初の考えです。インデックスとして使用するキャスト変数(メタルシェーディング言語)

これは実際には機能していないようですが、なぜそれほど理解できません。私はデータの量を削減しようとしている

vertex VertexOut basic_vertex(const device float3 *vertex_array [[ buffer(0) ]], 
           const device float3 *color_array [[ buffer(1) ]], 
(...)) 
{ 

    // get the current vertex 
    float3 position = vertex_array[vid]; 
    // get the color index 
    uint color_index = as_type<uint>(position.z); 
    // get the color 
    float3 color = color_array[color_index]; 

    VertexOut vertexOut; 
    vertexOut.position = proj_Matrix * mv_Matrix * float4(position.x, position.y, 0, 1); 
    vertexOut.color = float4(color, 1); 
    return vertexOut; 
} 

インデックスに色バッファをZ座標を使用して、代わりに同じ色を繰り返すことによって、GPUに送信する:

は、私は基本的に何かのように持っています大量の頂点の場合この方法では、6つの浮動小数点数(x、y、z、r、g、b)を渡す代わりに、3つの色を渡すだけです。

color_index変数を使用して色を取得しているときのエラーはありません。私は、例えば、色にアクセスしようとすると、問題がある:

vertexOut.color = float4(color, 1); 

私はこのエラーを取得することを行う場合は、次の

Execution of the command buffer was aborted due to an error during execution. Caused GPU Hang Error (IOAF code 3) 

を私がしようとしている何のための周りのすべての作業があります達成する? ここで何が間違っていますか?

は、事前に

+0

'as_type'は機能的にはC++の' reinterpret_cast'と同等です。ソース値のビットを文字列として扱いますが、この文脈では間違っています。代わりに、おそらく代わりに「床」のようなものがあります。まったくキャストされません。つまり、インデックスを浮動小数点で初期化できます。浮動小数点の変換は暗黙的に行われます。色にアクセスしていないときにこのエラーが発生しないという事実は、おそらく結果の値が使用されていないときに配列アクセスがデッドコードを取り除いていることを示しています。 – warrenm

+0

@warrenmありがとう、これは問題を解決しました。私はちょうど型キャストを削除し、代わりに '床'を使用しなければなりませんでした。 'as_type'が' reinterpret_cast'に相当するということは私には起こりませんでした。 – mvcs

+0

お手伝いします。私はあなたがそれを受け入れる場合は答えとして自分のコメントを投稿しました。 – warrenm

答えて

1

as_typeをありがとうC++のreinterpret_castと機能的に同等である:彼らはこの文脈では間違っていて種類、あたかもそれは文字通りソース値のビットを扱います。代わりにfloorのようなもの、または全くキャストされていない(すなわち、floatでインデックスを初期化でき、floatからuintの(高価な)変換が暗黙的に行われます)。色にアクセスしていないときにこのエラーが発生しないという事実は、おそらく結果の値が使用されていないときに配列アクセスがデッドコードを取り除いていることを示しています。

関連する問題