DirectX 实时纹理

本文关键字:纹理 实时 DirectX | 更新日期: 2023-09-27 18:33:40

我正在使用C#与托管的Direct3D一起创建一个正方形。这个正方形的纹理是我的桌面(屏幕截图)。我使用 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);
}

DirectX 实时纹理

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

出于好奇,屏幕数据的类型是什么?

通过地图/取消映射更新纹理内容应该快得多。

我将在这里描述它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