Текстуры DirectX в реальном времени

Я использую С# для управляемого 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);
}

person John    schedule 08.05.2012    source источник
comment
Не совсем понятно, чего вы пытаетесь достичь. Является ли ваша основная цель захватом экрана рабочего стола, а затем наложением его на какую-либо трехмерную сетку/полигон?   -  person real4x    schedule 10.05.2012


Ответы (2)


Ваш код в порядке. Вам нужна мип-карта? Если вы берете формат по умолчанию, Dx создаст мип-карту, которая увеличит время создания текстуры, а также время ее отправки в графический процессор, так как оно будет намного больше.

Из любопытства, какой тип screenData?

person Justin R.    schedule 27.06.2013

Через Map/Unmap обновление содержимого текстуры должно быть намного быстрее.

Я опишу его здесь для C++, но он должен быть очень похож на C#:

Вы должны создать свою текстуру таким образом, чтобы она была доступна процессору:

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

person Vertexwahn    schedule 28.06.2013