0

実装しようとしているPixelShaderと、現在行っていることについて質問があります(これは、デバッグと理解を目的としたものです)。

    int3 loc;
    loc.x = (int)(In.TextureUV.x * resolution_XY.x);
    loc.y = (int)(In.TextureUV.x * resolution_XY.x);
    loc.z = 0;

    float4 r = g_txDiffuse.Load(loc);
    return float4(r.x, r.y, r.z, 1);

ポイントは、これは常に0,0,0,1です

テクスチャバッファが作成されます:

D3D11_TEXTURE2D_DESC tDesc;
tDesc.Height = 480;
tDesc.Width = 640;
tDesc.Usage = D3D11_USAGE_DYNAMIC;
tDesc.MipLevels = 1;
tDesc.ArraySize = 1;
tDesc.SampleDesc.Count = 1;
tDesc.SampleDesc.Quality = 0;
tDesc.Format = DXGI_FORMAT_R8_UINT;
tDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
tDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
tDesc.MiscFlags = 0;

V_RETURN(pd3dDevice->CreateTexture2D(&tDesc, NULL, &g_pCurrentImage));

テクスチャ(最後にライブディスプレイになるはずです)を次の方法でアップロードします。

    D3D11_MAPPED_SUBRESOURCE resource;
    pd3dImmediateContext->Map(g_pCurrentImage, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);
    memcpy( resource.pData, g_Images.GetData(), g_Images.GetDataSize() );
    pd3dImmediateContext->Unmap( g_pCurrentImage, 0 );

resource.pDataを確認しました。そこにあるデータは、有効な8ビットのモノクロ画像です。カメラからのデータが8ビットモノクロ640x480であることを確認しました。

私が完全に理解していないことがいくつかあります。

  • すべてのフレームでMap/memcpy / Unmapルーチンを実行すると、ドライバーが最終的にクラッシュし、システムが応答しなくなります。フレームごとに完全なテクスチャを更新する別の方法はありますか?
  • アップロードしたテクスチャは8ビットですが、Texture2D.load()がfloat4を返すのはなぜですか?テクスチャデータにアクセスするには、別の方法を使用する必要がありますか?私はそれを.sampleしようとしましたが、それもうまくいきませんでした。代わりにintバッファなどを使用する必要がありますか?
  • GPUメモリをデバッグして、memcpyが最初に機能したかどうかを確認する方法はありますか?
4

1 に答える 1

1
  • Map、memcpy、Unmapは、テクスチャに大量のデータをコピーしようとしている場合を除いて、実際にはクラッシュしないはずです。「GetDataSize()」が何を返すかを知ることは興味深いでしょう。それは307,200に等しいですか?それ以上の場合は、問題があります。

  • Texture2Dはfloat4を返します。これは、それがあなたが求めているものだからです。float r = g_txDiffuse.Load(...)と書くと。8ビットは、ロードプロセスの一部として正規化されたフロートに拡張されます。ところで、「loc」の計算が正しいことを確認してください。これで、loc.xとloc.yは常に同じになります。

  • PIXを使用してDirectXで何が起こっているかをデバッグできます。それは素晴らしいツールであり、私はあなたがそれに精通することを強くお勧めします。

于 2011-08-15T12:35:35.540 に答える