2009-12-06 8 views
6

Scrivere un gioco e mi piacerebbe alcuni filmati nel mezzo. In modalità finestra, le classi DirectShow funzionano perfettamente e sono facili da usare. Ma quando il gioco è a schermo intero, non riesco a ottenere DirectShow per mostrare un filmato a schermo intero.DirectShow IVideoWindow e Fullscreen - Posso scrivere sulla mia superficie primaria D3D?

Fondamentalmente, quando ho un dispositivo D3D inizializzato, non riesco a visualizzare il video, anche con IVideoWindow.put_Fullscreen (true). Immagino che DirectShow non sia in grado di fare a schermo intero con un dispositivo D3D.

Così, ho provato rilasciando il mio dispositivo D3D durante la riproduzione del cutscene e reinizializzazione di nuovo dopo. Questo sembra funzionare piuttosto bene, ma quando DirectShow viene riprodotto a schermo intero, sembra che rubi lo stato attivo dalla finestra principale della mia app e non lo restituisca quando è finito. Ciò fa sì che DirectInput non riesca ad acquisire nuovamente il dispositivo in seguito (fornendomi un codice di errore "Accesso negato"). Ho provato SetForegroundWindow() prima di acquistarlo, ma ciò non risolve il problema, quindi potrebbe non essere il problema dopo tutto.

Comunque, per farla breve, tutto quello che voglio è un filmato a schermo intero nel bel mezzo della mia D3D app. C'è un modo preferito per realizzare questo? Posso farlo avendo l'output di DirectShow sulla mia superficie primaria D3D? Penso che risolverei i problemi che sto avendo.

risposta

2

Si desidera creare un allocatore personalizzato per Video Mixing Renderer 9. È molto più semplice che creare un proprio filtro di rendering ed è specificamente creato per l'interoperabilità D3D.

C'è un esempio in Windows SDK. Il mio è installato qui:

C: \ Program Files \ Microsoft SDK \ Windows \ v7.0 \ Samples \ multimedia \ DirectShow \ VMR9 \ vmr9allocator

+0

Mi ci è voluto un po ', ma ho trovato l'esempio a cui fai riferimento (era nell'SDK di Windows, ma non nell'SDK di DirectX - che strano). Ne darò un'occhiata stasera e vedrò se riesco a capirlo. Sembra quello che sto cercando. – TrespassersW

+0

DirectShow (nonostante il suo nome) è stato spostato su Windows SDK 5 o 6 anni fa. Mi ha confuso anche quando l'ho scoperto per la prima volta. In ogni caso, i vantaggi dell'utilizzo dell'allentatore VMR9 sono che è possibile ottenere l'accelerazione video hw con determinati formati, conversioni di spazio colore hw accelerate e deinterlacciamento ... per non parlare del rendering su una superficie d3d;) –

+0

Pensavo solo a I ' D tornano e menziono che ho funzionato, grazie al campione che mi hai indicato. Grazie ancora. – TrespassersW

2

guardare il "DumpFilter". Usando questo puoi FACILMENTE scrivere un filtro che scriverà direttamente su una trama D3D. Inoltre, tieni presente che non è necessario supportare l'istanziazione com esterna. Puoi semplicemente istanziare la classe e usarla. Non ha bisogno di essere esposti al di fuori della vostra applicazione ...

Edit: La DumpFilter è uno degli esempi DirectShow API.

+0

non vedo "DumpFilter" ovunque nel mio file DirectShow API . Sto usando DX9. È una cosa DX10, per caso? – TrespassersW

Problemi correlati