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);
}
你的代码很好。你需要一个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