2

我正在使用 C# 和托管 Direct3D 来创建一个正方形。这个正方形的纹理是我的桌面(屏幕截图)。我使用 Direct3D 截取屏幕截图(需要 70 毫秒),然后我重新制作纹理以显示在正方形上(需要 1000 毫秒)。

如何在 Direct3D 中立即创建纹理以获得实时视图?Bellow 是我目前创建要使用的纹理的方式。

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

你的代码很好。你需要一个mipmap吗?如果您采用默认格式,Dx 将生成一个 mipmap,这将增加生成纹理的时间以及将其推送到 GPU 的时间,因为它会更大。

出于好奇,screenData 的类型是什么?

于 2013-06-27T00:21:47.803 回答
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 回答