1

HLSL と Direct3D 11 を使用していくつかの GPGPU 計算を試みています。私の目標は、複数の画像を順番に計算し (画像ごとに 1 つのレンダリング)、それらを合計することです。

これを実現するために、3 つのテクスチャを作成しました。1 つは入力用で、2 つは結果を要約するためのものです。私が試みている方法: 最初に texture2 にレンダリングし (texture および texture3 テクスチャを入力として使用)、次に、わずかに変更されたピクセル シェーダーを使用して texture3 にレンダリングします (texture および texture2 テクスチャを入力として使用します)。この後、テクスチャを PNG ファイルにダンプします。私の問題は、どういうわけか、2 番目のピクセル シェーダーが最初のシェーダー (texture2) の結果を取得せず、元の空のテクスチャを取得することです。使用法 D3D11_USAGE_DEFAULT と D3D11_BIND_RENDER_TARGET | を使用して、texture、texture2、および texture3 の両方を定義しました。D3D11_BIND_SHADER_RESOURCE バインディング フラグ。

私の HLSL シェーダー (shader1):

float4 main(PS_INPUT input) : SV_TARGET
{
...
float4 val5 = 0.25F * (val + val2 + val3 + val4) + tex3.Sample(sam, input.Tex4);
return val5;
}

もう 1 つのシェーダー (shader2):

float4 main(PS_INPUT input) : SV_TARGET
{
...
float4 val5 = 0.25F * (val + val2 + val3 + val4) + tex2.Sample(sam, input.Tex4);
return val5;
}

レンダリングとテクスチャのダンプを実行するコード:

context->OMSetRenderTargets(1, &targetViewTexture2, NULL);

float z = 280.0F;
GenMatrix(z);
context->VSSetShader(vs, NULL, 0);
context->PSSetShader(ps, NULL, 0);
context->PSSetSamplers(0, 1, &state);
context->VSSetConstantBuffers(0, 1, &cbuf);
context->Draw(6, 0);
swapChain->Present(0, 0);

context->OMSetRenderTargets(1, &targetViewTexture3, NULL);
z = 0.0F;
GenMatrix(z);
context->VSSetShader(vs, NULL, 0);
context->PSSetShader(ps2, NULL, 0);
context->PSSetSamplers(0, 1, &state);
context->VSSetConstantBuffers(0, 1, &cbuf);
context->Draw(6, 0);
swapChain->Present(0, 0);
DirectX::ScratchImage im;
DirectX::CaptureTexture(device, context, texture3, im);
const DirectX::Image *realImage = im.GetImage(0, 0, 0);
HRESULT hr2 = DirectX::SaveToWICFile(*realImage, DirectX::WIC_FLAGS_NONE, GUID_ContainerFormatPng, L"output_tex3.png", NULL);
DirectX::CaptureTexture(device, context, texture2, im);
realImage = im.GetImage(0, 0, 0);
hr2 = DirectX::SaveToWICFile(*realImage, DirectX::WIC_FLAGS_NONE, GUID_ContainerFormatPng, L"output_tex2.png", NULL);

最初のパス (ps) の出力は正しいですが、2 番目のパスは正しくありません。シェーダー コードのみを残す場合:

    float4 val5 = tex2.Sample(sam, input.Tex4);

空の画像が表示されます。何か不足していますか?2 番目のピクセル シェーダーでテクスチャを使用するには、いくつかのメソッドを呼び出す必要がありますか? 大規模なコード ベースの関連セクションを特定したと思いますが、さらに情報が必要な場合は、コメント セクションで質問してください。

4

1 に答える 1