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(..) を使用してタイル シェーダーのカラー アタッチメントに書き込もうとしましたが、非常に奇妙な結果が得られました。
- 背景のピクセルのみが変更されますが、結果は設定したものよりも暗すぎます。たとえば、color=float4(1,0,0,1) を設定しますが、画面では float4(0.057, 0, 0, 1) です。
- 他の部分の色は、以前のフラグメントシェーダーパスでイメージブロックに書き込まれたかどうか/何が書き込まれたかによって奇妙に異なります。イメージブロックの値を定数に設定したと考えてください。
とにかく、imageblock.write() がタイル シェーダーで正しく動作しないように感じます。またはそれを正しく使用する方法は?