¿El componente de atenuación lineal en los modelos de iluminación tiene una contraparte física?

18

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 des la distancia de la luz y c, ky sson constantes.

Entiendo el sd^2componente 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 kdcomponente lineal en el modelo (de forma predeterminada kes 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?"

Conocer
fuente
No dije que la atenuación lineal hace que una escena se vea mejor o más realista. Lo que dije es que podría verse mejor para sus propósitos. Mi raytracer iluminó una escena muy pequeña y, al comparar ambos modelos, el lineal se veía mejor. No necesito una razón física para decir que se veía mejor, solo se parecía más al efecto que quería lograr. Por el contrario, no es que la ley del cuadrado inverso no pareciera realista, simplemente se cayó demasiado rápido y contribuyó menos a la iluminación de la escena de lo que necesitaba.
David Gouveia
Lo siento, David, no quise tergiversar tu respuesta. He cambiado mi edición anterior.
Ken
1
Siempre es bueno recordar que toda la iluminación es un truco, puro y simple =)
Patrick Hughes

Respuestas:

21

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^2se 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.

Nicol Bolas
fuente
44
+1 Hace un tiempo que conozco el renderizado gamma correcto. Hace tiempo que conozco la atenuación cuadrática y lineal. Y este es el momento en que primero me doy cuenta de la conexión entre los dos. :-)
David Gouveia
¿Alguna razón para el -1?
Nicol Bolas
9

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 .

David Gouveia
fuente
6

Bien, voy a adivinarlo.

Observación preliminar

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 des la distancia de la luz y c, ky sson constantes.

Entiendo el sd^2componente que modela la atenuación conocida de la "ley del cuadrado inverso" físicamente precisa esperada en la realidad.

La curva para c+kd+sd^2es una parábola, y también lo es la curva para sd^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 que ksignifique, 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 == 1o dividir cada constante por sen la expresión, y dividir la potencia de su fuente de luz por s. Hay un parámetro demasiado en la fórmula.

Terminas con:

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

Cambio de variables

... que es estrictamente equivalente a:

1/(A + D^2)

con A == c/s - k^2/(4s^2)y, lo más importante D == d + k/2s,.

Esto 1/(A+D^2)realmente se ve como siempre 1/(c+d^2), ¿no?

Conclusión

El kfactor 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.

sam hocevar
fuente
3

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.

Ravachol
fuente
No creo que eso pueda ser verdad. La luz que viaja a través de un medio sería atenuada por 1/dla Rcoordenada, y aún por 1/d^2los thetay phicoordenadas esféricas. Lo que usted describe es, por lo tanto, una 1/d^3atenuación de la intensidad de la luz.
sam hocevar
3

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.

Maximus Minimus
fuente
1
  • c es el valor de atenuación constante para la fuente de luz.
  • les 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 .

r2d2rigo
fuente
Gracias, pero mi pregunta es cuál es el papel del componente de atenuación lineal en la luz de modelado. Pregunto porque no aparece en ningún modelo físico de luz que yo sepa. El enlace que proporciona NO explica para qué sirve el componente de atenuación lineal. Solo dice; "esto es atenuación lineal", sin ninguna otra explicación.
Ken
Bien, interpreté mal tu pregunta. La atenuación lineal se observaría mejor en una fuente de luz unidimensional infinita (piense en un tubo fluorescente), mientras que los modelos cuadráticos muestran el comportamiento de una fuente de luz esférica. Hasta ahora solo he encontrado un lugar donde hay una explicación de la correspondencia entre el modelo de luz física y el que se usa en los gráficos de computadora: imdoingitwrong.wordpress.com/2011/2011/31/light-attenuation
r2d2rigo
1

Podría derivarse del hecho de que Z, en palabras del estimado Eric Lengyel ,

es no lineal porque la rasterización con perspectiva correcta requiere una interpolación lineal de 1 / z; la interpolación lineal de z en sí misma no produce los resultados correctos. El hardware debe calcular 1 / z en cada vértice e interpolarlo a través de un triángulo, por lo que es conveniente escribir ese valor en el búfer de profundidad en lugar de realizar una división costosa en cada píxel para recuperar z.

El hecho de que obtenga más precisión z más cerca del plano cercano es solo un efecto secundario y no tiene nada que ver con la motivación detrás de la interpolación 1 / z.

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.

Ingeniero
fuente
Puede que tengas algo allí. Bien puede tener algo que ver con el espacio en el que se calcula la iluminación. Pero no creo que el búfer de profundidad sea parte de él, ya que almacena 'pseudo-distancia' desde el ojo (o plano frontal) hasta el objeto, no la distancia desde la luz hasta el objeto. Es la distancia de luz que se utiliza en la iluminación.
Ken
@downvoter: ¿quieres comentar o simplemente cursar? (para citar a Jonathan)
Ingeniero
Votando también, la atenuación se calcula en el espacio ocular no en el espacio normalizado -> perspectiva / z no tiene nada que ver con esto
Oliver Zendel
1

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!

Oliver Zendel
fuente
¿Cómo viene la fórmula 1 / (d / r + 1) ^ 2? El artículo original solo dice "Después de ver los resultados de una serie de pruebas, se hizo evidente", lo que no es lo suficientemente convincente en términos de la pregunta que se hace sobre el modelado físico.
user1914692
0

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.

usuario1914692
fuente