Como combinar adequadamente os termos difusos e especulares?


18

Tanto quanto eu entendo, em um BRDF o termo Fresnel está nos dizendo a probabilidade de um fóton ser refletido ou refratado quando atinge uma superfície.

Os fótons refletidos contribuirão para o termo especular, enquanto os fração refratados contribuirão para o termo difuso. Portanto, ao determinar, de maneira física, a contribuição de uma luz para a cor do material, sinto-me tentado a escrever:

// Assuming for example:
//   diffuse = dot(L, N);
//   specular = pow(dot(H, N), alpha) * (alpha + 2.0) / 8.0;
//   fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
color = lightIntensity * Lerp(diffuse * albedo, specular, fresnel);

No entanto, acho que nunca vi isso escrito dessa maneira. Vi o termo especular ser ponderado de acordo com o termo de Fresnel, mas não o difuso. Em seu artigo amplamente referenciado na PBR , Sébastien Lagarde afirma que o uso de para ponderar o termo difuso está incorreto.(1F)

o que estou perdendo?
Eu gostaria muito de receber uma explicação que destaque de maneira óbvia por que isso seria incorreto.

Respostas:


14

O uso de dois termos de Fresnel é correto no sentido de que qualquer caminho difuso passa pela superfície duas vezes. Se você está resolvendo a difusão, traçando um caminho através do meio até que ele salte novamente, então você receberá dois (ou mais) termos de Fresnel para esse caminho à medida que interage com a superfície.

No entanto, não é isso que você está fazendo com um BRDF difuso. Um BRDF difuso pretende representar a média de todos os possíveis caminhos de difusão. No caso de um lambertiano, essa média é modelada como reflexão uniforme e um único valor albedo medindo a perda de energia interna durante a difusão, mas modelos mais complicados são possíveis. Fundamentalmente: um BRDF difuso já incluirá o efeito agregado de alguns caminhos que são refletidos de volta ao meio para difundir ainda mais e alguns desmaiarem imediatamente.1Fout

1glossy_bsdf(in,out)dout

1glossydout=1Fin

π

Então, aproximadamente:

// Assuming for example:
//   diffuse = albedo / PI;
//   specular = my_favorite_glossy_brdf(in_dir, out_dir, roughness);
//   fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
//   total_surface_reflection = fresnel
color = lightIntensity * dot(L, N) * Lerp(diffuse, specular, total_surface_reflection);

F em todos os caminhos possíveis de saída de difusão interna incidente que resultam na sua direção externa, mas discordo.


8

Ao navegar para escrever corretamente minha pergunta, encontrei a resposta , que por acaso é muito simples.

Outro termo de Fresnel também terá peso à medida que os fótons saem do material (sendo refratados pelo ar) e se tornam o termo difuso. Assim, o fator correto para o termo difuso seria:

(1Fin)(1Fout)

1
A seção 5.3 do documento Disney BRDF refere-se à equação em sua resposta e depois especifica um modelo diferente. Não pretendo entender nada disso, pois acabei de iniciar minha implementação brilhante do BRDF!
PeteUK

Eu acho que isso continuaria daqui, onde a luz que é refletida internamente atingia a superfície novamente a partir do interior, no lado oposto, e então novamente, e novamente, cada vez diminuindo, para o infinito: P (ou para sub hehe dispersão de superfície)
Alan Wolfe

Como você calcula o outro termo de Fresnel?
plasmacel 26/09
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.