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

È stato utile?

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.

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