Direct3d 9 Modalità di miscela di mappatura ombra
Domanda
Attualmente sto cercando di disegnare ombre su una scena in Direct3d 9. Sto cercando di fare un rendering a più pass e ho difficoltà a capire come usare/impostare la modalità di fusione.
Ho fatto un passaggio di profondità che riempie il buffer di profondità e poi ho un ciclo che si aggira attraverso tutte le luci della scena. All'interno di quel ciclo ho 2 loop che entrambi si aggirano attraverso tutte le forme nella scena
Ho questo tipo di configurazione
for(number of shapes)
{
//render from camera position and fill depth buffer
}
for(number of lights)
{
for(number of shapes)
{
//render to shadow map
}
for(number of shapes)
{
//render to screen
}
}
In FOX posso vedere che attraversa ogni luce, ma quando lo eseguo viene visualizzata solo l'ultima luce nell'array di luce. Penso che abbia a che fare con la modalità di fusione.
Ho esaminato la modalità di fusione e ho trovato informazioni sulla miscela di origine e destinazione. È questo ciò di cui ho bisogno/Qualcuno potrebbe aiutare a spiegarlo per favore?
Grazie in anticipo,
Segno
[MODIFICARE] Ho ottenuto entrambe le luci visibili usando il seguente codice
hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
Le ombre non sembrano corrette ma mi sto avvicinando al risultato desiderato.
Qualsiasi altro consiglio sarebbe fantastico,
Grazie,
Segno
Soluzione
Penso anche che tu abbia un set di stati di miscela Alpha sbagliati. Presumo che tu faccia una miscela SRC e sostitui la tua vecchia immagine con quella nuova e non fai alcuna miscelazione alfa. Devi pensare a quello che vuoi. Presumo che tu voglia una miscelazione SRC_Over.
Il Porter Duff Le regole possono darti un suggerimento e sono molto facili da implementare in DirectX. Per un esempio di esempio qui.
Modificare Dovrei leggere più attentamente.
Gli shader di alfa e pixel sono indipendenti. Quindi puoi ovviamente utilizzare lo shader pixel per modificare il valore del colore della tua fonte. Forse per aggiungere un effetto speciale o quello che vuoi provare. Ma non appena vuoi fondere la tua fonte su una destinazione e non vuoi sostituire tutti i pixel con di nuovi, devi abilitare la miscelazione alfa. Ad esempio così
hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
Questo codice moltiplicherà tutti i pixel di origine con il loro valore alfa e tutti i pixel di destinazione con 1-source_alpha. E combinarli alla nuova destinazione.