Não consigo encontrar uma boa razão para isso em nenhum lugar. O vetor de reflexão usado em phong tem uma base simples em física. Mas o meio vetor usado em blinn aparentemente não tem base racional e não constitui uma reflexão adequada. E, no entanto, é usado em todas as chamadas funções de sombreamento "fisicamente baseadas". Se houver uma boa base física, eu gostaria de saber.
O que consegui encontrar são alguns dos motivos:
É mais rápido - há informações variadas sobre isso, mas mesmo assim teria sido um ótimo motivo ... no ano de 1998.
Ele lida com ângulos superiores a 90 graus - até onde eu sei, a única razão para isso é porque o termo phong foi usado incorretamente. O produto escalar da reflexão e da vista fornece um ângulo entre -1 e +1. Normalmente, esse ângulo é fixado em 0 a 1, essa é a causa direta do problema de 90 graus. Re-normalize o ângulo em vez de fixá-lo e você terá a cobertura completa de 180 graus. Recuso-me a acreditar que uma operação simples x * 0,5 + 0,5 ilude o mundo dos gráficos há 40 anos.
ele lida melhor com as bordas - O "problema" da borda também existe na solução blinn, apenas em menor grau. A principal causa é a simulação inadequada da iluminação da área no terminador, o que deve ser essencial para qualquer sombreador "fisicamente". Mas mesmo em situações mais simples, uma função sigmóide pode aproximar uma linha terminadora suave corretamente. A multiplicação para um termo lambert é incorreta, pois atenua indevidamente o termo especular, isso pode cancelar um termo de fresnel e levar a erros adicionais.
Tem longas reflexões na borda - Parece-me que, embora as reflexões anisotrópicas possam ser realistas, o blinn não é a maneira correta de implementá-las, pois elas apenas aparecem na borda. É apenas uma feliz coincidência que um erro no termo H pareça realista.
Nenhuma dessas razões é satisfatória, quero resolver essa loucura.
Quero esclarecer que não estou falando especificamente de blinn e phong , mas dos componentes vetoriais H e R, que são usados como base para esses shaders e para outros.
Na verdade, acho que você listou as razões pelas quais Blinn é o padrão em relação a Phong.
Cada razão que você listou existe, de fato, uma área em que Blinn se mostra superior a Phong.
Tomados como um todo, tudo isso leva a Blinn a ser um padrão melhor do que Phong.
Blinn é perfeito? É melhor que Phong?
Não.
Mas é um padrão razoável. Sinta-se livre para substituir Phong por Blinn em qualquer renderizador / shader que você escrever.
fonte
Eu descobri o motivo do vetor H ser usado. Infelizmente, não é assim que é usado na maioria dos modelos de sombreamento, que pode ser considerado incorreto.
Para sombreamento fisicamente baseado, a luz refletida deve obedecer às equações de Fresnel. (A maioria dos shaders "baseados fisicamente" não) Os microfacetes também devem obedecer às equações de Fresnel, que se baseiam no ângulo de incidência da luz e no índice de refração da interface para produzir um resultado correto.
De acordo com a lei da reflexão, o ângulo de incidência deve ser espelhado com o ângulo de reflexão ao longo da superfície normal. Para um raio de luz ter atingido a câmera - o que sabemos que aconteceu - deve ter sido refletido a partir da luz - para a qual sabemos a direção. Assim, a superfície normal deve, por dedução, ser o eixo do espelho para essas duas direções. Isso nos dá o meio vetor H que está entre eles. Calculado normalizando a soma de ambos.
Agora, calculando o ângulo entre a direção da luz L e o meio vetor H, adquirimos o ângulo de incidência para a reflexão especular de um microfacete e podemos atenuá-lo corretamente usando o termo fresnel.
Observe que a direção da vista é igual a R para esse microfacete, H não é um termo de reflexão. Blinn, Cook, Torrance e Sparrow podem sugá-lo. Phong e Fresnel estavam certos.
fonte