シェーダからstoreするとUnordered Access View?

いまだによくわかってないけど、なんとなくCompute Shaderからテクスチャにwriteしたら、Unordered Access View(UAV)経由でstoreになってる気がしてきた。

こんなコードをコンパイルすると

Texture3D		InputBuffer;
RWTexture3D	OutputBuffer;

[numthreads(16, 4, 1)]
void CS(uint3 id : SV_DispatchThreadID)
{
	OutputBuffer[id] = InputBuffer[id];
}

こんな感じに

cs_5_0
dcl_globalFlags refactoringAllowed
dcl_resource_texture3d (float,float,float,float) t0
dcl_uav_typed_texture3d (float,float,float,float) u0
dcl_input vThreadID.xyz
dcl_temps 1
dcl_thread_group 16, 4, 1
mov r0.xyz, vThreadID.xyzx
mov r0.w, l(0)
ld_indexable(texture3d)(float,float,float,float) r0.xyzw, r0.xyzw, t0.xyzw
store_uav_typed u0.xyzw, vThreadID.xyzz, r0.xyzw
ret

入力側はt0レジスタが使われていて、ちゃんとテクスチャアクセスっぽいけど出力側はu0レジスタになっていてしかも思いっきり"uav"とか書いてあるし。
今まで普通にSRVとして出力用テクスチャを渡してきたのは、まったく無駄だったということに…orz(特に出力データを確認してなかったので気にもしてなかったけど)
てか、u0レジスタ初期化しない状態でシェーダはどう動いていたんだ(^^;


でも、これでなんとなく納得がいった気がする。Pixel Shaderとかは出力先としてRender Targetとかを指定できるけど、Compute Shaderの場合はそういうのが無い(?)からUAVが出力になるって感じなのかも。t#レジスタレジスタread専用なのかもしれない。(Compute ShaderはStream-Outputには出せないよね?)


しかし、この辺りの事情は相変わらずDirectXヘルプを見てもわからない。サンプルを見てもその辺の法則を独力で見つけるのは厳しい気がするなぁ。なんで誰でも読むような場所に説明が書いてないんだろ。どこか探しまくれば載ってるんだろうか。