3

レンダー ターゲットを DirectX 11 のコンピュート シェーダーの入力として使用したいと考えています。コンピュート シェーダーでレンダー ターゲットを読み取る必要があるだけで、私の場合、コンピュート シェーダーの出力をレンダリングする必要はありません (ただし、後でこれを CPU で消費するため、追加のコンピュート シェーダー パスで処理する必要がある場合があります)。

これが可能であるというコメントを見たことがありますが、レンダー ターゲット (Texture2D) を Shader Resource View の Compute Shader Buffer として使用する方法を示すサンプル コードが見つからないようです。いくつかのオプションを試しましたが、コンピューター シェーダーが入力として必要とするシェーダー リソース ビューを作成できませんでした。

サンプル コードの断片へのポインタをいただければ幸いです。

4

2 に答える 2

2

コンピューティング シェーダーを介して読み取り可能にするには、実際にリソースにシェーダー リソース使用モードが必要です。

次に、通常どおり Shader Resource View を作成するだけです。

計算シェーダーによってバッファーを直接書き込み可能にすることもできます (一部の範囲で)。その場合、フラグは D3D11_BIND_UNORDERED_ACCESS または DXGI_USAGE_UNORDERED_ACCESS です (これは、マルチサンプル テクスチャでは機能しないことに注意してください)。

以下は、UV 座標からテクスチャからサンプルを読み取る非常に単純な計算シェーダーです。

RWStructuredBuffer<float4> rwbuffer;

//Render target previously rendered
Texture2D tex;

//Buffer containing uvs for sampling
 StructuredBuffer<float2> uv <string uiname="UV Buffer";>;

 SamplerState mySampler : IMMUTABLE
 {
     Filter = MIN_MAG_MIP_LINEAR;
     AddressU = Clamp;
     AddressV = Clamp;
 };

 [numthreads(1, 1, 1)]
 void CS( uint3 i : SV_DispatchThreadID)
 { 
//Read color and write to buffer
rwbuffer[i.x] = tex.SampleLevel(mySampler,uv[i.x],0);
 }

 technique11 Process
 {
pass P0
{
    SetComputeShader( CompileShader( cs_5_0, CS() ) );
}
 }

それが役立つことを願っています。

于 2013-09-16T12:13:17.273 に答える
0

テクスチャからシェーダ リソース ビューを作成するための最初の要件は、適切なフラグを使用してテクスチャを作成することです。フラグはD3D11_BIND_SHADER_RESOURCEです。CreateTexture2D を呼び出す前に、記述バインディング メンバーで設定する必要があります。

レンダー ターゲットがユーザーによって作成されたものではなく、スワップ チェーンから作成されたものである場合、それを SRV としてバインドすることはできません。中間フレーム バッファが必要になり、それをフレームの最後でバック バッファにコピーします。

于 2013-09-15T08:31:18.243 に答える