0

我们有一个使用 DirectDraw 8 的旧应用程序。它直接逐个像素地写入视频内存,一切都很好。现在我需要将它移植到 Windows 商店应用程序中。

Media Foundation 似乎是渲染视频的推荐路径,并通过了“媒体引擎原生 C++ 视频播放示例(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

4

1 回答 1

0

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);

}
于 2013-10-06T14:43:30.520 回答