[英]DirectX real time textures
我正在使用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的時間,因為它將更大。
出於好奇,screenData是什么類型?
通過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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.