sombreamento fisicamente baseado, como combinar partes especulares e difusas?

8

Depois de escrever shaders phong e blinn 'padrão' por um tempo, recentemente comecei a me envolver com sombreamentos fisicamente baseados. Um recurso que me ajudou muito são as notas do curso , especialmente este artigo - explica como tornar o blinn mais sombreado fisicamente plausível.

Eu implementei o modelo blinn apresentado no artigo e realmente gosto da aparência dele. A mudança mais significativa proposta (imo) é a inclusão da refletância de fresnel, e essa também é a parte que me causa problemas. Infelizmente, o autor optou por se concentrar apenas na parte especular, omitindo a refletância difusa. Dado, por exemplo, uma reflexão difusa lambertiana, simplesmente não sei como combiná-la com o blinn 'aprimorado' - porque apenas adicionar partes difusas e especulares parece não estar mais certa.

Em alguns shaders, vi um ponto flutuante 'termo fresnel' no intervalo de 0 a 1 sendo usado, com base nos índices de refração da mídia participante. A aproximação de Schlick é usada sempre:

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 );
} 

Fazendo assim, é possível interpolar linearmente entre contribuição difusa e especular com base no termo fresnel, por exemplo

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

No artigo, o autor afirma que essa abordagem é incorreta - porque basicamente escurece a cor especular sempre que L é paralela ou quase paralela a H - e que, em vez de calcular um f0 com base nos índices de refração, você deve tratar a especular colora-se como f0 e faça com que sua aproximação schlick calcule um vec3, assim:

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

Isso resulta na cor especular indo para o branco em ângulos de visão.

Agora, minha pergunta é: como introduziria um componente difuso nisso? A 90 °, a contribuição especular é totalmente branca; isso significa que toda a luz que entra é refletida; portanto, não pode haver uma contribuição difusa. Para ângulos de incidência <90 °, posso multiplicar toda a parte difusa com (vec3 (1) - schlick), ou seja, a proporção de luz que não é refletida?

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

Ou preciso de uma abordagem completamente diferente?

gemse
fonte
2
Você já resolveu isso? Estou tendo esse problema exato agora.
11
Eu gostaria de uma resposta para isso também. Lagarde também está sugerindo uma subtração similar de cor especular (que ele eventualmente "não usou"), mas tudo isso parece muito arbitrário.
precisa saber é o seguinte

Respostas:

1

A resposta curta:

Parece bom o suficiente?

  • Sim - guarde.

  • Não - mexa um pouco mais.

Resposta longa:

Para obter um sombreamento físico realista realista preciso, é necessário mais poder da GPU do que é possível; você sempre precisará fingir coisas pela simples razão de que um computador não pode simular todo o universo, nem mesmo todo o espectro de luz visível.

É o "vale misterioso" do sombreamento.

Não apenas devido à iluminação e oclusão do ambiente, mas, por exemplo, os ambientes externos, tanto durante o dia quanto à luz da lua, têm uma enorme quantidade de luz do espectro UV, uma pequena parte da qual volta ao espectro visível por vários materiais, principalmente orgânicos. Diferentes tipos de iluminação fluorescente e HID também emitem uma boa quantidade de luz UV.

O efeito é sutil, mas graças a anos de evolução, o cérebro o processa instintivamente, pois isso significa a diferença entre uma boa refeição e possivelmente uma longa morte excruciante, por isso, se algo está um pouco fora do nosso cérebro, soa o alarme "algo está errado" .

Estilos de arte cartoony, irrealistas e quase realistas, mas intencionalmente fora de uma boa margem (por exemplo: Halo) evitam esse problema.

Outra questão é que dois humanos não têm a mesma presença de receptor RYGBL nem curva de resposta, enquanto os monitores são estritamente RGB e, portanto, não podem reproduzir perfeitamente imagens de todos os humanos. (Vermelho, Amarelo, Verde, Azul e Luma, consulte Tetracromacy - http://en.wikipedia.org/wiki/Tetrachromacy )

Não importa o quanto você trabalhe, haverá "algo errado" com ele e espaço para melhorias, no mínimo para alguém em algum lugar.

E essa é uma das razões pelas quais existem tantos modelos de sombreamento.

Por tudo isso, um bom artista sempre acaba enganando os níveis de luz e a resposta da luz nos ambientes, até certo ponto, para obter um resultado "bom o suficiente" (nunca é perfeito), basta dar acesso a eles para mexer nas configurações e enganar seu caminho a resultados agradáveis.

Stephane Hockenhull
fonte
Há muita pesquisa nessa área para dar essa não resposta.
Tara
@Tara, bem-vindo ao Stack Exchange. Tenho certeza de que, com toda essa "muita pesquisa nessa área", você dedica um tempo para escrever uma não-resposta não adequada e contribuir para a comunidade, em vez de apenas um comentário de uma linha. Há um pequeno botão nesta página que diz "Adicionar outra resposta", se você puder encontrá-lo. Pode ser necessário um pouco de pesquisa para encontrá-lo, mas está lá.
Stephane Hockenhull
Uau, como passivo-agressivo. Eu não disse que sabia melhor. Eu disse que sei que há um monte de pesquisas por aí que tentam resolver esse problema, não apenas fazendo "apenas o que for", mas também tangenciando o cérebro humano e a morte.
Tara
Ainda não vejo uma nova resposta além da "não resposta" de 2014 e o comentário de uma linha, não construtivo e ativo-agressivo publicado 5 anos depois. Você é 100% bem-vindo a fazer toda a pesquisa (da qual você forneceu zero links até agora, apenas o comentário de uma linha) que é perfeitamente aplicável aos mecanismos de jogos em tempo real e dedicar um tempo para resumir em uma resposta adequada.
Stephane Hockenhull
Eu estou bem, obrigado. Eu já diminuí a votação da questão e adicionei meu comentário inicial para explicar por que o fiz, porque as pessoas não gostam de votos inexplicáveis.
Tara