45Fermer47
bearbecueLe 10/04/2012 à 23:32
1- bah, c'est un peu space la formule la grin
la lumiere ambiante, c'est comme une autre lumiere, sauf qu'elle s'applique partout. mais ca reste une lumiere.
un objet noir pur, meme avec un ambient de dingue, restera quand meme totalement noir (exception faite du speculaire)
la lumiere ambiante, comme n'importe quelle autre lumiere qui eclaire la surface, est reflechie par le materiau jusqu'a la camera, donc il faut prendre en compte la diffuse color du materiau.

ca donne:

pixelColor = matDiffuseColor * (lightDiffuseColor + lightAmbientColor) + matSpecColor * lightSpecColor;

typiquement l'ambient light n'a pas de composante speculaire a proprement parler, vu que la composante speculaire classique depend de la direction d'ou vient la lumiere. et la lumiere ambiante vient de "partout".
souvent ce qui se fait c'est d'utiliser de toutes petites cubemaps et de les indexer avec la normale de la surface, pour avoir un ambient pas uniforme (genre plutot bleute vers le haut, et plus sombre vers le bas, pour imiter la lumiere ambiante qui vient du ciel, ou verdatre en bas si ta scene se passe sur un terrain de golf.. enfin.. tu vois l'idee grin le but c'est de faker l'illumination globale de la scene, qui serait trop couteuse a calculer en temps reel. l'ambiant, c'est la lightmap du pauvre, qui est elle meme l'illumination globale du pauvre cheeky)
et du coup tu peux aussi utiliser une cubemap pour le speculaire, qui stocke les spots de lumiere de la scene oui

dans quel cas tu peux integrer ca dans le calcul du spec, de la meme facon que la lumiere incidente:

matSpecColor * (ambientSpecColor + lightSpecColor)


btw, je suis pas sur de ce que c'est "diffusePower" dans ta formule, mais si c'est un parametre du materiau, alors ca peut etre inclus dans "diffuseColor" (et c'est pas la meme chose que "specPower", qui typiquement permet de controller la taille de la tache speculaire, et qui dit, grosso modo, a quel point le materiau est diffus ou reflechissant: plus la specPower est elevee, plus le materiau est reflechissant.

certains modeles d'eclairage utilisent autre chose qu'une specPower (qui s'utilise en tant qu'exposant dans le calcul du spec: x^specPower, _pas_ en le multipliant).
le truc chiant avec la specPower, c'est qu'un materiau parfaitement reflechissant est sense avoir une specPower infinie.
nous par exemple, au taff, dans notre renderer, on utilise un parametre "roughness", qui varie entre 0 et 1.
0 c'est un miroir, 1 c'est une surface parfaitement diffuse sans spec.

bon jvais ptet pas rentrer dans des details genre BRDF (le modele de phong est une approximation basique d'un BRDF), normalisation des approximations de BRDF pour garder un rendu coherent, etc...
... sauf si ca t'interesse grin

2- bah pour les ombres... (classe dessin #triclasse#) pour un exemple aussi simple (grin) tu pourrais faire ca de plein de facon differentes... par contre, des que t'as des cas un peu moins triviaux, genre un vaisseau au milieu (cheeky) qui projette une ombre sur un des murs, le nombre d'options diminue pas mal grin
a un moment la grande mode c'etait les shadow volumes.. c'est ce qui est utilise dans doom3. perso j'ai jamais ete fan... ya trop de cas particuliers, c'est relou a implementer, ca donne des ombres super nettes (et donc moches cheeky), et... bref.. ca pue un peu du zgeg embarrassed
maintenant quasiment tout le monde utilise des shadowmaps (ou des variations).
le principe est assez simple:

- tu fais un rendu depuis la light, comme si c'etait une camera. imagine une spotlight: tu set l'angle d'ouverture du cone de lumiere en tant que fov de la camera, et tu rends ta scene.
- le rendu en question, c'est juste une depth-map: c'est la shadow map.
- apres, pendant la passe de lighting, quand tu vas processer cette spotlight, pour tous les pixels de ta scene qui sont dans le cone d'eclairage de la light, tu vas transformer les coordonnees du pixel avec la "shadow matrix" qui va en fait les transformer en clipspace de la light.
- a partir de la, t'utilise le x,y des coordonnees transformees en tant que coordonnees de textures dans la shadowmap.
- tu recupere la depth dans la shadowmap.
- si le 'z' de la coordonnee du pixel en shadow-space est superieur au z stocke dans la shadow-map, ca veut dire que quelquepart dans la scene, le long du rayon qui va du pixel a la light, il y a un autre objet qui a ecrit un pixel plus proche dans la shadowmap, et donc qui est plus proche de la light ---> ton pixel est dans l'ombre. sinon, il est eclaire.

\o/

apres, pour les pointlights, vu qu'il te faudrait un fov de 360 degres, et que c'est un peu dur, t'as plusieurs options...
les plus populaires, c'est:
- ta shadowmap est une cubemap, tu fais 6 rendus avec un fov de 90 degres, un pour chaque face de la cubemap (tu comprends pourquoi je disais que ca risquait de ramer grin)
- dual-paraboloid maps: tu utilise deux shadowmaps classiques, mais tu change la projection. donc deux rendus au lieu de 6. probleme: les aretes des triangles deviennent courbes, et ca devient dependant de la precision du maillage de ta scene. si t'as de tres gros/longs triangles, ca marche tres tres mal. (il faut en plus faire gaffe aux jonctions entre les deux hemispheres, pour pas avoir de trous, justement a cause des triangles clippes qui ne suivent pas le cercle parfait de la jonction.. mais bon, ya quelques tricks pour contourner ca.. je te laisse googler si ca t'interesse grin)

la ca te donne des ombres de base, tu verra de l'aliasing du a la resolution de la shadowmap (des gros "pixels d'ombre" quoi grin)
apres, t'as genre 3 milliards d'algos pour eliminer ces effets d'escalier et adoucir les ombres, simuler des soft shadows (ombres plus nettes lorsque l'objet qui projette l'ombre est proche de la surface qui recoit l'ombre, et plus "floues" lorsqu'il est eloigne)