sombreado basado físicamente, ¿cómo combinar partes especulares y difusas?


8

Después de escribir los sombreadores de phong y blinn 'estándar' por un tiempo, recientemente comencé a incursionar en el sombreado de base física. Un recurso que me ayudó mucho son estas notas del curso , especialmente este documento : explica cómo hacer que el sombreado sea más plausible físicamente.

Implementé el modelo blinn que aparece en el documento, y realmente me gusta cómo se ve. El cambio más significativo propuesto (imo) es la inclusión de la reflectancia de fresnel, y esta es también la parte que me da problemas. Desafortunadamente, el autor eligió enfocarse solo en la parte especular, omitiendo la reflectancia difusa. Dado, por ejemplo, un reflejo difuso lambertiano, simplemente no sé cómo combinarlo con el blinn 'mejorado', porque simplemente agregar partes difusas y especulares ya no parece ser correcto.

En algunos sombreadores, he visto un 'término fresnel' de coma flotante en el rango 0-1 que se usa, basado en los índices de refracción de los medios participantes. La aproximación de Schlick se usa siempre:

float schlick( in vec3 v0, in vec3 v1, in float n1, in float n2 )
{
    float f0 = ( n1 - n2 ) / ( n1 + n2 );
    f0 *= f0;   
    return f0 + ( 1 - f0 ) * pow( dot( v0, v1 ), 5 );
} 

Haciéndolo así, se puede interpolar linealmente entre la contribución difusa y especular en función del término fresnel, p. Ej.

float fresnel = schlick( L, H, 1.0002926 /*air*/, 1.5191 /*other material*/ );
vec3 color = mix( diffuseContrib, specularContrib, fresnel );

En el documento, el autor afirma que este enfoque es incorrecto, porque básicamente solo oscurece el color especular siempre que L es paralelo o casi paralelo a H, y que en lugar de calcular un f0 basado en los índices de refracción, debe tratar el especular colorearse como f0 y hacer que su aproximación schlick calcule un vec3, así:

vec3 schlick( in vec3 v0, in vec3 v1, in vec3 spec )
{
    return spec + ( vec3( 1.0 ) - spec ) * pow( dot( v0, v1 ), 5 );
}

Esto da como resultado que el color especular vaya hacia el blanco en ángulos de mirada.

Ahora mi pregunta es, ¿cómo introduciría un componente difuso en esto? A 90 °, la contribución especular es completamente blanca, esto significa que toda la luz entrante se refleja, por lo que no puede haber una contribución difusa. Para ángulos de incidencia <90 °, ¿puedo simplemente multiplicar toda la parte difusa con (vec3 (1) - schlick), es decir, la proporción de luz que no se refleja?

vec3 diffuseContrib = max( dot( N, L ), 0.0 ) * kDiffuse * ( vec3( 1.0 ) - schlick( L, H, kSpec ) );

¿O necesito un enfoque completamente diferente?


2
¿Alguna vez resolviste esto? Estoy teniendo este problema exacto en este momento.

1
Me gustaría una respuesta a eso también. Lagarde también ha estado sugiriendo una subracción similar del color especular (que finalmente "no usó"), pero todo esto parece muy arbitrario.
v.oddou

Respuestas:


1

La respuesta corta:

¿Se ve lo suficientemente bueno?

  • Sí, guárdalo.

  • No, juega un poco más.

Respuesta larga:

Obtener un sombreado físico realista y preciso requiere más potencia de GPU de la que es posible, siempre tendrá que recurrir a falsificar cosas por la simple razón de que una computadora no puede simular todo el universo, ni siquiera todo el espectro de luz visible.

Es el "valle misterioso" del sombreado.

No solo debido a la iluminación ambiental y a la oclusión, sino que, por ejemplo, los ambientes externos, tanto de día como de luna, tienen una gran cantidad de luz de espectro ultravioleta, una pequeña parte de la cual se desplaza nuevamente al espectro visible por diversos materiales, en su mayoría orgánicos. Los diferentes tipos de iluminación de tubos fluorescentes y HID también emiten una buena cantidad de luz UV.

El efecto es sutil, pero gracias a años de evolución, el cerebro lo procesa instintivamente, ya que esto significa la diferencia entre una buena comida y posiblemente una muerte larga e insoportable, por lo que si algo está muy levemente fuera de nuestro cerebro suena la alarma "algo está mal" .

Los estilos artísticos de dibujos animados, poco realistas y casi realistas pero intencionalmente fuera de margen (por ejemplo: Halo) evitan este problema.

Otro problema es que no hay dos humanos que tengan la misma presencia de receptor RYGBL ni curva de respuesta, mientras que los monitores son estrictamente RGB y, por lo tanto, no pueden reproducir imágenes perfectamente para todos los humanos. (Rojo, Amarillo, Verde, Azul y Luma, ver Tetracromacia - http://en.wikipedia.org/wiki/Tetrachromacy )

No importa cuán duro trabaje, habrá "algo mal" y habrá margen de mejora, al menos para alguien en algún lugar.

Y esta es una razón por la cual hay tantos modelos de sombreado.

Debido a todo esto, un buen artista siempre termina engañando los niveles de luz y la respuesta de la luz en los entornos hasta cierto punto para lograr un resultado "suficientemente bueno" (nunca es perfecto), solo dales acceso para jugar con los ajustes y engañarlos. a resultados agradables.


Hay demasiada investigación en esta área para dar esa falta de respuesta.
Tara

@Tara, bienvenido a Stack Exchange. Estoy seguro de que con toda esa "demasiada investigación en esta área", se tomará el tiempo para escribir una no respuesta adecuada y contribuir a la comunidad en lugar de solo un comentario de una línea. Hay un pequeño botón en esta página que dice "Agregar otra respuesta" si puede encontrarlo. Podría necesitar un poco de investigación para encontrarlo, pero está ahí.
Stephane Hockenhull

Vaya, qué pasivo-agresivo. No dije que supiera mejor. Dije que sé que hay un montón de investigaciones por ahí que están tratando de abordar este problema no solo "haciendo lo que sea" y hablando sobre el cerebro humano y la muerte.
Tara

Todavía no veo una nueva respuesta que no sea la "no respuesta" de 2014 y el comentario de una línea, no constructivo, activo-agresivo publicado 5 años después. Eres 100% bienvenido a tomar toda esa investigación (de la cual has proporcionado cero enlaces hasta ahora, solo el comentario de una línea) que se aplica perfectamente a los motores de juego en tiempo real y toma el tiempo para resumirla en una respuesta adecuada.
Stephane Hockenhull

Estoy bien, gracias. Ya rechacé la pregunta y agregué mi comentario inicial para explicar por qué lo hice, porque a la gente no le gustan los votos negativos inexplicables.
Tara
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.