2012-05-08 82 views
2

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

如何在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); 
} 
+0

你不太清楚你想达到什么目的。您的主要目标是捕获桌面屏幕,然后将其包装在某个3D网格/多边形上? – real4x

回答

0

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

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

0

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

我会在这里形容它为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