簡體   English   中英

DirectX實時紋理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM