1

私は独学で C++AMP を学ぼうとしており、私の分野の非常に単純なタスク、つまり画像処理から始めたいと考えています。24 ビット/ピクセルの RGB イメージ (ビットマップ) を 8 ビット/ピクセルのグレースケール イメージに変換したいと考えています。画像データはunsigned char配列で利用できます(Bitmap::LockBits(...)などから取得)

C++AMP は何らかの理由でorを介してcharorunsigned charデータを処理できないことを知っているので、そのブログに従って sを使用しようとしました。ここでは、8bpp テクスチャがどのように書き込まれるかが説明されていますが、VisualStudio 2013 では廃止されたことが示されています。arrayarray_viewtexturewriteonly_texture_view

私のコードは、「カーネルのディスパッチに失敗しました」というランタイム例外をスローします。例外の完全なテキストは長いです。

ID3D11DeviceContext::Dispatch: Compute Shader ユニットのスロット 0 の Unordered Access View (UAV) の形式は (R8_UINT) です。この形式は、UAV としてのシェーダーからの読み取りをサポートしていません。シェーダーが実際にビューを使用する場合、この不一致は無効です (たとえば、シェーダー コードの分岐が原因でスキップされないなど)。残念ながら、すべてのハードウェア実装でこのフォーマットを UAV として読み取ることをサポートすることはできませんでしたが、このフォーマットは UAV として書き込むことができます。シェーダーがこのリソースに対して読み取りのみを実行し、書き込みを実行する必要がない場合は、UAV の代わりにシェーダー リソース ビューを使用することを検討してください。

これまでに使用したコードは次のとおりです。

namespace gpu = concurrency;

gpu::extent<3> inputExtent(height, width, 3);
gpu::graphics::texture<unsigned int, 3> inputTexture(inputExtent, eight);
gpu::graphics::copy((void*)inputData24bpp, dataLength, inputTexture);
gpu::graphics::texture_view<unsigned int, 3> inputTexView(inputTexture);
gpu::graphics::texture<unsigned int, 2> outputTexture(width, height, eight);
gpu::graphics::writeonly_texture_view<unsigned int, 2> outputTexView(outputTexture);

gpu::parallel_for_each(outputTexture.extent,
    [inputTexView, outputTexView](gpu::index<2> pix) restrict(amp) {
    gpu::index<3> indR(pix[0], pix[1], 0);
    gpu::index<3> indG(pix[0], pix[1], 1);
    gpu::index<3> indB(pix[0], pix[1], 2);
    unsigned int sum = inputTexView[indR] + inputTexView[indG] + inputTexView[indB];
    outputTexView.set(pix, sum / 3);
});

gpu::graphics::copy(outputTexture, outputData8bpp);

この例外の理由は何ですか? また、回避策として何ができますか?

4

1 に答える 1