2012-05-08 21 views
2

管理対象のDirect3DでC#を使用して正方形を作成しています。この四角形のテクスチャは私のデスクトップ(スクリーンキャプチャ)です。 Direct3Dを使用してスクリーンショットを撮り(70ミリ秒かかる)、テクスチャをリメイクして正方形に表示します(1000ミリ秒かかる)。DirectXリアルタイムテクスチャ

リアルタイムで表示するためにDirect3Dで瞬時にテクスチャを作成するにはどうすればよいですか? ベローは、現在どのように使用するテクスチャを作成していますか?

using (Bitmap bmp = new Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) 
{ 
    bitmapData = bmp.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); 
    Marshal.Copy(screenData, 0, bitmapData.Scan0, screenData.Length); 
    bmp.UnlockBits(bitmapData); 

    texture = Texture.FromBitmap(d3dDevice, bmp, 0, Pool.SystemMemory); 
} 
+0

達成しようとしていることは本当に明確ではありません。あなたの主な目標は、デスクトップ画面をキャプチャし、それをいくつかの3Dメッシュ/ポリゴンにラッピングしますか? – real4x

答えて

0

コードは問題ありません。ミップマップが必要ですか?デフォルトのフォーマットを使用している場合、Dxはミップマップを生成します。これにより、テクスチャの生成時間とGPUにプッシュする時間が大幅に増えます。

screenDataの種類は何ですか?

0

ビアマップ/テクスチャの更新のマップをはるかに速くする必要があります。

あなたは、そのようなことはCPUアクセス可能であるような方法であなたのテクスチャを作成する必要があります:

d3dTextureDescription.Usage   = D3D11_USAGE_DYNAMIC; 
d3dTextureDescription.BindFlags = D3D11_BIND_SHADER_RESOURCE; 
d3dTextureDescription.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 

その後あなたがすることができ、私はC++のためにここでそれを説明しますが、それはC#で非常に類似しているはず

データポインタは、テクスチャを変更するために使用することができ、次のステップでは

D3D11_MAPPED_SUBRESOURCE MappedResource; 
HRESULT hr = rendererD3D->getImmediateContextD3D()->Map(
     m_pTexture2D, 
     mipMapLevel, //0, 
     D3D11_MAP_WRITE_DISCARD, 
     0, 
     &MappedResource); 

ASSERTEx(hr == S_OK, "Map failed."); 

*data = MappedResource.pData; 

:テクスチャへのアクセスを得るためにあなたのデバイスコンテキストのMap機能を使用しますコンテンツ。完了している場合Unmap