En OpenGL (y otros sistemas) el factor de atenuación de distancia para luces puntuales es algo así como 1/(c+kd+sd^2)
, donde d
es la distancia de la luz y c
, k
y s
son constantes.
Entiendo el sd^2
componente que modela la atenuación conocida de la "ley del cuadrado inverso" físicamente precisa esperada en la realidad.
Supongo que la constante c
, generalmente una, está ahí para lidiar con valores muy pequeños de d
(¿y quizás una defensa de división por cero?).
Qué papel tiene el kd
componente lineal en el modelo (de forma predeterminada k
es cero en OpenGL). ¿Para cuándo usarías otros valores k
? Sé que esto se llama componente de "atenuación lineal", pero ¿qué comportamiento simula en el modelo de iluminación? No parece aparecer en ningún modelo físico de luz que yo sepa.
[EDITAR]
David Gouveia ha señalado que el factor lineal podría usarse para ayudar a que la escena "se vea" más cerca de lo que pretendía el desarrollador / artista, o para controlar mejor la velocidad a la que cae la luz. En cuyo caso mi pregunta se convierte en "¿el factor de atenuación lineal tiene una contraparte física o simplemente se usa como un factor de fudge para ayudar a controlar la calidad de la luz en la escena?"
Respuestas:
La luz, de fuentes puntuales, cae con el cuadrado de la distancia. Esa es la realidad física.
La atenuación lineal a menudo se dice que parece superior. Pero esto solo es cierto cuando se trabaja en un espacio de color no lineal . Es decir, si no tiene activa la corrección gamma adecuada. La razón es bastante simple.
Si está escribiendo valores RGB lineales en una pantalla no lineal sin corrección gamma, entonces sus valores lineales serán destrozados por la rampa gamma incorporada del monitor. Esto efectivamente oscurece la escena en comparación con lo que realmente pretendía.
Suponiendo una gamma de 2.2, su monitor elevará efectivamente todos los colores a la potencia de 2.2 cuando los muestre.
Esto es de atenuación lineal:
1/kd
. Esta es la atenuación lineal con rampa gamma del monitor aplica:1/(kd)^2.2
. Eso está bastante cerca de una relación inversa al cuadrado adecuada.Pero a la inversa al cuadrado real:
1/sd^2
se convierte en:1/((s^2)(d^4.4))
. Esto hace que la atenuación de la luz disminuya mucho más bruscamente de lo esperado.En general, si está utilizando la corrección gamma adecuada (como renderizar en un framebuffer sRGB), no debe usar la atenuación lineal. No se verá bien. En absoluto . Y si no estás usando la corrección gamma ... qué te pasa;)
En cualquier caso, si estás tratando de imitar la realidad, quieres un cuadrado inverso (y gamma correcto). Si no lo eres, puedes hacer lo que necesites para tu escena.
fuente
Flexibilidad .
Porque es posible que desee que sus luces se caigan linealmente. Está ahí para darle ese grado de control. Realmente no necesita ser físicamente preciso (y las ecuaciones de iluminación de sombreado de phong completas tampoco son físicamente precisas).
A veces, el modelo cuadrático emitirá luz demasiado rápido cerca de la fuente y dejará "resplandores blancos" en las superficies cercanas. Al proporcionar coeficientes lineales y constantes, tiene la flexibilidad de ajustar los resultados a su gusto.
Por ejemplo, cuando implementé un rastreador de rayos, descubrí que la ley del cuadrado inverso hacía que mis luces puntuales se cayeran demasiado rápido. Cambié a un modelo lineal fijo (donde cada luz tenía un radio mínimo y máximo, con interpolación lineal en el medio) y se veía mejor.
Editar: Acabo de encontrar un buen recurso que explica esto .
fuente
Bien, voy a adivinarlo.
Observación preliminar
La curva para
c+kd+sd^2
es una parábola, y también lo es la curva parasd^2
; la diferencia no es tan importante como parece: se comportan de manera similar en el infinito, es solo para valores pequeños que son diferentes. Lo que sea quek
signifique, solo tiene sentido cuando está cerca de la luz.Simplificación preliminar
Dado que este es un factor de atenuación , también podría establecer
s == 1
o dividir cada constante pors
en la expresión, y dividir la potencia de su fuente de luz pors
. Hay un parámetro demasiado en la fórmula.Terminas con:
Cambio de variables
... que es estrictamente equivalente a:
con
A == c/s - k^2/(4s^2)
y, lo más importanteD == d + k/2s
,.Esto
1/(A+D^2)
realmente se ve como siempre1/(c+d^2)
, ¿no?Conclusión
El
k
factor avanza o retrasa la atenuación de la luz para que solo comience en un radio de-k/2s
(sí, también podría tener un radio "negativo", piense en un punto de luz imaginario dentro de un espejo esférico imaginario que solo dejaría salir la luz por segunda vez) . ¡Parece que las matemáticas vuelven a ganar!Editar: Por un segundo pensé que era equivalente a una luz esférica, pero no lo es. Lo más notable es que no generará sombras suaves.
¿Utilidad?
Supongo que un artista puede usar este parámetro para hacer que una luz parezca que está más cerca (o más lejos) del objeto en términos de iluminación, pero sin moverla. Dado que las luces puntuales generan sombras duras, puede ser un requisito que la luz permanezca en una posición específica.
fuente
El coeficiente de atenuación lineal es la contraparte física de la luz que viaja a un medio. Sin atenuación, la luz parece viajar en perfecto vacío. Al renderizar escenas "realistas", desea que el aire atenúe la intensidad de la luz a distancia, y esta atenuación es lineal.
fuente
1/d
laR
coordenada, y aún por1/d^2
lostheta
yphi
coordenadas esféricas. Lo que usted describe es, por lo tanto, una1/d^3
atenuación de la intensidad de la luz.El factor de atenuación lineal está ahí para los casos en que es posible que desee utilizar la atenuación lineal para su iluminación, pero la clave es que no tiene que usarla (ni ninguno de los otros factores de atenuación, para el caso).
Esto le permite ajustar su iluminación a sus gustos personales. Por lo tanto, configure cualquier factor de atenuación que no desee en 0 y los que sí desee que no sean 0 y listo.
Un ejemplo específico en el que es posible que desee utilizar la atenuación lineal sería si el cuadrado inverso más matemáticamente correcto proporciona una caída demasiado rápida. Usando lineal puede obtener un resultado que puede verse más o menos lo suficientemente bueno (y con menos luces en la escena); entonces usarías 0 constante, 1 lineal y 0 exponencial.
Es interesante observar (pero ciertamente no es relevante para esta discusión) que los sprites de punto en OpenGL y D3D (y los parámetros de punto en OpenGL) usan la misma fórmula de atenuación.
También vale la pena señalar que la iluminación OpenGL / D3D no está estrictamente destinada a ser físicamente correcta; nunca fue diseñado para ser más que una aproximación aceptable, y eso debe tenerse en cuenta al consultar cualquier cosa relacionada con la forma en que funciona.
Por supuesto, hoy en día lo más probable es que esté usando un sombreador, por lo que la antigua fórmula ligera es principalmente de interés académico / histórico únicamente: puede escribir la fórmula ligera que desee.
fuente
c
es el valor de atenuación constante para la fuente de luz.l
es la atenuación lineal Es por eso que se multiplica por la distancia a la fuente de luz.s
es la atenuación cuadrática, por lo que se multiplica por el cuadrado de la distancia.Hay más información en este enlace .
fuente
Podría derivarse del hecho de que Z, en palabras del estimado Eric Lengyel ,
El tampón de profundidad almacena distancias. La luz usa la distancia para la atenuación. Podría ser la relación entre el búfer de profundidad y las implementaciones de iluminación lo que lo necesitaba, aunque eso se aplicaría solo si el algoritmo de iluminación se ejecutara en el espacio de la pantalla, supongo. Recuerde que es mejor almacenar siempre un inverso precalculado (o calculado por hardware), que tener que realizar una división en el valor indiviso para cada operación por cuadro que lo necesita ... y eso tiende a ser una gran cantidad de operaciones.
Esto es sólo una suposición.
fuente
Como un apéndice: cuando se utiliza el modelo openGL para aproximar una fuente de luz esférica, los tres coeficientes tienen sentido y son válidos (no "para evitar desbordamientos" o para tener "libertad artística"):
Para una esfera con radio r obtenemos:
1 / (d / r + 1) ^ 2
esto se traduce en
c = 1 k = 2 / r s = (1 / r ^ 2)
(Ver http://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/ ).
¡En mi opinión, esta aproximación es mejor que usar luces puntuales infinitesimalmente pequeñas sin ninguna extensión!
fuente
Tengo una opinión / respuesta diferente sobre la fórmula.
Cuando vemos una luz puntual, por ejemplo, en realidad vemos la dispersión de la luz. Entonces, la fórmula de 1 / d ^ 2 es solo para la emisión de luz de ese píxel. Pero el brillo en nuestra cámara de ese píxel tendrá una fórmula más complicada, que utilizará la teoría de dispersión de la luz. Ver el periódico
"Muestreo epipolar para sombras y rayos crepusculares en medios participantes con dispersión única"
por Thomas Engelhardt, Carsten Dachsbacher Pero desafortunadamente no tienen una fórmula final simple para la dispersión de la luz. Supongo que quizás el efecto final de imitación de GPU sería similar a la fórmula lineal y cuadrática.
Entonces creo que la afirmación:
"si estás tratando de imitar la realidad, quieres un cuadrado inverso (y gamma correcto)" no es válido.
En realidad, utilizo la fórmula con factores lineales y cuadráticos sin gamma que pueden imitar muy bien los efectos brillantes. Lineal no puede.
En un breve resumen, la fórmula tiene la contraparte física de la dispersión de la luz.
fuente