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):
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:
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?
3d
refraction
transparency
Alan Wolfe
la source
la source
Réponses:
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:
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:
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.
la source
Here is what a cube looks like (...) using my own path tracer.
Vous arrive-t-il d'avoir l'open source par hasard?