Qualcuno può spiegarmi l'illuminazione radiofonica?


8

Ho già le basi dell'occlusione ambientale. Ho un raycaster e sono in grado di sparare uniformemente raggi su un emisfero. Sembra che queste siano le basi di ciò che è necessario per la radiosità, ma non so dove andare da lì. Trovo quanta luce proviene da ogni faccia? (Sto realizzando il mio gioco a cubetti come Minecraft) Dopo di che cosa devo fare?


3
Perché il tag "minecraft"?
Valmond,

Risposte:


9

In effetti, questo è tutto ciò che serve per la radiosità. Esistono due formulazioni diverse (ma uguali). Il primo è quello di "irradiare" o sparare luce da ogni patch (nel tuo caso probabilmente una faccia), e l'altro è di "raccogliere" o ricevere luce in ogni patch. Se lo fai ripetutamente abbastanza volte, otterrai radiosità.

Il primo passo è capire da dove proviene la luce perché in entrambi i metodi ci deve essere una fonte di luce. Se hai intenzione di fare il metodo di raccolta, devo avvertirti che non gestisce molto bene le luci di posizione. Devi seminare le patch con la luce (calcola separatamente) o ottieni risultati strani. Nel metodo di irradiamento emetti dalle luci punti normalmente, ma li ignori come ricevitori da altre patch.

Puoi interrompere dopo qualsiasi numero di rimbalzi (o iterazioni), ma più fai, migliore è la soluzione. Hai un momento facile per la creazione di patch in quanto puoi considerare ogni lato dei tuoi cubi come una patch. Se vuoi qualcosa di più dettagliato, puoi suddividere quelle facce ancora di più.

In un esempio radiante, questo potrebbe essere usato come base per il tuo loop:

while(!done) {
   foreach Patch a {
     a.shootRays(n);
     foreach ray r {
       Patch b = r.firstIntersectingPatch();
       float modifier = 1 / ((distance(a,b)^2)
       b.incidentLight += (a.exidentLight / n) * modifier; 
     } 
   }
  foreach Patch a {
    float modifier = a.absorption;
    a.exidentLight = (a.incidentLight * modifier) + a.emission;
    a.incidentLight = 0;
  }

  done = goodEnough() ? true : false;
}

Per un metodo di raccolta, avresti il ​​primo ciclo leggermente diverso:

      foreach Patch a {
         a.shootRays(n);
         foreach ray r {
           Patch b = r.firstIntersectingPatch();
           float modifier = 1 / ((distance(a,b)^2)
           a.incidentLight += b.exidentLight * modifier; 
         } 
         a.incidentLight /= n;
       }

Il primo modificatore viene utilizzato per la modifica per patch della luce in arrivo. L'uso più comune sarebbe la caduta dalla distanza come ho fatto sopra. Il secondo modificatore è per la modifica globale della luce in entrata come l'assorbimento del materiale. La variabile a.emission sarebbe 0 per la maggior parte delle patch.

Solo quelli che sono sorgenti luminose (o direttamente interessati da sorgenti luminose puntiformi se si utilizza un metodo di raccolta come indicato sopra) devono avere valori di emissione diversi da 0.

La funzione goodEnough () potrebbe essere molte cose. Potrebbe essere solo contando il numero di iterazioni, oppure potrebbe guardare la quantità totale di luce nella scena o potrebbe essere un altro test che escogiti. Questa parte dipende davvero da te e ciò che pensi sembra abbastanza buono ma finisce ancora in un ragionevole lasso di tempo.

Più raggi spari, più precisa è la soluzione ma più lento è il processo. Lo stesso vale per il numero di patch e il numero di iterazioni attraverso il loop. Il modo in cui memorizzi il valore della luce finale dipende da te. Potrebbe essere in una trama o memorizzato come valore nei cubi, ma non credo che sarebbe fattibile in tempo reale con un numero decente di patch.


Ciao Chewy. Funziona davvero? Sono abbastanza sicuro che dovrebbe prendere in considerazione la legge del coseno di Lambert. Ma forse non capisco qualcosa.
Notabene,

1
Può ottenere fisicamente accurato quanto vuoi. Gli angoli tra le patch possono essere presi in considerazione con il primo valore modificatore, insieme a un numero qualsiasi di altri fenomeni. Questo è solo lo schema generale di ciò che accade.
Chewy Gumball,

Ok. Molto bella. Questa è la prima volta che sento parlare della radiosità nella moda del ray casting. Ma ha perfettamente senso. Grazie per questo
Notabene,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.