2010-06-06 15 views
0

J'ai besoin de rendre un modèle mappé de texture simple comme sortie d'un filtre de source DirectShow. Le rendu 3D n'a pas besoin de venir de Direct3D, mais ce serait bien. OpenGL ou tout autre fournisseur serait bien en supposant que je peux l'intégrer dans le contexte du filtre source DirectShow.Comment rendre des graphiques 3d dans un filtre de source DirectShow

visual studio 2008 C++

+0

possible en double de [comment-rendre-Direct3D-in-a-directShow-source-filtre] (http://stackoverflow.com/questions/ 2985319/how-to-render-direct3d-dans-un-directhow-source-filter) et [Comment sur jeter des graphiques 3d sur le dessus de la webcam en direct en direct] (http://stackoverflow.com/questions/2981497/how-to-overlay-3d-graphics-on-top-of-webcam-feed-live) –

+0

Kirill, ce post est similaire mais ce n'est pas un doublon. La question est plus générale –

+0

Je suppose que la bonne idée serait d'éditer votre autre question qui n'a toujours pas de réponse acceptée. –

Répondre

0

Avec Direct3D j'ai trouvé que vous pouvez appeler GetRenderTargetData du dispositif de D3D pour vous permettre d'accéder aux octets d'images brutes que vous pouvez copier dans les filtres de l'image source tampon

Voici un exemple de code de la façon d'obtenir le D3D rendre

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