0

Metal shading language spec の例に基づく:

Example:
struct Foo {
    float4 a [[color(0)]];
    int4 b [[color(1)]];
};

kernel void
my_kernel(imageblock<Foo, imageblock_layout_implicit> img_blk,
 ushort2 lid [[thread_index_in_threadgroup]] …) 
{
…
    Foo f = img_blk.read(lid); float4 r = f.a;
…
    f.a = r;
…
    img_blk.write(f, lid);
}

イメージブロック エイリアス カラー アタッチメントのメンバーとして、"imgblk.write(...)" の後にイメージブロックが対応するカラー アタッチメントに書き込まれると思います。

Apple の例でこれを実験しました: Forward-plus with tile shading、imageblock.write(..) を使用してタイル シェーダーのカラー アタッチメントに書き込もうとしましたが、非常に奇妙な結果が得られました。

  1. 背景のピクセルのみが変更されますが、結果は設定したものよりも暗すぎます。たとえば、color=float4(1,0,0,1) を設定しますが、画面では float4(0.057, 0, 0, 1) です。
  2. 他の部分の色は、以前のフラグメントシェーダーパスでイメージブロックに書き込まれたかどうか/何が書き込まれたかによって奇妙に異なります。イメージブロックの値を定数に設定したと考えてください。

とにかく、imageblock.write() がタイル シェーダーで正しく動作しないように感じます。またはそれを正しく使用する方法は?

4

1 に答える 1