Naissance d'un shader - étape 2 : comprendre la recherche, suivre ses evolutions.
Jeudi 16 octobre 2008 à 13 h 59
Une fois le papier trouvé, il faut encore le lire, mais surtout le comprendre.
D'abord, comment ces gens en sont venu à ce resultat ?
- on les engage en disant "bon les gars, on a besoin d'un modele mathématique pour faire du beau poil sur notre prochain film !".
On les enferme dans une piece et on attend.
Par où on commence ? Ben, logiquement, on regarde déjà à quoi ressemble un poil. Et surtout, on regarde comment il réagit à la lumiere.
Alors j'ai pas trouvé de photo de ce genre d'équipement (parce que je sais déjà pas comme ça s'appelle exactement), mais ça marche comme ça :
- on met un poil dans une chambre noire.
- on met une lumiere qui va tourner et changer d'intensité tout les x degrés.
- on met un capteur qui lui aussi va tourner et choper la lumiere provenant du poil.
Bon evidemment une lumiere fixe et tourner le poil et la camera suffirait, mais comme c'est piti et cassant, c'est plus simple de faire tourner tout le reste.
Ca donne, par exemple, ça :

Bon c'est un exemple simple : les courbes, c'est les mesures de lumières (R G et B).
Le petit soleil noir, c'est la lumiere emise.
le plan, c'est le poil, la racine vers la gauche, la pointe vers la droite.
phiR, c'est l'angle de vue.
Par exemple, sur le tout premier schéma, il faut se placer à +- 35° pour voir un beau speculaire.
Bon bref, ils ont fait des tas et des tas de mesure. Et les resultats leur ont dit quelque chose. Et ils se sont souvenus d'un truc qu'ils ont du étudier vers l'age de 10 ans.
Petite histoire :
vers 1630, un mec un peu poète se passionne pour les arcs-en-ciel. Il essaye de comprendre comment se forme le prisme, et analyse donc un cas simplifié de la goutte d'eau : un cylindre de verre. Il en sort pleins de resultats.
Il se trouve que ces resultats sont tres similaires à ceux obtenus dans nos cheveux.
Il en sort aussi pleins de maths. Et ces maths, on peut les réappliquer facilement.
Le mec, c'est Descartes, les formules je vous laisse chercher si ça vous interesse (tout est dans le pdf de l'article 1), et le resumé, c'est ça :

et son application dans le poil :

Pour un rayon frappant le poil, une partie est reflechie (R pour reflechi), une partie est refractée deux fois et traverse donc le poil (TT pour transmis-transmis), et une partie est refléchie dans le poil pour ressortir ailleurs. (TRT pour transmis-reflechi-transmis - ou SS pour Sub Scattering).
Grace à descartes, on a les formules et simplifications pour calculer le chemin de chaque rayon dans le cylindre (cas simplifié, je vous passe les deltaH et cie), comme le fait qu'on a soit un path ou 3 pour un point d'entrée et un angle donné (ce qui donne un ou deux speculaires selon l'angle), ou comme le fait que les rayons peuvent converger et donner des caustiques dans la poil.
C'est assez efficace : au lieu de faire varier l'angle du rayon incident, on peut plutot faire varier les angles de refractions. Et comme du coup l'angle incident reste fixe, on peut précalculer tout les cas possibles, ce qui accèlere le rendu.
Encore une fois je fais des raccourcis et je simplifie le procédé, mais c'est ça - nvdia utilise ce genre de table de pré-calcul en temps réel sur la demo de nalu). On précalcule tout les cas possibles, on entre un angle de lumiere, un angle de vue, et on a immédiatement le resultat pour chaque point/path possible.
Mais bon, on est pas dans un cylindre parfait, il faut donc rajouter la dessus l'applatissement du cheveux, et surtout les fait qu'il est constitué d'écailles (l'angle alpha du schéma - renvoye R vers la base du poil et le TRT vers la pointe par exemple)
La compréhension est une chose, mettre en pratique les maths derriere, c'est autre chose. Heureusement l'un de mes patrons est une brutasse là dedans et m'a sorti en 4 jours un pseudo-code de ce papier.
Reste l'analyse des papiers sortis après celui là : le dual scattering (on prend en compte le fait que la lumiere qui sort d'un poil va contribuer à éclairer son voisin) et autres "spherical harmonics" très recentes (2007 -plus théorie que pratique- et 2008 - utilisables).
Etape 3, traduire les maths en language compréhensible par le moteur de rendu, et en utilisant les données fournies par le soft de 3d...
D'abord, comment ces gens en sont venu à ce resultat ?
- on les engage en disant "bon les gars, on a besoin d'un modele mathématique pour faire du beau poil sur notre prochain film !".
On les enferme dans une piece et on attend.
Par où on commence ? Ben, logiquement, on regarde déjà à quoi ressemble un poil. Et surtout, on regarde comment il réagit à la lumiere.
Alors j'ai pas trouvé de photo de ce genre d'équipement (parce que je sais déjà pas comme ça s'appelle exactement), mais ça marche comme ça :
- on met un poil dans une chambre noire.
- on met une lumiere qui va tourner et changer d'intensité tout les x degrés.
- on met un capteur qui lui aussi va tourner et choper la lumiere provenant du poil.
Bon evidemment une lumiere fixe et tourner le poil et la camera suffirait, mais comme c'est piti et cassant, c'est plus simple de faire tourner tout le reste.
Ca donne, par exemple, ça :

Bon c'est un exemple simple : les courbes, c'est les mesures de lumières (R G et B).
Le petit soleil noir, c'est la lumiere emise.
le plan, c'est le poil, la racine vers la gauche, la pointe vers la droite.
phiR, c'est l'angle de vue.
Par exemple, sur le tout premier schéma, il faut se placer à +- 35° pour voir un beau speculaire.
Bon bref, ils ont fait des tas et des tas de mesure. Et les resultats leur ont dit quelque chose. Et ils se sont souvenus d'un truc qu'ils ont du étudier vers l'age de 10 ans.
Petite histoire :
vers 1630, un mec un peu poète se passionne pour les arcs-en-ciel. Il essaye de comprendre comment se forme le prisme, et analyse donc un cas simplifié de la goutte d'eau : un cylindre de verre. Il en sort pleins de resultats.
Il se trouve que ces resultats sont tres similaires à ceux obtenus dans nos cheveux.
Il en sort aussi pleins de maths. Et ces maths, on peut les réappliquer facilement.
Le mec, c'est Descartes, les formules je vous laisse chercher si ça vous interesse (tout est dans le pdf de l'article 1), et le resumé, c'est ça :

et son application dans le poil :

Pour un rayon frappant le poil, une partie est reflechie (R pour reflechi), une partie est refractée deux fois et traverse donc le poil (TT pour transmis-transmis), et une partie est refléchie dans le poil pour ressortir ailleurs. (TRT pour transmis-reflechi-transmis - ou SS pour Sub Scattering).
Grace à descartes, on a les formules et simplifications pour calculer le chemin de chaque rayon dans le cylindre (cas simplifié, je vous passe les deltaH et cie), comme le fait qu'on a soit un path ou 3 pour un point d'entrée et un angle donné (ce qui donne un ou deux speculaires selon l'angle), ou comme le fait que les rayons peuvent converger et donner des caustiques dans la poil.
C'est assez efficace : au lieu de faire varier l'angle du rayon incident, on peut plutot faire varier les angles de refractions. Et comme du coup l'angle incident reste fixe, on peut précalculer tout les cas possibles, ce qui accèlere le rendu.
Encore une fois je fais des raccourcis et je simplifie le procédé, mais c'est ça - nvdia utilise ce genre de table de pré-calcul en temps réel sur la demo de nalu). On précalcule tout les cas possibles, on entre un angle de lumiere, un angle de vue, et on a immédiatement le resultat pour chaque point/path possible.
Mais bon, on est pas dans un cylindre parfait, il faut donc rajouter la dessus l'applatissement du cheveux, et surtout les fait qu'il est constitué d'écailles (l'angle alpha du schéma - renvoye R vers la base du poil et le TRT vers la pointe par exemple)
La compréhension est une chose, mettre en pratique les maths derriere, c'est autre chose. Heureusement l'un de mes patrons est une brutasse là dedans et m'a sorti en 4 jours un pseudo-code de ce papier.
Reste l'analyse des papiers sortis après celui là : le dual scattering (on prend en compte le fait que la lumiere qui sort d'un poil va contribuer à éclairer son voisin) et autres "spherical harmonics" très recentes (2007 -plus théorie que pratique- et 2008 - utilisables).
Etape 3, traduire les maths en language compréhensible par le moteur de rendu, et en utilisant les données fournies par le soft de 3d...
Et c'est moi ou ces maths sont pas super compliqués? genre largement du niveau d'un 1ere S ?
les maths sont pas extremement complexes, mais si tu mates les pdf y a des tas de parametres à prendre en compte, des cas particuliers,.. dont je parle pas dans l'article (le but n'étant pas d'expliquer comment coder spécifiquement ce shader, mais plutot de comprendre comment on en developpe un).
pour info le R et le TT fonctionnent, me reste le TRT..
ce sont des papiers "computer science", hein, pas maths purs. Ceci dit si en première S effectivement on a appris pas mal des outils de base, la modélisation, la dérivation et l'intégration pour en faire un programme ne sont pas forcément super facile pour un élève de première (sans qu'on lui mâche une grosse partie du travail, genre lui donner la formule finale pour qu'il la programme et qu'il puisse écrire son TIPE).
pps: sinon la formule de Descartes (ou Snell si tu es anglo saxon) est applicable pour tout phénomène ondulatoire (y compris les vagues sur l'eau !) donc c'est normal que tu la retrouves pour les fibres optiques ou les cheveux ou la diffusion des ondes sismiques. Snell-Descartes permet de retrouver l'angle mais pour l'intensité il faut faire appel à Fresnel :
Fresnel et Descartes
J'ai lu que cette technique était déjà employée pour le temps réel, est-il envisageable de l'appliquer dès à présent à l'intégralité d'une scène de jeu vidéo, ou c'est trop demander à une bécane lambda ?
pour le principe du truc, j'y reviendrais suremment dans quelques billets