La componente di attenuazione lineare nei modelli di illuminazione ha una controparte fisica?


18

In OpenGL (e altri sistemi) il fattore di attenuazione della distanza per le luci puntiformi è qualcosa di simile 1/(c+kd+sd^2), dov'è dla distanza dalla luce e c, ke ssono costanti.

Comprendo il sd^2componente che modella l'attenuazione della "legge quadrata inversa" fisicamente ben nota attesa nella realtà.

Immagino che la costante c, di solito una, sia lì per gestire valori molto piccoli di d(e forse dividere per zero la difesa?).

Quale ruolo ha il kdcomponente lineare nel modello (per impostazione predefinita kè zero in OpenGL). Quando useresti altri valori per k? So che questo è chiamato componente "attenuazione lineare", ma quale comportamento simula nel modello di illuminazione? Non sembra apparire in nessun modello fisico di luce di cui io sia a conoscenza.

[MODIFICARE]

David Gouveia ha sottolineato che il fattore lineare potrebbe essere usato per rendere la scena "più vicina" a ciò che lo sviluppatore / artista intendeva o per controllare meglio la velocità con cui la luce cade. In tal caso la mia domanda diventa "il fattore di attenuazione lineare ha una controparte fisica o è solo usato come fattore di sfumatura per aiutare a controllare la qualità della luce nella scena?"


Non ho detto che l'attenuazione lineare rende una scena migliore o più realistica. Quello che ho detto è che potrebbe apparire migliore per i tuoi scopi. Il mio raytracer illuminava una scena molto piccola e, confrontando entrambi i modelli, il lineare appariva migliore. Non ho bisogno di un motivo fisico per dire che sembrava migliore - sembrava solo più vicino all'effetto che volevo ottenere. Al contrario, non è che la legge del quadrato inverso non sembrasse realistica, è semplicemente caduta troppo rapidamente e ha contribuito meno all'illuminazione della scena rispetto a ciò di cui avevo bisogno.
David Gouveia,

Scusa David, non intendevo travisare la tua risposta. Ho modificato la mia modifica sopra.
Ken,

1
Sempre bello ricordare che tutta l'illuminazione è un trucco, puro e semplice =)
Patrick Hughes,

Risposte:


21

La luce, proveniente da fonti puntiformi, cade con il quadrato della distanza. Questa è la realtà fisica.

L'attenuazione lineare è spesso dichiarata superiore. Questo è vero solo quando si lavora in uno spazio cromatico non lineare . Cioè, se non hai attiva la correzione gamma corretta. Il motivo è abbastanza semplice.

Se stai scrivendo valori RGB lineari su un display non lineare senza correzione gamma, i tuoi valori lineari saranno alterati dalla rampa gamma integrata nel monitor. Ciò oscura efficacemente la scena rispetto a ciò che realmente intendevi.

Supponendo una gamma di 2,2, il monitor innalzerà efficacemente tutti i colori alla potenza di 2,2 quando li visualizza.

Questo è attenuazione lineare: 1/kd. Questo è attenuazione lineare con rampa di gamma del monitor applicata: 1/(kd)^2.2. Questo è abbastanza vicino a una corretta relazione al quadrato inverso.

Ma l'inverso reale al quadrato: 1/sd^2diventa: 1/((s^2)(d^4.4)). Questo fa diminuire l'attenuazione della luce in modo molto più netto del previsto.

In generale, se stai usando la corretta correzione gamma (come il rendering su un framebuffer sRGB), non dovresti usare l'attenuazione lineare. Non sembrerà giusto. A tutti . E se non stai usando la correzione gamma ... cosa c'è che non va in te;)

In ogni caso, se stai cercando di imitare la realtà, vuoi il quadrato inverso (e la gamma corretta). In caso contrario, puoi fare tutto il necessario per la tua scena.


4
+1 Conosco il rendering con gamma gamma da un po 'di tempo. Conosco l'attenuazione quadratica e lineare da un po '. E questo è il momento in cui realizzo per la prima volta la connessione tra i due. :-)
David Gouveia,

Qualche motivo per -1?
Nicol Bolas,

9

Flessibilità .

Perché potresti voler far cadere le luci in modo lineare. È lì per darti quel grado di controllo. Non ha davvero bisogno di essere fisicamente accurati (e nemmeno le equazioni di illuminazione di phong shading non sono fisicamente accurate).

A volte il modello quadratico emette luce troppo velocemente vicino alla fonte e lascia "riflessi bianchi" sulle superfici vicine. Fornendo coefficienti lineari e costanti, hai la flessibilità di adattare i risultati a tuo piacimento

Ad esempio, quando ho implementato un raytracer, ho scoperto che la legge del quadrato inverso ha fatto cadere le luci del punto troppo rapidamente. Sono passato a un modello lineare bloccato (dove ogni luce aveva un raggio minimo e massimo, con interpolazione lineare in mezzo) e sembrava solo migliore.

Modifica: ho appena trovato una bella risorsa che spiega questo .


6

Ok, ci proverò.

Osservazione preliminare

In OpenGL (e altri sistemi) il fattore di attenuazione della distanza per le luci puntiformi è qualcosa di simile 1/(c+kd+sd^2), dov'è dla distanza dalla luce e c, ke ssono costanti.

Comprendo il sd^2componente che modella l'attenuazione della "legge quadrata inversa" fisicamente ben nota attesa nella realtà.

La curva per c+kd+sd^2è una parabola, così come la curva per sd^2; la differenza non è così importante come può sembrare: si comportano in modo simile all'infinito, è solo per piccoli valori che sono diversi. Qualunque cosa ksignifichi, è significativa solo vicino alla luce.

Semplificazione preliminare

Poiché questo è un fattore di attenuazione che potresti anche impostare s == 1, o dividere ciascuna costante snell'espressione e dividere il potere della tua sorgente luminosa s. C'è un parametro in eccesso nella formula.

Si finisce con:

1/(c/s+(k/s)d+d^2)

Cambio di variabili

... che è strettamente equivalente a:

1/(A + D^2)

con A == c/s - k^2/(4s^2)e, cosa più importante, D == d + k/2s.

Questo 1/(A+D^2)Sembra veramente il solito 1/(c+d^2), non è vero?

Conclusione

Il kfattore avanza o ritarda l'attenuazione della luce in modo che inizi solo in un raggio di-k/2s (sì, potrebbe anche avere un raggio "negativo", pensa a una luce di punto immaginaria all'interno di uno specchio sferico immaginario che farebbe uscire la luce solo la seconda volta) . Sembra che la matematica vinca di nuovo!

Modifica: Per un secondo ho pensato che fosse equivalente a una luce sferica, ma non lo è. In particolare, non genererà ombre morbide.

Utilità?

La mia ipotesi è che questo parametro possa essere utilizzato da un artista per far apparire una luce come se fosse più vicina (o più lontana) all'oggetto in termini di illuminazione, ma senza spostarla. Poiché le luci puntiformi generano ombre dure, potrebbe essere necessario che la luce rimanga in una posizione specifica.


3

Il coefficiente di attenuazione lineare è la controparte fisica della luce che viaggia in un mezzo. Senza attenuazione, la luce sembra viaggiare nel vuoto perfetto. Durante il rendering di scene "realistiche", si desidera che l'aria attenui l'intensità della luce sulla distanza e questa attenuazione è lineare.


Non penso che possa essere vero. Luce che viaggia attraverso un mezzo verrebbe attenuato dal 1/dnella Rcoordinate, e ancora da 1/d^2nelle thetae phisferiche coordinate. Ciò che descrivi è quindi 1/d^3un'attenuazione dell'intensità della luce.
Sam Hocevar,

3

Il fattore di attenuazione lineare è lì per i casi in cui si potrebbe desiderare di utilizzare attenuazione lineare per l'illuminazione, ma la cosa fondamentale è - non dovete usarlo (o uno qualsiasi degli altri fattori attenuazioni, del resto).

Ciò ti consente di adattare la tua illuminazione ai tuoi gusti personali. Quindi basta impostare qualsiasi fattore di attenuazione che non si desidera 0 e quelli che si desidera non-0 e il gioco è fatto.

Un esempio specifico in cui potresti voler usare l'attenuazione lineare sarebbe se il quadrato inverso più matematicamente corretto fornisce una caduta troppo veloce. Usando linear puoi ottenere un risultato che può sembrare più o meno abbastanza buono (e con meno luci nella scena); quindi dovresti usare 0 costante, 1 lineare e 0 esponenziale.

È interessante notare (ma certamente non rilevante per questa discussione) che gli sprite di punti sia in OpenGL che in D3D (e parametri di punto in OpenGL) usano la stessa formula di attenuazione.

Vale anche la pena notare che l'illuminazione OpenGL / D3D non è strettamente intesa come fisicamente corretta; non è mai stato progettato per essere qualcosa di più di un'approssimazione accettabile, e questo dovrebbe essere tenuto presente quando si interroga qualcosa relativo al modo in cui funziona.

Ovviamente, al giorno d'oggi molto probabilmente userete uno shader, quindi la vecchia formula leggera è principalmente di interesse accademico / storico: potete scrivere qualunque formula leggera desideriate.


1
  • c è il valore di attenuazione costante per la sorgente luminosa.
  • lè l'attenuazione lineare. Ecco perché viene moltiplicato per il distante dalla sorgente luminosa.
  • s è l'attenuazione quadratica, quindi viene moltiplicata per il quadrato della distanza.

Ci sono altre informazioni in questo link .


Grazie, ma la mia domanda è qual è il ruolo della componente di attenuazione lineare nella modellazione della luce. Lo chiedo perché non appare in nessun modello fisico di luce di cui sono a conoscenza. Il collegamento fornito NON spiega a cosa serve la componente di attenuazione lineare. Dice solo; "questa è attenuazione lineare", senza altre spiegazioni.
Ken,

Ok, ho frainteso la tua domanda. L'attenuazione lineare sarebbe meglio osservabile in una sorgente luminosa unidimensionale infinita (pensate a un tubo fluorescente), mentre i modelli quadratici modellano il comportamento di una sorgente luminosa sferica. Finora ho trovato solo un posto dove c'è una spiegazione della corrispondenza tra il modello di luce fisica e quello usato nella computer grafica: imdoingitwrong.wordpress.com/2011/01/31/light-attenuation
r2d2rigo

1

Potrebbe derivare dal fatto che Z, nelle parole dello stimato Eric Lengyel ,

non è lineare perché la rasterizzazione corretta in prospettiva richiede interpolazione lineare di 1 / z - l'interpolazione lineare di z stessa non produce i risultati corretti. L'hardware deve calcolare 1 / z su ciascun vertice e interpolarlo su un triangolo, quindi è conveniente scrivere quel valore nel buffer di profondità invece di eseguire una divisione costosa su ogni pixel per recuperare z.

Il fatto di ottenere una maggiore precisione z più vicino al piano vicino è solo un effetto collaterale e non ha nulla a che fare con la motivazione dietro l'interpolazione 1 / z.

Il buffer di profondità memorizza le distanze. La luce usa la distanza per l'attenuazione. Potrebbe essere la relazione tra il buffer di profondità e le implementazioni di illuminazione a renderlo necessario, sebbene ciò si applicherebbe solo se l'algoritmo di illuminazione funzionasse nello spazio dello schermo, suppongo. Ricorda che è sempre meglio memorizzare un inverso precalcolato (o calcolato dall'hardware), piuttosto che dover eseguire la divisione sul valore indiviso per ogni operazione per fotogramma che ne ha bisogno ... e che tende ad essere un numero molto grande di operazioni.

Questa è solo una supposizione.


Potresti essere su qualcosa lì. Potrebbe avere qualcosa a che fare con lo spazio in cui viene calcolata l'illuminazione. Ma non penso che il buffer di profondità ne faccia parte, poiché memorizza la "pseudo-distanza" dall'occhio (o piano frontale) all'oggetto, non dalla distanza dalla luce all'oggetto. È la distanza della luce utilizzata nell'illuminazione.
Ken,

@downvoter: ti interessa commentare o semplicemente fare la traina? (per citare Jonathan)
Ingegnere

Anche il downvoting, l'attenuazione viene calcolata nello spazio degli occhi, non nello spazio normalizzato -> prospettiva / z non ha nulla a che fare con questo
Oliver Zendel,

1

Proprio come un addenum: quando si utilizza il modello openGL per l'approssimazione di una sorgente di luce sferica, tutti e tre i coefficienti hanno senso e sono validi (non "per evitare traboccamenti" o avere "libertà artistica"):

Per una sfera con raggio r otteniamo:

1 / (d / r + 1) ^ 2

questo si traduce in

c = 1 k = 2 / r s = (1 / r ^ 2)

(vedi http://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/ ).

Immagina che questa approssimazione sia migliore dell'uso di luci di punto infinitamente piccole senza estensione!


Come viene la formula 1 / (d / r + 1) ^ 2? L'articolo originale dice solo "Dopo aver esaminato i risultati di una serie di test, è diventato evidente", il che non è abbastanza convincente in termini di domanda che si pone sulla modellazione fisica.
user1914692

0

Ho una visione / risposta diversa sulla formula.

Quando osserviamo una luce spot, ad esempio, in realtà vediamo la dispersione della luce. Quindi la formula di 1 / d ^ 2 è solo per l'emissione di luce di quel pixel. Ma la luminosità nella nostra fotocamera di quel pixel avrà una formula più complicata, che utilizzerà la teoria della dispersione della luce. Vedi il documento

"Campionamento epipolare per ombre e raggi crepuscolari nei media partecipanti con scattering singolo"

di Thomas Engelhardt, Carsten Dachsbacher Ma sfortunatamente non hanno una formula finale semplice per la diffusione della luce. Immagino che forse l'imitazione finale della GPU sarebbe simile alla formula lineare e quadratica.

Quindi penso che l'affermazione:

"se stai cercando di imitare la realtà, vuoi il quadrato inverso (e la gamma corretta)" non è valido.

In realtà uso la formula con fattori lineari e quadratici senza gamma in grado di imitare molto bene gli effetti luminosi. Impossibile lineare.

In una breve sintesi, la formula ha la controparte fisica della dispersione della luce.

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.