Domanda

Ho una semplice applicazione in cui devo consentire all'utente di selezionare uno shader (.fx HLSL o file assembly, possibilmente con più passaggi, ma tutti e solo i pixel shader) e visualizzarne l'anteprima.

L'applicazione viene eseguita, viene visualizzato l'elenco di shader e un pulsante avvia " finestra di anteprima. " Da questa finestra di anteprima (che contiene una finestra DirectX), l'utente seleziona un'immagine e lo shader viene eseguito su quell'immagine e visualizzato. È necessario il rendering di un solo fotogramma (non in tempo reale).

Ho impostato una combinazione di shader vertici / pixel che prende un quad e lo rende sullo schermo, strutturato con l'immagine scelta. Funziona perfettamente. Devo quindi eseguire un altro effetto, puramente pixel shader, sull'output del primo effetto e visualizzare l'immagine finale (post-elaborata) sullo schermo. Questo non funziona affatto.

Ho provato negli ultimi giorni a farlo funzionare, ma per nessuna ragione apparente, gli stessi blocchi di codice usati per rendere ogni effetto rendono solo il primo. Posso aggiungere il secondo file shader come secondo passaggio nel primo file shader e funziona perfettamente (anche se sconfigge completamente il mio obiettivo di visualizzare in anteprima gli shader creati dall'utente). Quando provo ad usare un secondo effetto (che carica e compila bene), non fa nulla. Ho preso i risultati del primo shader (con GetRenderTargetData) e li ho inseriti in un ampli & Di trama; superficie (destTex e destSur), quindi imposta quella trama come input per il secondo passaggio (usando dev - > SetTexture e l'effetto successivo - > SetTexture (" thisframe " , destTex)).

Tutte le chiamate hanno successo, la compilazione degli effetti, il caricamento delle trame, i quad sono disegnati, ma l'effetto non è visibile. Inizialmente sospettavo che il dispositivo (creato con l'elaborazione del vertice del software) causasse il problema, ma questo non sembra essere il caso (ho provato con hardware e misto). Inoltre, utilizzando entrambi i dispositivi HAL e REF (non è un problema, poiché l'app non è comunque in tempo reale), quel secondo shader non è visibile. Tutto è scritto in C ++ per Direct3D 9.

È stato utile?

Soluzione

Prova a cancellare il buffer dello stencil di profondità ogni volta che esegui il rendering del quad.

Altri suggerimenti

Prima crea una trama, quindi esegui il rendering del primo shader direttamente in quella trama. Rendi infine il secondo shader con la trama come input per il Backbuffer.

Ci deve essere un qualche tipo di input di vertici e di elaborazione dei vertici (a funzione fissa o shader) affinché il pixel shader possa essere eseguito. Stai fornendo lo shader di vertice e, in tal caso, sei sicuro che faccia ciò che si aspetta lo shader di pixel? Che aspetto ha la tua call draw?

Probabilmente vale la pena guardare una traccia PIX della tua app per vedere quale sia lo stato del dispositivo quando si tenta di utilizzare l'effetto utente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top