Как я могу визуализировать 3D-графику в исходном фильтре DirectShow - PullRequest
0 голосов
/ 06 июня 2010

Мне нужно визуализировать простую модель с текстурным отображением в качестве вывода исходного фильтра DirectShow. 3D-рендеринг не обязательно должен быть из Direct3D, но это было бы неплохо. С OpenGL или любым другим провайдером все будет в порядке, если я смогу вписать его в контекст исходного фильтра DirectShow.

visual studio 2008 c ++

1 Ответ

0 голосов
/ 12 июня 2010

С Direct3D я обнаружил, что вы можете вызывать GetRenderTargetData с устройства d3d, чтобы получить доступ к необработанным байтам изображений, которые затем можно скопировать в буфер изображений исходных фильтров

Вот пример кода, как получить d3d рендер

void CaptureRenderTarget(IDirect3DDevice9* pdev)
{
    IDirect3DSurface9* pTargetSurface=NULL;
    HRESULT hr=pdev->GetRenderTarget(0,&pTargetSurface);
    if(SUCCEEDED(hr))
    {
        D3DSURFACE_DESC desc;
        hr=pTargetSurface->GetDesc(&desc);
        if(SUCCEEDED(hr))
        {
            IDirect3DTexture9* pTempTexture=NULL;
            hr=pdev->CreateTexture(desc.Width,desc.Height,1,0,desc.Format,D3DPOOL_SYSTEMMEM,&pTempTexture,NULL);
            if(SUCCEEDED(hr))
            {
                IDirect3DSurface9* pTempSurface=NULL;
                hr=pTempTexture->GetSurfaceLevel(0,&pTempSurface);
                if(SUCCEEDED(hr))
                {
                    hr=pdev->GetRenderTargetData(pTargetSurface,pTempSurface);
                    if(SUCCEEDED(hr))
                    {
                        //D3DXSaveTextureToFile(L"Output.png",D3DXIFF_PNG,pTempTexture,NULL);
                        D3DLOCKED_RECT data;
                        hr=pTempTexture->LockRect(0, &data, NULL, 0);
                        if(SUCCEEDED(hr))
                        {
                            BYTE *d3dPixels = (BYTE*)data.pBits;                                            
                        }
                        pTempTexture->UnlockRect(0);
                    }
                    pTempSurface->Release();
                }
                pTempTexture->Release();
            }
        }
        pTargetSurface->Release();
    }
}
...