2010-06-06 115 views
0

我需要渲染一個簡單的紋理映射模型作爲directshow源過濾器的輸出。 3D渲染不需要來自Direct3D,但那會很好。假設我可以將它放入DirectShow源過濾器的上下文中,OpenGL或任何其他提供者都可以。如何在directshow源過濾器中渲染3d圖形

Visual Studio 2008的C++

+0

可能重複的示例代碼2985319/how-to-render-direct3d-in-a-directshow-source-filter)和[如何結束在攝像頭飼料生活頂部放置3d圖形](http://stackoverflow.com/questions/2981497/how-to-overlay-3d-graphics-on-top-of-webcam-feed-live) – 2010-06-06 18:58:06

+0

Kirill,這篇文章是相似的,但它不是重複的。問題是更一般的 – 2010-06-06 18:59:52

+0

我認爲最好的想法是編輯你還沒有接受答案的另一個問題。 – 2010-06-06 19:02:27

回答

0

隨着Direct3D的我發現,您可以從D3D設備調用GetRenderTargetData讓你接觸到的原始圖像的字節,然後可以複製到源過濾圖像緩衝區

下面是如何獲得D3D渲染的[如何渲染的-Direct3D的IN-A-DirectShow的源濾波器(http://stackoverflow.com/questions/

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