У нас есть старое приложение, использующее DirectDraw 8. Оно записывает пиксель за пикселем напрямую в видеопамять, и все в порядке.
Теперь мне нужно перенести его в приложение Windows Store.
Media Foundation, по-видимому, является рекомендуемым путем для рендеринга видео и прошел через «образец воспроизведения видео на C ++ для Windows Media Engine (Windows 8.1)», но даже Media Foundation использует DirectDraw для рендеринга видео.
ComPtr<ID3D11Texture2D> backBuffer;
DX11SwapChain->GetBuffer(0, IID_PPV_ARGS(&backBuffer));
m_spMediaEngine->TransferVideoFrame(backBuffer.Get(), nullptr, &m_rcTarget, &m_bkgColor);
DX11SwapChain->Present(1, 0);
Так что прошел образцы Direct3D и смог получить backBuffer. Но все образцы, кажется, имеют дело с рисованием линий и т. Д.
и ни один на настройке отдельных пикселей.
Как мне взять в руки пиксели? т.е. установить BackBuffer [somepixel] = someRGBA
UpdateSubresource работал нормально для меня. Я мог получить около 60 FPS, что было неплохо.
// get a pointer directly to the back buffer
swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), &Backbuffer);
// Width and Height
swapchain->GetDesc1(&scd);
Width = scd.Width;
Height = scd.Height;
TextureData = new UINT32[Width * Height];void CMyClass::Render()
{
UINT n, i;
UINT *psrc;
psrc = TextureData;
i = ScreenColourI & 255;
ScreenColourI += 1;
for (n=0; n<Width*Height; n++)
{
*psrc++ = (i<<16) | (i<<8) | i ;
i++;
i &= 255;
}
myID3D11DeviceContext->UpdateSubresource (Backbuffer.Get(), 0, NULL, TextureData, Width*4, 0);
// switch the back buffer and the front buffer
swapchain->Present(1, 0);
}
Других решений пока нет …