2013-07-01 15 views
5

Mi piacerebbe avere il rendering directcomposition su una texture. È possibile?DirectComposition render to texture?

La ragione di ciò è che Mi piacerebbe essere in grado di rendere un controllo activex del flash player trasparente senza finestra accelerato gpu a una trama. Qualcosa che di solito non è possibile, ma che spero di ottenere con DirectComposition.

+0

[Da MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/hh437351 (v = vs.85) .aspx) "DirectComposition non disegna bitmap, ma manipola solo bitmap che sono già disegnati. " Questo causa un problema? Per quanto ne so, si compone solo direttamente a un HWND. –

+0

Posso creare un HWND da una SwapChain e quindi utilizzare il framebuffer? – ronag

+0

Qualcosa vale la pena provare, ma il fatto che sia possibile solo creare un obiettivo HWND sembra implicare che questo sia incorporato nel SO in modo abbastanza profondo. Onestamente non lo so * ma sospetto fortemente * che una soluzione, se possibile, sia nel migliore dei modi un po 'incisiva. –

risposta

3

E 'improbabile che questo è possibile, per citare MSDN (sottolineatura mia)

DirectComposition non offre alcun servizio di rasterizzazione. Un'applicazione deve utilizzare un'altra libreria di rasterizzazione basata su software o hardware-accelerata come Direct2D o Direct3D per popolare le bitmap che devono essere composte. Dopo la composizione, DirectComposition passa il contenuto bitmap composto a Desktop Window Manager (DWM) per il rendering sullo schermo.

Per quanto ne so non ci sono solo le API ufficiali per condividere le tue superfici fuori schermo con DWM, ma nessuna API che consente di ottenere l'accesso in lettura ad una superficie DWM.

Cosa DWM fa consentono sta riorientando le superfici hwnd, in modo da poter visualizzare superfici di altre HWNDs sulla vostra finestra. Questa operazione può essere eseguita tramite DirectComposition (tramite CreateSurfaceFromHwnd) o DWM API (tramite DwmRegisterThumbnail). Per un esempio di quest'ultimo look here.

Se si vuole andare la "via hacking" come indicato nel tuo commento, ci sono undocumented APIs che sembrano poter dare accesso alle superfici DWM, in particolare DwmpDxGetWindowSharedSurface sembra promettente. Someone else ha già eseguito alcune operazioni di reverse engineering e ha individuato la firma, ma non è riuscita a farlo funzionare (la texture funziona ma rende il nero). This guy sembra aver avuto più fortuna ed è stato in grado di rendere le trame delle finestre in 3d. Non capisco la sua lingua ma sembra che tu debba usare DwmpDxUpdateWindowSharedSurface (anche non documentato).

Si deve essere consapevoli tuttavia che l'utilizzo di funzioni non documentate non è una buona idea, Microsoft può cambiarle in qualsiasi momento (anche nelle versioni di service pack) o rimuoverle completamente, poiché sono utilizzate solo da Microsoft stesse non hanno motivo di mantenere Compatibilità. Inoltre, ci sono buone probabilità che tu le usi male (ad esempio potresti perdere la sincronizzazione necessaria e causare arresti anomali casuali o peggio).

Tuttavia, poiché la funzionalità è effettivamente disponibile, è probabile che Microsoft possa effettivamente aprirlo per l'utilizzo in alcune future versioni di Windows.