88
edits
No edit summary |
No edit summary |
||
Line 3: | Line 3: | ||
[http://en.wikipedia.org/wiki/Rembrandt Rembrandt] était un peintre hollandais du XVIIème siècle, maître incontesté du [http://en.wikipedia.org/wiki/Chiaroscuro "clair-obscur"]. | [http://en.wikipedia.org/wiki/Rembrandt Rembrandt] était un peintre hollandais du XVIIème siècle, maître incontesté du [http://en.wikipedia.org/wiki/Chiaroscuro "clair-obscur"]. | ||
Ce projet a pour but de changer la manière de rendre les | Ce projet a pour but de changer la manière de rendre les lumières et les [[Shadows|ombres]] qu'utilise [[FlightGear]], et d'essayer d'imiter le style de Rembrandt dans FG. | ||
== De quoi s'agit-il ? == | == De quoi s'agit-il ? == | ||
L'idée maîtresse du projet est d'implémenter le [http://en.wikipedia.org/wiki/Deferred_shading rendu différé] au sein de FlightGear. | L'idée maîtresse du projet est d'implémenter le [http://en.wikipedia.org/wiki/Deferred_shading rendu différé] au sein de FlightGear. | ||
Depuis le début, FlightGear utilise un moteur de rendu | Depuis le début, FlightGear utilise un moteur de rendu avancé, qui affiche toutes les propriétés d'un objet en une fois (ombre, éclairage, brouillard, ...), ce qui rend difficile le rendu d'un ombrage plus sophistiqué (voir le [[FlightGear Newsletter December 2011#Shaders|'Uber-shader']]) du fait que tous les paramètres de [http://www.wired.com/magazine/2010/07/st_equation_3danimation/ l'équation lumineuse] doivent être traités en une seule fois. | ||
[[Image:project_rembrandt_1.png|thumb|300px|Vue principale avec le contenu des buffers affichés dans les coins]] | [[Image:project_rembrandt_1.png|thumb|300px|Vue principale avec le contenu des buffers affichés dans les coins]] | ||
Au contraire, le rendu différé cherche à séparer les opérations en étapes simplifiées et à collecter les résultats intermédiaires dans des buffers cachés, qui peuvent être utilisés par la prochain étape. | Au contraire, le rendu différé cherche à séparer les opérations en étapes simplifiées, et à collecter les résultats intermédiaires dans des buffers cachés, qui peuvent être utilisés par la prochain étape. | ||
;Le premier stade est celui de la Géométrie: | ;Le premier stade est celui de la Géométrie: | ||
: nous rendons la scène entière dans 4 textures, en utilisant le rendu multi-cibles pour les traiter en un seul passage: un pour le buffer de profondeur, un pour les | : nous rendons la scène entière dans 4 textures, en utilisant le rendu multi-cibles pour les traiter en un seul passage: un pour le buffer de profondeur, un pour les normals (en bas à gauche de l'image), un pour les couleurs "diffuses" (en bas à gauche) et un pour les couleurs "spéculaires" (en haut à droite). | ||
;Le stade suivant est celui de l'ombre : | ;Le stade suivant est celui de l'ombre : | ||
: nous rendons encore la scène dans une texture profondeur concernant les éclairages. Il y aura une texture pour chaque lumière diffusant des ombres. | : nous rendons encore la scène dans une texture profondeur concernant les éclairages. Il y aura une texture pour chaque lumière diffusant des ombres. | ||
;Ensuite, c'est le stade de | ;Ensuite, c'est le stade de la lumière, avec plusieurs sous-stades : | ||
:*<u>Sky pass</u>: Le ciel est dessiné d'abord selon la méthode classique. | :*<u>Sky pass</u>: Le ciel est dessiné d'abord selon la méthode classique. | ||
:*<u>Ambient pass</u>: la mémoire-tampon "diffuse" est | :*<u>Ambient pass</u>: la mémoire-tampon "diffuse" est modulée avec la couleur ambiante de la scène, et est dessinée comme un quad texturé aligné sur l'écran | ||
:*<u>Sunlight pass</u>: Un second quad aligné à l'écran est dessiné et un shader examine la position pour calculer sa couleur "diffuse" et "specular" en utilisant le "normal" stocké dans le premier stade. La couleur résultante et mélangée avec la passe précédente. Les ombres sont examinées ici par comparaison de la position du pixel avec la position du cache lumière stockée dans la carte shadows | :*<u>Sunlight pass</u>: Un second quad aligné à l'écran est dessiné et un shader examine la position pour calculer sa couleur "diffuse" et "specular" en utilisant le "normal" stocké dans le premier stade. La couleur résultante et mélangée avec la passe précédente. Les ombres sont examinées ici par comparaison de la position du pixel avec la position du cache lumière stockée dans la carte shadows | ||
:*<u>Fog pass</u>: un nouvel écran quad est dessiné et la position du pixel est calculée pour évaluer la quantité de brouillard du pixel. La couleur du brouillard est mélangée avec le résultat de la phase précédente | |||
:*<u>stade de la lumière additionnelle</u>: le scene graph sera traversé une autre fois pour afficher les volumes de lumière (cône ou tronc de cône pour les taches de lumière, sphère pour les lumières omni directionnelles), et leur shader ajoutera la lumière composée uniquement par les pixels éclairés. | :*<u>stade de la lumière additionnelle</u>: le scene graph sera traversé une autre fois pour afficher les volumes de lumière (cône ou tronc de cône pour les taches de lumière, sphère pour les lumières omni directionnelles), et leur shader ajoutera la lumière composée uniquement par les pixels éclairés. | ||
:*<u>stade brouillard</u>: un nouveau quad aligné sur l'écran est dessiné, et la position du pixel est calculée pour évaluer la quantité de brouillard du pixel. La couleur du brouillard est mélangée avec le résultat du stade précédent. | :*<u>stade brouillard</u>: un nouveau quad aligné sur l'écran est dessiné, et la position du pixel est calculée pour évaluer la quantité de brouillard du pixel. La couleur du brouillard est mélangée avec le résultat du stade précédent. | ||
Line 36: | Line 34: | ||
Dans FG, on termine le pipeline du rendu par l'affichage du [[Menubar|GUI]] et du [[HUD]]. | Dans FG, on termine le pipeline du rendu par l'affichage du [[Menubar|GUI]] et du [[HUD]]. | ||
Tous ces phases sont plus précisément décrites dans [http://bat710.univ-lyon1.fr/~jciehl/Public/educ/GAMA/2007/Deferred_Shading_Tutorial_SBGAMES2005.pdf tutorial] c'est la base du code actuel, avec | Tous ces phases sont plus précisément décrites dans [http://bat710.univ-lyon1.fr/~jciehl/Public/educ/GAMA/2007/Deferred_Shading_Tutorial_SBGAMES2005.pdf tutorial] c'est la base du code actuel, avec quelques ajouts ou modifications. | ||
== Avertissements == | == Avertissements == | ||
Le rendu différé n'affiche pas la transparence. Pour le moment, les nuages doivent être éclairés et ombrés par eux-mêmes. Les surfaces transparentes sont alpha-testées et non mélangées. Elles doivent être amenées dans leur propre | Le rendu différé n'affiche pas la transparence. Pour le moment, les nuages doivent être éclairés et ombrés par eux-mêmes. Les surfaces transparentes sont alpha-testées et non mélangées. Elles doivent être amenées dans leur propre bac sur l'image composite. | ||
La partition profondeur ne marche pas non plus, à cause de la mémoire tampon profondeur, qui doit être gardée pour retenir la position de zone de vue, et, pour le moment, z-fighting est tout à fait visible. La partition profondeur sans rangée de profondeur superposée pourrait être la solution, et devrait être essayée. | La partition profondeur ne marche pas non plus, à cause de la mémoire tampon profondeur, qui doit être gardée pour retenir la position de zone de vue, et, pour le moment, z-fighting est tout à fait visible. La partition profondeur sans rangée de profondeur superposée pourrait être la solution, et devrait être essayée. | ||
Line 52: | Line 50: | ||
=== Rendu des surfaces transparentes === | === Rendu des surfaces transparentes === | ||
[[Image:project_rembrandt_5.png|thumb|300px|Surfaces transparentes desssinées d'après des objets opaques]] | [[Image:project_rembrandt_5.png|thumb|300px|Surfaces transparentes desssinées d'après des objets opaques]] | ||
Les surfaces transparentes sont détectées par les plugins OSG loader | Les surfaces transparentes sont détectées par les plugins OSG loader et reçoivent des suggestions de rendu TRANSPARENT_BIN | ||
Au stade collection, le collecteur commande les surfaces transparentes dans le le bac transparent. Dans un retour, attaché à la caméra Géometry, après la traversée scénographe, les bacs transparent sont enlevés de la phase rendu et sauvegardés dans un espace temporaire. Dans un retour attaché la caméra Éclairage, après la traversée sceneraph, les bacs transparents sauvegardent au prochain stade, sont ajoutés au stade rendu de la caméra éclairageavec un numéro d'ordre. Ainsi, les surfaces transparentes sont dessinées au sommet de la scene éclairée à partir de G-buffer . | |||
=== Consommation de mémoire === | === Consommation de mémoire === | ||
Line 59: | Line 57: | ||
* G-tampon et tampon lumière: 20 bytes par pixel. Pour un écran HD (1920x1080) la mémoire requise est de 40 Mb | * G-tampon et tampon lumière: 20 bytes par pixel. Pour un écran HD (1920x1080) la mémoire requise est de 40 Mb | ||
* Carte d'ombre 3 x taille_carte_ombre x shadow_map_size bytes (si la taille est 8192, la taille totale de la mémoire est 192 Mb | * Carte d'ombre 3 x taille_carte_ombre x shadow_map_size bytes (si la taille est 8192, la taille totale de la mémoire est 192 Mb | ||
Ne pas compter les textures, liste d'affichage ou tampons vertex pour | Ne pas compter les textures, liste d'affichage ou tampons vertex pour modèles et terrains | ||
3 écrans HD ont besoin de 120 Mb de mémoire pour les tampons (ombre exclue), il vous faut 3x8192x8192x3 = 576 Mb (megabytes) de mémoire pour les seuls shadows. | 3 écrans HD ont besoin de 120 Mb de mémoire pour les tampons (ombre exclue), il vous faut 3x8192x8192x3 = 576 Mb (megabytes) de mémoire pour les seuls shadows. | ||
Line 69: | Line 67: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Et mettez 4096 ou 2048 à la place. | Et mettez 4096 ou 2048 à la place.Vous pouvez aussi utiliser un paramètre de démarrage: --prop:/sim/rendering/shadows/map-size=2048 | ||
Vous pouvez aussi utiliser un paramètre de démarrage: --prop:/sim/rendering/shadows/map-size=2048 | |||
=== Pipeline configurable === | === Pipeline configurable === | ||
Line 97: | Line 94: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== Tampons ==== | ==== Tampons (Buffers)==== | ||
Un tampon est une texture utilisée comme zone de stockage dans le GPU. Sa taille est habituellement un multiple de la taille de l'écran, mais une taille fixe est prise en charge ( typique pour la carte d'ombres). La description d'un tampon suit : | Un tampon est une texture utilisée comme zone de stockage dans le GPU. Sa taille est habituellement un multiple de la taille de l'écran, mais une taille fixe est prise en charge ( typique pour la carte d'ombres). La description d'un tampon suit : | ||
Line 127: | Line 124: | ||
|- | |- | ||
|geometry | |geometry | ||
|La phase geometry initialise la plupart des tampons et agit sur les objets réels et la géométrie. Les objets transparents sont placés à côté, et seront utilisés tels quels dans la phase lumière. Le | |La phase geometry initialise la plupart des tampons et agit sur les objets réels et la géométrie. Les objets transparents sont placés à côté, et seront utilisés tels quels dans la phase lumière. Le reste de la géométrie opaque est rendu avec les effets standard, permettant de mettre la donnée sensible dans les tampons. | ||
|- | |- | ||
|ombre | |ombre | ||
Line 394: | Line 391: | ||
==== Usage ==== | ==== Usage ==== | ||
Pour les shaders material, il faut fournir à la fois <tt>gbuffer-functions.frag</tt> et <tt>gbuffer-encode.frag</tt> dans le fichier effet, comme suit : | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
Line 405: | Line 402: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Pour les shaders fullscreen passes, on doit fournir seulement <tt>gbuffer-functions.frag</tt>, comme ceci : | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
Line 415: | Line 412: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Dans la principale fonction du shader, les fonctions référencées doivent être écrites en premier. Avec no #include files, le prototype de la fonction entière nécessite d'être typé : | |||
<syntaxhighlight lang="glsl"> | <syntaxhighlight lang="glsl"> | ||
void encode_gbuffer(vec3 normal, vec3 color, int mId, float specular, float shininess, float emission, float depth); | void encode_gbuffer(vec3 normal, vec3 color, int mId, float specular, float shininess, float emission, float depth); | ||
main() { | main() { | ||
vec3 normal; | vec3 normal; | ||
Line 434: | Line 430: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Geometry | === Phase Geometry === | ||
La phase Geometry est là pour remplir le G-tampon. '''L'ombrage n'intervient pas à cette phase, et le calcul lumière ou brouillard ne doit pas faire partie du shader '''. L'opération requise dans le fragment Shader est de remplir avec une valeur sensible chaque tampon individuel : | |||
{| class="wikitable" style="text-align: center;" | {| class="wikitable" style="text-align: center;" | ||
| | |pràfondeur (gl_FragDepth)||GL_DEPTH_COMPONENT32||colspan="4"|Fragment profondeur | ||
|- | |- | ||
|gl_FragData[0]||GL_RG16||colspan="2"|normal.x * 0.5 + 0.5||colspan="2"|normal.y * 0.5 + 0.5 | |gl_FragData[0]||GL_RG16||colspan="2"|normal.x * 0.5 + 0.5||colspan="2"|normal.y * 0.5 + 0.5 | ||
Line 447: | Line 443: | ||
|} | |} | ||
Ceci est la couche par défaut attendue par le shader . material Id peut être utilisé pour détecter une couche différente | |||
=== Pass lumière additionnelle === | |||
Il y aura là un seul shader pour chaque type de lumière utilisé. L'objectif est de créer des lumières comme animations dans le fichier model XML. Le shader lumière retrouvera la scène geometry en combinant la position espace écran en vue de rayon espace par l'inversion de la matrix projection (une fonction plus secourable sera fournie), et le fragment profondeur à cette position écran lit à partir du tampon profondeur. Avec l'aide du fragment normal, la couleur diffuse et specular et les propriétés de la lumière que le shader introduit, il sera possible d'ajouter au tampon lumière l'apport du rendu lumière. | |||
===Pass brouillard=== | |||
En utilisant le fragment profondeur, il sera possible de calculer une distribution brouillard. Pour le moment, il n'y a que l'équation simple brouillard. | |||
=== | ===Pass fleur=== | ||
C'est un effet double pass qui rend flou le tampon lumière dans une petite texture. Cette texture est ensuite ajoutée au tampon lumière lors de la phase affichage. | |||
=== | === Effets requis === | ||
Plusieurs pass sont mis en œuvre pour l'utilisation du système effet. Dans ce but , des effets sont référencés dans le code core utilisant des noms réservés. Ces effets sont: | |||
{| class="wikitable" cellpadding="3" | {| class="wikitable" cellpadding="3" | ||
! | !Nom | ||
! | !Type | ||
! | !But | ||
|- | |- | ||
|<tt>Effects/ssao</tt> | |<tt>Effects/ssao</tt> | ||
| | |Agit sur un quad plein écran | ||
| | |Calcule l'occlusion ambiante à partir du tampon normal et du tampon profondeur | ||
|- | |- | ||
|<tt>Effects/ambient</tt> | |<tt>Effects/ambient</tt> | ||
| | |Agit sur un quad plein écran | ||
| | |Copie le tampon couleur diffuse multiplié par la lumière ambiante au tampon éclairage. L'occlusion ambiante peut aussi affecter la lumière ambiante . | ||
|- | |- | ||
|<tt>Effects/light-spot</tt> | |<tt>Effects/light-spot</tt> | ||
| | |Agit sur la géométrie réeelle du volume de la lumière | ||
| | |Calcule la contribution lumière d'un point lumineux défini dans une animation <tt>light</tt>ayant un <tt>light-type</tt> de '''<tt>spot</tt>''' | ||
|- | |- | ||
|<tt>Effects/fog</tt> | |<tt>Effects/fog</tt> | ||
| | |Agit sur un quad de plein écran | ||
| | |Calcule le brouillard à partir du C-buffer et les paramètres de l'éclairage | ||
|- | |- | ||
|<tt>Effects/display</tt> | |<tt>Effects/display</tt> | ||
| | |Agit sur un quad de plein écran | ||
| | |Rends l'image finale composite à partir du G-buffer et du buffer éclairage | ||
|} | |} | ||
== | == Lignes-guide pour modeleurs == | ||
=== | === Portage d'avion === | ||
* Rembrandt | * Rembrandt calcule les ombres => plus de fausses ombres dans le modèle | ||
* Rembrandt | * Rembrandt calcule l'occlusion ambiante => pas d'occlusion ambiante incluse dans les textures | ||
* Rembrandt | * Rembrandt est en lumière => les cartes lumière static ne sont pas nécéssaires, la couleur émissive pour voir les modèles n'est pas nécessaire, et pourrait interférer | ||
* Rembrandt | * Rembrandt est brillant => les couleurs émissives incorrectement utilisées peuvent rendre flou, et rendre du texte illisible. L'intensité de la lumière devra être réglée | ||
* Rembrandt | * Rembrandt a des besoins précis avec les shaders => les shaders nécessitent un ajustement pour se conformer au nouveau cadre, sinon la vue sera faussée | ||
* Rembrandt | * Rembrandt ne peut faire des surfaces transparentes => les surfaces transparentes doivent être dûment enregistrées pour les atteindre avec le chemin classique | ||
=== | === Enregistrement de toutes les surfaces translucides === | ||
Chaque modèle est par défaut rendu en utilisant l'effet <tt>Effects/model-default</tt>. Cet effet initialise le G-buffer, en ignorant les surfaces transparentes, en mettant alpha test et rendu de toute la geometrie dans la poubelle. Il n'est pas possible de rediriger le rendu vers les bacs transparents lorsque la texture associée a un canal alpha car la plupart des modeles emploient un atlas simple texture et même les parties opaques sont rendues avec texture avec alpha canal. | |||
Si un modèle nécessite des surfaces translucides ou transparentes , these surface objects need to be assigned a different effect that sets explicitly the render bin to "DepthSortedBin", or sets the rendering hint to "transparent". This tells the renderer to render this object using forward rendering, so lighting and fog need to be enabled, and if a shader program is used, they should be computed in the classical way. The <tt>Effects/model-transparent</tt> can be used to register simple transparent/translucent surfaces. You assign this effect to an object (or multiple objects) like: | |||
<effect> | <effect> | ||
<inherits-from>Effects/model-transparent</inherits-from> | <inherits-from>Effects/model-transparent</inherits-from> |
edits