88
edits
No edit summary |
No edit summary |
||
Line 275: | Line 275: | ||
|} | |} | ||
== Lignes directrices pour les | == Lignes directrices pour les écritures shader == | ||
=== Uniformes prédéfinis === | === Uniformes prédéfinis === | ||
Ces uniformes glsl n'ont pas besoin d'être déclarés dans le fichier effet | Ces uniformes glsl n'ont pas besoin d'être déclarés dans le fichier effet | ||
{| class="wikitable" | {| class="wikitable" | ||
! | !Nom | ||
!Type | !Type | ||
! | !Objectif | ||
|- | |- | ||
|<tt>fg_ViewMatrix</tt> | |<tt>fg_ViewMatrix</tt> | ||
Line 431: | Line 431: | ||
=== Phase Geometry === | === Phase Geometry === | ||
La phase Geometry est là pour remplir | 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;" | ||
Line 497: | Line 497: | ||
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. | 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 , | Si un modèle nécessite des surfaces translucides ou transparentes , ces objets surface doivent être assignés à un effet différent qui place explicitement le bac rendu à "DepthSortedBin", ou met la suggestion rendu à "transparent". Ceci dit au moteur de rendu de rendre cet objet opérant avant le rendu, ainsi, la clarté et le brouillard doivent être activés, et si un programme shader est utilisé, et s'ils ont été calculés en manière classique. Le <tt>Effects/model-transparent</tt> peut être utilisé pour enregistrer simlement les surfaces transparentes/translucides. Vous attribuez cet effet à un objet (ou à de multiples objets) comme: | ||
<effect> | <effect> | ||
<inherits-from>Effects/model-transparent</inherits-from> | <inherits-from>Effects/model-transparent</inherits-from> | ||
Line 503: | Line 503: | ||
</effect> | </effect> | ||
'''Attention: <Effect> agit seulement sur les objets réels, pas sur des groupes d'objets ou des animations.''' | |||
Si la surface opaque a besoin d'un effet spécial, par exemple appliquer un "bump mapping" (effet de relief sur des textures) cet effet devra utiliser le bac "RenderBin", ou le rendu suggéré met à "opaque", et le G-buffer a besoin d'être initialisé correctement dans la phase Geometry. | |||
=== Soyez sûr que toute la Geometry distribuera l'ombre === | |||
Pour limiter la quantité de rendu geometry dans la carte shadow, et aussi pour réduire les artefacts (acnée shadow), seulement les faces ne regardant pas le soleil distribuent les ombres. Le test est effectué en utilisant l'orientation normale. Cela veut dire que les polygones à double côté, ou mesh non fermés, seront transparents à la lumière sous certains angles de soleil. Pour éviter ça, les modeleurs peuvent: | |||
*s'assurer que l'objet est toujours dans l'ombre d'autres objets, | |||
*fermer leur mesh, ou | |||
*doubler les polygones avec l'endroit normal à l'opposé | |||
=== Ajouts de lumière à un modèle=== | |||
Deux points sont à considérer: l'apparence de la sourceet la zone illuminée. Pour l'apparence de la source lumière, (ce que vous voyez quand vous regardez le bulbe) vous avez besoin d'un modèle avec un emissive material qui produira l'effet brillant et ceci est visible de nuit. | |||
==== | Pour l'effet de la source dans son environnement (l'aire lumineuse), nous devons avoir dans le modèle 3D (le fichier .ac) un volume qui inclut l'effet (Volume Lumière). Cela peut être un grand cône pour les aires lumineuses ou une spère pour une lumière ponctuelle. Il est important que le volume lumière soit fermé, convexe et les normals orientés vers l'extérieur. | ||
Le volume lumière doit être partie de la geometry du modèle et être référencé dans le fichier animation. Pas besoin d'ajouter une couleur ou un effet à ce volume. Le calcul lumière est seulement fait sur les fragments couverts par le volume lumière, mais n'a aucune influence sur la couleur ou l'atténuation de la lumière . | |||
Toutes les animations disponibles sont possibles sur le volume lumière sauf '''material''' et '''texture'''. Il n'est pas possible de changer couleur et lumières, pour le moment; sauf en se branchant sur une autre animation. L'axe et la position sont dans l'espace objet et sont transformés par les animations qui suivent. | |||
==== Taches lumineuses ==== | |||
{|cellpadding=10| | {|cellpadding=10| | ||
|valign=top| | |valign=top| | ||
Line 577: | Line 586: | ||
|valign=top| | |valign=top| | ||
{| class="wikitable" cellpadding="3" | {| class="wikitable" cellpadding="3" | ||
! | !Nom | ||
! | !Objectif | ||
|- | |- | ||
|<tt>type</tt> | |<tt>type</tt> | ||
| | |Installe l'animation <tt>'''light'''</tt> | ||
|- | |- | ||
|<tt>light-type</tt> | |<tt>light-type</tt> | ||
| | |C'est une lumière <tt>'''spot'''</tt> | ||
|- | |- | ||
|<tt>name</tt> | |<tt>name</tt> | ||
| | |Nom donné à cette animation | ||
|- | |- | ||
|<tt>object-name</tt> | |<tt>object-name</tt> | ||
| | |Nom du volume lumière dans le modèle 3D (typiquement un cône avec un sommet à <tt>position</tt>, le long de l'axe <tt>direction</tt> si <tt>cutoff</tt> est inférieur à 90 degrés, ou une sphère centrée à <tt>position</tt> si <tt>cutoff</tt> est supérieur à 90 degrés ) | ||
|- | |- | ||
|<tt>nopreview</tt> | |<tt>nopreview</tt> | ||
| | |Cache le volume lumière dans fgrun 3d preview | ||
|- | |- | ||
|<tt>position</tt> | |<tt>position</tt> | ||
| | |Dans espace objet, position de la lumière | ||
|- | |- | ||
|<tt>direction</tt> | |<tt>direction</tt> | ||
| | |Dans espace objet, direction vers le centre de la tache | ||
|- | |- | ||
|<tt>ambient</tt> | |<tt>ambient</tt> | ||
| | |Couleur ambiante de la lumière | ||
|- | |- | ||
|<tt>diffuse</tt> | |<tt>diffuse</tt> | ||
| | |Couleur diffuse de la lumière | ||
|- | |- | ||
|<tt>specular</tt> | |<tt>specular</tt> | ||
| | |Couleur specular de la lumière | ||
|- | |- | ||
|<tt>dim-factor</tt> | |<tt>dim-factor</tt> | ||
| | |Groupe de paramètres pour contrôler un facteur appliqué en même temps à ambient, diffuse et specular | ||
|- | |- | ||
|<tt>attenuation</tt> | |<tt>attenuation</tt> | ||
| | |Trois element vector. <c> element est le facteur constant, <l> element est le facteur linéaire et <q> element est le facteur quadratique.<br /> | ||
Attenuation | Attenuation de couleur à distance d est [[File:Spotlight_attenuation.png]] | ||
|- | |- | ||
|<tt>exponent</tt> | |<tt>exponent</tt> | ||
|Attenuation is | |Attenuation is multiplié par <tt>pow( dot( lightDir, <direction> ), <exponent> )</tt>, lightDir étant vector from light position to point, in camera space. | ||
|- | |- | ||
|<tt>cutoff</tt> | |<tt>cutoff</tt> | ||
|Point is lit by this source if <tt>dot( lightDir, <direction> ) > <cutoff></tt> , lightDir being | |Point is lit by this source if <tt>dot( lightDir, <direction> ) > <cutoff></tt> , lightDir being vecteur à partir de la position lumière vers le point, dans l'espace caméra. | ||
|- | |- | ||
|<tt>near-m</tt> | |<tt>near-m</tt> | ||
| | |Distance minimum d'influence, à partir de la position, en mètres | ||
|- | |- | ||
|<tt>far-m</tt> | |<tt>far-m</tt> | ||
| | |Distance maximum d'influence, à partir de la position, en mètres | ||
|} | |} | ||
|} | |} | ||
==== | ==== Points lumineux ==== | ||
{|cellpadding=10| | {|cellpadding=10| | ||
|valign=top| | |valign=top| | ||
Line 686: | Line 695: | ||
|valign=top| | |valign=top| | ||
{| class="wikitable" cellpadding="3" | {| class="wikitable" cellpadding="3" | ||
! | !Nom | ||
! | !Objectif | ||
|- | |- | ||
|<tt>type</tt> | |<tt>type</tt> | ||
| | |Installe l'animation <tt>'''light'''</tt> | ||
|- | |- | ||
|<tt>light-type</tt> | |<tt>light-type</tt> | ||
| | |C'est une lumière <tt>'''point'''</tt> | ||
|- | |- | ||
|<tt>name</tt> | |<tt>name</tt> | ||
| | |Nom donné à cette animation | ||
|- | |- | ||
|<tt>object-name</tt> | |<tt>object-name</tt> | ||
| | |Nom du volume lumière dans le modèle 3D ( typiquement une sphère centrée sur <tt>position</tt>, avec un rayon de <tt>far-m</tt>) | ||
|- | |- | ||
|<tt>nopreview</tt> | |<tt>nopreview</tt> | ||
| | |Volume lumière cachée dans fgrun 3d preview | ||
|- | |- | ||
|<tt>position</tt> | |<tt>position</tt> | ||
| | |Dans espace object , position de la lumière | ||
|- | |- | ||
|<tt>ambient</tt> | |<tt>ambient</tt> | ||
| | |Couleur ambiante de la lumière | ||
|- | |- | ||
|<tt>diffuse</tt> | |<tt>diffuse</tt> | ||
| | |Couleur diffuse de la lumière | ||
|- | |- | ||
|<tt>specular</tt> | |<tt>specular</tt> | ||
| | |Couleur specular de la lumièret | ||
|- | |- | ||
|<tt>dim-factor</tt> | |<tt>dim-factor</tt> | ||
| | |Groupe de paramètres pour contrôler un facteur appliqué à ambient, diffuse et specular en même temps | ||
|- | |- | ||
|<tt>attenuation</tt> | |<tt>attenuation</tt> | ||
| | |Trois element vector. <c> element est le facteur constant <l> element est le facteur linéaire et <q> element est le facteur quadratiquer.<br /> | ||
Attenuation | Attenuation de couleur à distance d est [[File:Spotlight_attenuation.png]] | ||
|- | |- | ||
|<tt>near-m</tt> | |<tt>near-m</tt> | ||
| | |Distance minimum d'influence, à partir de la position, en mètres | ||
|- | |- | ||
|<tt>far-m</tt> | |<tt>far-m</tt> | ||
| | |Distance maximum d'influence, à partir de la position, en mètres | ||
|} | |} | ||
|} | |} | ||
== TODO | ==== Considérations de performance et de compatibilité ==== | ||
Chaque lumière sur écran équivaut, pour le GPU à redessiner le volume lumière avec un shader, sans recueillir de buffer. Ainsi, chaque lumière vient avec un coût, ce qui est minime individuellement parlant, mais non négligeable quand jl y en a beaucoup. Ce coût augmente avec la taille du volume lumière | |||
De plus, il est raisonnable de permettre à un modèle de fonctionner avec le moteur de rendu classique qui ne sait rien des lumières et rendrait les volumes lumière comme une autre géométrie. Ainsi, c'est une bonne pratique de compléter chaque animation lumière par une animation sélective vérifiant : | |||
*si Rembrandt est activé | |||
*si le mode de qualité choisi correspond avec les possibilités de la lumière | |||
*si la lumi§re doit être on ou off selon les autres paramètres de la simulation (position du soleil; position de du commutateur, présence de puissance...) | |||
Une bonne propriété est de crèer un reflet des préférences de l'utilisateur sur qualité vs performance concernant les lumières, et un curseur dédié est ajouté dans le dialogue shader. | |||
[[File:Fgfs-shaders-with-light.jpg|thumb|Light quality slider]] | |||
La propriété à utiliser est: | |||
/sim/rendering/shaders/lights | |||
Le curseur qualité va de 0 (pas de lumière) à 4 (pleine lumière). Un simple réverbère d'aéroport apparaît à 1. Quelques lampes de pont à 2. Toutes les lampes de pont simples à 3, et les plus sophistiquées à 4 | |||
Exemple: | |||
<syntaxhighlight lang="xml"> | |||
<animation> | |||
<type>light</type> | |||
<light-type>spot</light-type> | |||
<name>LightSource</name> | |||
<object-name>LightVolume</object-name> | |||
... | |||
</animation> | |||
<animation> | |||
<type>select</type> | |||
<!-- Select the named animation --> | |||
<object-name>LightSource</object-name> | |||
<condition> | |||
<and> | |||
<!-- Rembrandt enabled ? --> | |||
<property>/sim/rendering/rembrandt/enabled</property> | |||
<!-- Quality ok ? --> | |||
<greater-than> | |||
<property>/sim/rendering/shaders/lights</property> | |||
<value>3.0</value> | |||
</greater-than> | |||
<!-- Simulation conditions ? --> | |||
<greater-than> | |||
<property>/sim/time/sun-angle-rad</property> | |||
<value>1.57</value> | |||
</greater-than> | |||
</and> | |||
</condition> | |||
</animation> | |||
</syntaxhighlight> | |||
=== Tutoriels === | |||
[[User:F-JJTH|F-JJTH]] a compilé son expérience et celle de l'équipe de la PAF d'amélioration d'avions dans {{fr}} [http://equipe-flightgear.forumactif.com/t1034-howto-adapter-un-appareil-pour-rembrandt this tutorial]. | |||
== TODO Liste == | |||
=== | === Tâches à compléter === | ||
* | *Fixer le rendu shadow quand on emploie plusieurs liens en OSG | ||
* | *Implementer Cascaded Shadow Map (a besoin d'être optimisée - frustum calculation et nuit) | ||
* | *Voir ce qui arrive avec brillance dans le brouillard: une sorte de terrain inconnu crée des patches blancs dans le buffer emission-problème de génération de scène | ||
*Test multi-écran (mostly done) | |||
*Test multi- | *Restorer splashscreen | ||
* | *Dessiner des objets transparents avec rendu en premier (peut nécessiter la capture du bac transparence à partir de la phase géométrie et le placer dans la phase affichage) (OK - nécessite une contribution modèle) | ||
* | *Trouver une solution pour couleur ambient et emissive de material (peut nécessiter un buffer additionnel) | ||
* | *Fournir un shader pour objets transparents qui puisse rendre le buffer emissive infaisable (en utilisant MRT) La phase lumière ne peut utiliser MRT | ||
*Utiliser un buffer stencil pour limiter la taille lumière (non fait dans shader lumière) | |||
* | **nécessaire pour la lumière de cockpit pour réaliser des faux shadowws et éviter d'éclairer le runway de la cabine | ||
* | *Utiliser un système effet à la place des shaders lourdement codés | ||
** | *Intensités globales de brillance, ou occlusion ambiante via curseur dans le dialogue rendu | ||
* | |||
* | |||
=== | === Tâches à court terme === | ||
* | *Convertir les shaders existants en rendu différé | ||
* | *Éviter de redessiner les objets opaques dans la phase lumière. Améliorer le masque node OSG . | ||
* | *S'occuper des particules et précipitations | ||
* | *Fixer le brouillard sur les nuages | ||
* | *Fixer les matrices shadow dans multi-screen | ||
* | *IMettre en œuvre un lightfield shader | ||
=== | === Idées à long terme (non classées) === | ||
*implement strength of glow (in the emissive buffer alpha channel) | *implement strength of glow (in the emissive buffer alpha channel) | ||
**provide levels 0 to 5 - we are currently at level 5 | **provide levels 0 to 5 - we are currently at level 5 | ||
Line 772: | Line 825: | ||
*Implement quality vs performance user control | *Implement quality vs performance user control | ||
== | == Gallerie == | ||
{{#ev:youtube|PXHhtQb5yzc}} {{#ev:youtube|peEzEapavkg}} {{#ev:youtube|RIetPh8iJXk}} {{#ev:youtube|oaNFrxgQY1c}} {{#ev:youtube|8xGzy12hlis}} {{#ev:youtube|ZyuHBlm3xXU}} {{#ev:youtube|RgH9GZRukOI}} {{#ev:youtube|UQvbHnBkpaM}} {{#ev:youtube|v02phoOqWHE}}{{#ev:youtube|dlSo4sBa7Nk}} | {{#ev:youtube|PXHhtQb5yzc}} {{#ev:youtube|peEzEapavkg}} {{#ev:youtube|RIetPh8iJXk}} {{#ev:youtube|oaNFrxgQY1c}} {{#ev:youtube|8xGzy12hlis}} {{#ev:youtube|ZyuHBlm3xXU}} {{#ev:youtube|RgH9GZRukOI}} {{#ev:youtube|UQvbHnBkpaM}} {{#ev:youtube|v02phoOqWHE}}{{#ev:youtube|dlSo4sBa7Nk}} | ||
== | == Appendice == | ||
{{Appendix|all| | {{Appendix|all| | ||
* {{cite web |url=http://http.download.nvidia.com/developer/presentations/2004/6800_Leagues/6800_Leagues_Deferred_Shading.pdf |title=Deferred Shading |author=Shawn Hargreaves and Mark Harris }} | * {{cite web |url=http://http.download.nvidia.com/developer/presentations/2004/6800_Leagues/6800_Leagues_Deferred_Shading.pdf |title=Deferred Shading |author=Shawn Hargreaves and Mark Harris }} |
edits