Est-ce la bonne façon d'appliquer la loi de Beer?


11

Lorsque j'implémente la loi de Beer (absorption des couleurs à distance à travers un objet), cela n'a jamais l'air très bien pour une raison quelconque.

Quand j'ai la couleur derrière l'objet, je calcule la couleur ajustée comme ceci:

const vec3 c_absorb = vec3(0.2,1.8,1.8);
vec3 absorb = exp(-c_absorb * (distanceInObject));
behindColor *= absorb;

Cela me donnera quelque chose qui ressemble à ceci (notez un peu de réfraction appliquée): entrez la description de l'image ici

Et ici c'est sans réfraction: entrez la description de l'image ici

Notez que ceci est mis en œuvre comme un jouet de shaders ici .

Cela correspond à la description de ce que fait la loi de Beer, mais cela n'a pas l'air très bien, pas par rapport à des plans comme celui-ci: entrez la description de l'image ici

Mis à part les faits saillants spéculaires, j'essaie de comprendre la différence. Serait-ce juste que ma géométrie est trop simple pour vraiment la montrer très bien? Ou est-ce que je l'implémente mal?


2
Cependant, vous comparez un cube avec un maillage plus complexe. Pourquoi ne pas reproduire le même scénario? Le modèle Susan est facile à obtenir.
Bart

Ce n'est pas si facile dans une implémentation shadertoy! (:
Alan Wolfe

2
Votre cube me semble correct: soyez plus transparent à mesure qu'il approche des bords. Si vous pouvez faire Suzanne à part entière, la sphère a devrait au moins donner une meilleure approximation de l'apparence de l'autre image.
yuriks

1
Je ne peux pas séparer la réfraction de l'atténuation. Pouvez-vous rendre le cube avec IOR = 1.0 s'il vous plaît?
imallett

1
@AlanWolfe Votre rendu IOR = 1 ressemble exactement à ce à quoi je m'attendais, et j'ai survolé le shadertoy impl et il a l'air bien.
imallett

Réponses:


12

Votre image ne semble certainement pas correcte, et il semble que vous ne calculiez pas correctement le chemin interne des rayons lumineux lorsqu'ils voyagent à travers votre maillage. D'après son apparence, je dirais que vous calculez la distance entre le point où le rayon de vue pénètre pour la première fois dans le cube et où il frappe pour la première fois le mur intérieur, et que vous l'utilisez comme distance d'absorption. Cela suppose essentiellement que la lumière sortira toujours du verre la première fois qu'elle heurte un mur, ce qui est une mauvaise hypothèse.

En réalité, lorsque la lumière pénètre dans le verre par l'air, elle ne sort souvent pas immédiatement du verre. En effet, lorsque la lumière frappe l'interface verre / air, un phénomène connu sous le nom de réflexion interne totale (TIR) ​​peut se produire. TIR se produit lorsque la lumière se déplace d'un milieu avec un indice de réfraction plus élevé (IOR) à un avec un IOR inférieur, ce qui est précisément ce qui se passe dans le cas où la lumière frappe la paroi intérieure d'un objet en verre. Cette image de Wikipedia est une bonne démonstration visuelle de ce à quoi elle ressemble lorsqu'elle se produit:

réflexion interne totale

En termes de base, ce que cela signifie, c'est que si la lumière frappe à un angle peu profond, la lumière se réfléchira complètement de l'intérieur du support. Pour en tenir compte, vous devez évaluer les équations de Fresnelchaque fois que votre rayon lumineux frappe une interface verre / air (AKA la surface intérieure de votre maille). Les équations de Fresnel vous indiqueront le rapport de la lumière réfléchie à la quantité de lumière réfractée, alors qu'il sera de 1 dans le cas du TIR. Vous pouvez ensuite calculer les directions appropriées de la lumière réfléchie et réfractée et continuer à tracer le chemin de la lumière à travers le milieu ou à l'extérieur de celui-ci. Si vous supposez un maillage convexe simple avec un coefficient de diffusion uniforme, la distance à utiliser pour la loi de Beer sera la somme de toutes les longueurs de chemin interne avant de quitter le support. Voici à quoi ressemble un cube avec vos coefficients de diffusion et un IOR de 1,526 (verre sodocalcique), rendu à l'aide de mon propre traceur de trajectoire qui tient compte des réflexions et des réfractions internes et externes:

cube de verre tracé

En fin de compte, les réflexions et les réfractions internes sont une partie importante de ce qui fait que le verre ressemble à du verre. Les approximations simples ne suffisent vraiment pas, comme vous l'avez déjà découvert. Cela devient encore pire si vous ajoutez plusieurs mailles et / ou mailles non convexes, car vous devez non seulement prendre en compte les réflexions internes mais également tenir compte des rayons qui quittent le milieu et y pénètrent à un point différent.


1
Here is what a cube looks like (...) using my own path tracer. Vous arrive-t-il d'avoir l'open source par hasard?
essuyez le

2
Non pas encore. Je prévoyais de terminer et de publier cette variante particulière avec un article de blog sur le rendu du verre, mais cela fait partie de mon carnet de commandes depuis un certain temps.
MJP
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.