2011-08-09 16 views
0

私が実装しようとしているPixelShaderについて、そして私が現在行っていること(これはデバッグのためのものであり、物事を理解しようとしています):GPUメモリの表示/デバッグのためのTexture2Dメモリスペースの表示

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であることを確認しました。

私は完全には理解していないいくつかあります:

  • 私はすべてのフレームで地図/ memcpyを/マップ解除ルーチンを実行した場合、ドライバは最終的にクラッシュします、システムが応答しなくなります。完了する必要があるフレームごとに完全なテクスチャを更新する別の方法はありますか?
  • 私がアップロードしたテクスチャは8bitですが、Texture2D.load()はなぜ浮動小数点数を返しますか?テクスチャデータにアクセスするために別の方法を使用する必要がありますか?私はそれをサンプルしようとしましたが、それはどちらもうまくいかなかったのです。代わりにintバッファなどを使用する必要がありますか?
  • ここに、memcpyが最初に動作したかどうかを確認するために、GPUメモリをデバッグする方法がありますか?

答えて

0
  • 地図は、memcpyを、アンマップは本当にあなたがテクスチャに大量のデータをコピーしようとしているunless2クラッシュべきではありません。 "GetDataSize()"が返すものを知ることは面白いでしょう。それは307,200と等しいですか?もしそれ以上のものがあれば、あなたの問題があります。あなたが求めてきたものthatsのため

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

  • あなたはDirectXがPIXを使用して起こっていただきましデバッグすることができます。その素晴らしいツールと私は非常にあなたがそれを熟知することをお勧めします。

関連する問題