2

正方形を作成するために、マネージドDirect3DでC#を使用しています。この正方形のテクスチャは私のデスクトップ(スクリーンキャプチャ)です。Direct3Dを使用してスクリーンショットを撮り(70ミリ秒かかります)、次にテクスチャを作り直して正方形に表示します(1000ミリ秒かかります)。

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);
}
4

2 に答える 2

0

Map/Unmap を介してテクスチャ コンテンツを更新すると、はるかに高速になります。

ここでは C++ について説明しますが、C# でも非常に似ているはずです。

CPU にアクセスできるような方法でテクスチャを作成する必要があります。

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

その後Map、デバイス コンテキストの関数を使用して、テクスチャにアクセスできます。

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;

次のステップでは、データ ポインタを使用してテクスチャ コンテンツを変更できます。終わったら電話Unmap

于 2013-06-28T09:48:58.913 に答える
0

あなたのコードは問題ありません。ミップマップは必要ですか?デフォルトの形式を使用している場合、Dx はミップマップを生成します。これにより、テクスチャの生成時間が長くなり、GPU にプッシュする時間が長くなります。これは、サイズがはるかに大きくなるためです。

好奇心から、screenData の型は何ですか?

于 2013-06-27T00:21:47.803 に答える