269
edits
No edit summary |
|||
(10 intermediate revisions by 3 users not shown) | |||
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 en avant 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. | Depuis le début, FlightGear utilise un moteur de rendu classique, "en avant", 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 | 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 les étapes suivantes. | ||
;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 === | ||
Pour chaque caméra définie du groupe, il y a une carte d'ombre séparée, de telle sorte que l'utilisation de la mémoire vidéo soit: | |||
* G- | * 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 | ||
Ne pas compter les textures, liste d'affichage ou tampons vertex pour modèles et terrains | |||
3 HD | 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. | ||
Si vous voyez des messages d'erreur pendant le démarrage, ou si FlightGear ne démarre pas bien, c'est probablement parceque vous n'avez pas assez de mémoire vidéo libre. Réduisez la taille de la carte d'ombre dans préférences.xml | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
Line 69: | Line 67: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Et mettez 4096 ou 2048 à la place.Vous pouvez aussi utiliser un paramètre de démarrage: --prop:/sim/rendering/shadows/map-size=2048 | |||
=== | === Pipeline configurable === | ||
Le rendu Rembrandt utilise un fichier XML pour installer son pipeline pour chaque fenêtre décrite dans le groupe de cameras. Ce fichier décrit la façon dont les tampons intermédiaires sont établis, et comment les différentes étapes du rendu sont agencées. Le schéma général du fichier pipeline est le suivant : | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
Line 81: | Line 78: | ||
<!-- BUFFERS --> | <!-- BUFFERS --> | ||
<buffer> | <buffer> | ||
<!-- | <!-- 1ere définition de tampon --> | ||
</buffer> | </buffer> | ||
<buffer> | <buffer> | ||
<!-- | <!-- n ème définition de tampon --> | ||
</buffer> | </buffer> | ||
<!-- STAGES --> | <!-- STAGES --> | ||
<stage> | <stage> | ||
<!-- | <!-- 1ère définition d'étape --> | ||
</stage> | </stage> | ||
<stage> | <stage> | ||
<!-- | <!-- n ème définition d'étape --> | ||
</stage> | </stage> | ||
</PropertyList> | </PropertyList> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== Buffers ==== | ==== 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 : | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
Line 119: | Line 116: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== | |||
==== Phases ==== | |||
Une phase est une unité de rendu d'un groupe de tampons. La plupart des phases sont pré-définies et leur type n'est pas libre. Quand un type n'est pas spécifié, le nom est utilisé? Les types de phases sont : | |||
{| class="wikitable" | {| class="wikitable" | ||
!align="left"| Stage type | !align="left"| Stage type | ||
Line 126: | 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 reste de la géométrie opaque est rendu avec les effets standard, permettant de mettre la donnée sensible dans les tampons. | ||
|- | |- | ||
| | |ombre | ||
| | |Dans cette phase, la géométrie est rendue dans la carte normale à partir de la perspective du soleil. | ||
|- | |- | ||
| | |lumière | ||
| | |Cette phase utilise les tampons remplis par les phases précédrntes pour éclairer chaque pixel de la scène. Le résultat est rendu dans un autre tampon pour permettre des effets ultérieurs. | ||
|- | |- | ||
| | |plein écran | ||
| | |Les phases de ce type sont utilisés pour changer la scène entière, ou transformer une donnée à partir d'un tampon particulier. | ||
|- | |- | ||
| | |affichage | ||
| | |Le rendu final de la scène à l'écran est jugé à l'écran, ou la texture est définie dans le groupe caméra . | ||
|} | |} | ||
Ci-dessous, une description de phase : | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
<stage> | <stage> | ||
<name>stage-name</name> | <name>stage-name</name> | ||
<type>stage-type</type> <!-- | <type>stage-type</type> <!-- optionnel si le nom est l'un des types prédéfinis sauf plein écran --> | ||
<order-num>-1</order-num> | <order-num>-1</order-num> | ||
<effect>Effects/fullscreen-effect</effect> <!-- | <effect>Effects/fullscreen-effect</effect> <!-- seulement si type == fullscreen --> | ||
<needs-du-dv>true</needs-du-dv> <!-- | <needs-du-dv>true</needs-du-dv> <!-- seulement si type == fullscreen --> | ||
<scale-factor>0.25</scale-factor> <!-- | <scale-factor>0.25</scale-factor> <!-- seulement si type == fullscreen --> | ||
<!-- optional condition --> | <!-- optional condition --> | ||
Line 172: | Line 170: | ||
</stage> | </stage> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Les phases sont rendues dans les tampons (sauf pur la phase affichage). Les pièces jointes disent quels tampons sony affectés par chaque phase. | |||
===== | ===== Pièces jointes ===== | ||
La pièce jointe décrit la liaison entre tampon et poit d'attachement : | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
<attachment> | <attachment> | ||
Line 187: | Line 185: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===== | ===== Permissions(passes) ===== | ||
Passes | Les Passes sont seulement disponibles dans la phase <tt>lighting</tt>. trois sortes de phases sont autorisées : | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 195: | Line 193: | ||
|- | |- | ||
|sky-clouds | |sky-clouds | ||
| | |Rendus de la voûte céleste, solei, lune, planète, étoiles et nuages | ||
|- | |- | ||
| | |lumières | ||
| | |Rendus des taches additionnelles et points lumineux | ||
|- | |- | ||
| | |plein écran | ||
| | |Le pass fullscreen analogue à une phase fullscreen sauf qu'il est rendu dans des tampons attachés à la phase lumière | ||
|} | |} | ||
Un pass est défini ci-dessous : | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
<pass> | <pass> | ||
<name>pass-name</name> | <name>pass-name</name> | ||
<type>pass-type</type> <!-- | <type>pass-type</type> <!-- optionnel si le nom est prédéfini excepté fullscreen --> | ||
<order-num>-1</order-num> | <order-num>-1</order-num> | ||
<effect>Effects/fullscreen-effect</effect> <!-- | <effect>Effects/fullscreen-effect</effect> <!-- seulement si type == fullscreen --> | ||
<!-- optional condition --> | <!-- optional condition --> | ||
Line 218: | Line 216: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Une phase lumière typique est une succession de 5 pass: | |||
# <tt>sky-clouds</tt> pass | # <tt>sky-clouds</tt> pass | ||
# <tt>fullscreen</tt> pass | # <tt>fullscreen</tt> pass pour lumière ambiante | ||
# <tt>fullscreen</tt> pass | # <tt>fullscreen</tt> pass pour lumière solaire (et ombres) | ||
# <tt>lights</tt> pass | # <tt>lights</tt> pass | ||
# <tt>fullscreen</tt> pass | # <tt>fullscreen</tt> pass pour brouillard | ||
Chaque effet attaché au plein écran définit le mélange fait entre le pass et la somme précédente de rendu. | |||
== | == Démarrage de FlightGear avec Rembrandt == | ||
[[File:Rembrandt dialog.png|thumb|270px|Rembrandt | [[File:Rembrandt dialog.png|thumb|270px|dialogue Rembrandt]] | ||
Le rendu Rembrandt est maintenant intégré dans le répertoire principal, mais doit être activé pour démarrer. Il y a deux façons de l'activer (une seule est nécessaire): | |||
* <code>--enable-rembrandt</code> ( | * <code>--enable-rembrandt</code> (lorsqu'on utilise [[FGRun]], on peut ajouter ceci derrière le <tt>FG_EXECUTABLE</tt> sur la première page). | ||
* <code>--prop:/sim/rendering/rembrandt/enabled=true</code> ( | * <code>--prop:/sim/rendering/rembrandt/enabled=true</code> (avec FGRun on peut ajouter ceci via <tt>Advanced > Properties</tt> sur la dernière page). | ||
Le <tt>View > Rendering Options > Rembrandt Options</tt> dialogue vous permet de basculer et d'ajuster les différentes options offertes par Rembrandt. | |||
Rembrandt | Rembrandt est très gourmand en ressources GPU et son démarrage peut échouer avec les options par défaut. Le symptome le plus fréquent est un message OSG dans la console : | ||
RenderStage::runCameraSetUp(), FBO setup failed, FBO status= 0x8cd6 | RenderStage::runCameraSetUp(), FBO setup failed, FBO status= 0x8cd6 | ||
Warning: RenderStage::runCameraSetUp(State&) Pbuffer does not support multiple color outputs. | Warning: RenderStage::runCameraSetUp(State&) Pbuffer does not support multiple color outputs. | ||
On peut voir aussi : | |||
glLinkProgram "" FAILED | glLinkProgram "" FAILED | ||
Line 251: | Line 249: | ||
0(34) : error C6013: Only arrays of texcoords may be indexed in this profile, and only with a loop index variable | 0(34) : error C6013: Only arrays of texcoords may be indexed in this profile, and only with a loop index variable | ||
Des options additionnelles peuvent éviter ces problèmes : | |||
{| class="wikitable" | {| class="wikitable" | ||
|<tt>--prop:/sim/rendering/rembrandt/use-color-for-depth=true</tt> | |<tt>--prop:/sim/rendering/rembrandt/use-color-for-depth=true</tt> | ||
| | |Certaines vieilles cartes NVidia comme 7600GT, n'ont pas assez de résolution pour la profondeur, et on voit des "rideaux de brouillard" à quelques mètres devant. Une astuce consiste à encoder la profondeur dans une autre texture et donner la valeur correcte ensuite. Cette option permet cela. | ||
|- | |- | ||
|<tt>--prop:/sim/rendering/shadows/enabled=false</tt> | |<tt>--prop:/sim/rendering/shadows/enabled=false</tt> | ||
| | |Désactive les ombres tout à fait. | ||
|- | |- | ||
|<tt>--prop:/sim/rendering/shadows/num-cascades=1</tt> | |<tt>--prop:/sim/rendering/shadows/num-cascades=1</tt> | ||
| | |Évite le message "error C6013" sur les vieilles cartes en manque de résolution dans le cockpitt. Mettez <tt>/sim/rendering/shadows/cascade-far-m[0]</tt> pour changer la taille de la carte d'ombre. Plus de taille, et moins de résolution (la valeur par défaut est 5 mètres) | ||
|- | |- | ||
|<tt>--prop:/sim/rendering/shadows/map-size=<power-of-two></tt> | |<tt>--prop:/sim/rendering/shadows/map-size=<power-of-two></tt> | ||
| | |Définnissez la taille de la carte d'ombres. Les valeurs utilles sont 1024, 2048, 4096 ou 8192. Peu de cartes supportent 16384. | ||
|- | |- | ||
|<tt>--prop:/sim/rendering/shadows/num-cascades</tt> | |<tt>--prop:/sim/rendering/shadows/num-cascades</tt> | ||
| | |Définissez le nombre de cascades de la carte ombre. Moins de cascades signifie moins de temps passé à générer la carte shadow, mais aussi signifie une qualité moindre de l'ombre. Mettez entre 1 et 4. | ||
|- | |- | ||
|<tt>--prop:/sim/rendering/shadows/cascade-far-m[i]</tt> | |<tt>--prop:/sim/rendering/shadows/cascade-far-m[i]</tt> | ||
(1 <= i <= <tt>/sim/rendering/shadows/num-cascades</tt> <= 4) | (1 <= i <= <tt>/sim/rendering/shadows/num-cascades</tt> <= 4) | ||
| | |Définissez la taille de cascade de la carte shadow pour chaque cascade. Les valeurs par défaut sont 5m, 50m, 500m et 5000m pour 4 cascades. | ||
|- | |- | ||
|<tt>--prop:/sim/rendering/rembrandt/no-16bit-buffer=false</tt> | |<tt>--prop:/sim/rendering/rembrandt/no-16bit-buffer=false</tt> | ||
| | |Par défaut, Rembrandt utilise normalement des tampons de 8 bits (ainsi, la propriété est vraiment définie par défaut). Ceci peut créer des artefacts pour les éclairages specular. Si c'est inacceptable et si le GPU le supporte, mettez false pour avoir une meilleure précision pour les normales et les effets s'appuyant sur une direction normale. | ||
|} | |} | ||
== | == Lignes directrices pour les écritures shader == | ||
=== | === Uniformes prédéfinis === | ||
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> | ||
|<tt>mat4</tt> | |<tt>mat4</tt> | ||
| | |En pass plein écran seulement, view matrix utilisé our transformer la position écran en direction vue | ||
|- | |- | ||
|<tt>fg_ViewMatrixInverse</tt> | |<tt>fg_ViewMatrixInverse</tt> | ||
|<tt>mat4</tt> | |<tt>mat4</tt> | ||
| | |En pass plein écran seulement, view matrix inverse employé pour transformer la position écran en direction vue | ||
|- | |- | ||
|<tt>fg_ProjectionMatrixInverse</tt> | |<tt>fg_ProjectionMatrixInverse</tt> | ||
|<tt>mat4</tt> | |<tt>mat4</tt> | ||
| | |En pass plein écran seulement, projection matri inverse employé pour transformer la position écran en direction vue | ||
|- | |- | ||
|<tt>fg_CameraPositionCart</tt> | |<tt>fg_CameraPositionCart</tt> | ||
|<tt>vec3</tt> | |<tt>vec3</tt> | ||
|Position | |Position de la caméra en coordonnées cartésiennes | ||
|- | |- | ||
|<tt>fg_CameraPositionGeod</tt> | |<tt>fg_CameraPositionGeod</tt> | ||
|<tt>vec3</tt> | |<tt>vec3</tt> | ||
|Position | |Position de la caméra dans l'espace, exprimé en coordonnées géodésiques (longitude et latitude en radians, élévation en mètres) | ||
|- | |- | ||
|<tt>fg_SunAmbientColor</tt> | |<tt>fg_SunAmbientColor</tt> | ||
Line 339: | Line 337: | ||
|<tt>fg_DepthInColor</tt> | |<tt>fg_DepthInColor</tt> | ||
|<tt>bool</tt> | |<tt>bool</tt> | ||
| | |Dire si la profondeur est rangée dans une texture profondeur ou une texture couleur | ||
|- | |- | ||
|<tt>fg_Planes</tt> | |<tt>fg_Planes</tt> | ||
|<tt>vec3</tt> | |<tt>vec3</tt> | ||
| | |Utilisé pour convertir la valeur du tampon profondeur en une profondeur qui peut être utilisée pour calculer la position dans l'espace du fragment. | ||
|- | |- | ||
|<tt>fg_BufferSize</tt> | |<tt>fg_BufferSize</tt> | ||
|<tt>vec2</tt> | |<tt>vec2</tt> | ||
|Dimensions | |Dimensions du tampon, utilisé pour convertir gl_FragCoord dans la taille [0..1][0..1] | ||
|- | |- | ||
|<tt>osg_ViewMatrix</tt> | |<tt>osg_ViewMatrix</tt> | ||
|<tt>mat4</tt> | |<tt>mat4</tt> | ||
| | |Definie par OSG, employé seulement lors du travail sur la géométrie réelle | ||
|- | |- | ||
|<tt>osg_ViewMatrixInverse</tt> | |<tt>osg_ViewMatrixInverse</tt> | ||
|<tt>mat4</tt> | |<tt>mat4</tt> | ||
| | |Definie par OSG, employé seulement lors du travail sur la géométrie réelle | ||
|} | |} | ||
.Ils doivent encore être déclarés dans le fragment du vertex shader | |||
=== | === Fonctions utilitaires === | ||
Pour faciliter la maintenance des shaders plusieurs fonctions utilitaires sont disponibles pour le fragment shader. Ces fonctions sont placées ensemble dans deux fichiers : <tt>gbuffer-functions.frag</tt> et <tt>gbuffer-encode.frag</tt>. | |||
==== gbuffer-encode.frag ==== | ==== gbuffer-encode.frag ==== | ||
;<tt>void encode_gbuffer(vec3 normal, vec3 color, int mId, float specular, float shininess, float emission, float depth)</tt> | ;<tt>void encode_gbuffer(vec3 normal, vec3 color, int mId, float specular, float shininess, float emission, float depth)</tt> | ||
: | :Utilisé pour encoder youtes les valeurs de G-Buffer dans material shaders | ||
==== gbuffer-functions.frag ==== | ==== gbuffer-functions.frag ==== | ||
;<tt>vec2 normal_encode(vec3 n)</tt> | ;<tt>vec2 normal_encode(vec3 n)</tt> | ||
: | :Employé pour compresser normals à l'intérieur de G-Buffer dans material shaders. Normalement appelé de <tt>encode_gbuffer()</tt> | ||
;<tt>vec3 normal_decode(vec2 enc)</tt> | ;<tt>vec3 normal_decode(vec2 enc)</tt> | ||
: | :Reconstruit normals à partir de G-Buffer. Employé dans shaders plein écran et shaders lumière | ||
;<tt>vec3 float_to_color(in float f)</tt> | ;<tt>vec3 float_to_color(in float f)</tt> | ||
:Encode float | :Encode les valeurs float dans la taille [0..1] dans les 24 bits d'une couleur. cette fonction est employée par <tt>encode_gbuffer()</tt> si le <tt>/sim/rendering/use-color-for_depth</tt> est vrai, pour les vieilles cartes qui ne fournissent pas d'information profondeur avec assez de résolution dans les shaders fullscreen ou lumière. | ||
;<tt>float color_to_float(vec3 color)</tt> | ;<tt>float color_to_float(vec3 color)</tt> | ||
: | :Décode les valeurs float dans la taille [0..1] dans les 24 bits d'une couleur. cette fonction est employée par <tt>position()</tt> si le <tt>/sim/rendering/use-color-for_depth</tt> est vrai, pour les vieilles cartes qui ne fournissent pas d'information profondeur avec assez de résolution dans les shaders fullscreen ou lumière. | ||
;<tt>vec3 position( vec3 viewDir, float depth )</tt> | ;<tt>vec3 position( vec3 viewDir, float depth )</tt> | ||
: | :Reconstruit la position eye space à partir de la direction view position a partir de la view direction et la profondeur lue du tampon profondeur | ||
;<tt>vec3 position( vec3 viewDir, vec3 depthColor )</tt> | ;<tt>vec3 position( vec3 viewDir, vec3 depthColor )</tt> | ||
: | ::Reconstruit la position eye space à partir de la direction view et la profondeur encodée dans une couleur lue du tampon profondeur | ||
;<tt>vec3 position( vec3 viewDir, vec2 coords, sampler2D depth_tex )</tt> | ;<tt>vec3 position( vec3 viewDir, vec2 coords, sampler2D depth_tex )</tt> | ||
: | :Reconstruit la position eye space à partir de la direction vue et du tampon profondeur (profondeur réelle ou couleur selon la valeur de <tt>/sim/rendering/use-color-for_depth</tt>) à un fragment donné sur l'écran, donné par <tt>coords</tt> | ||
==== 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 404: | 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 414: | 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 433: | 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 446: | 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 , 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 517: | 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 591: | 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 700: | 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 786: | 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 }} | ||
Line 806: | Line 845: | ||
[[Category:Shader development]] | [[Category:Shader development]] | ||
[[Category:Core development projects]] | [[Category:Core development projects]] | ||
[[ | [[en:Project Rembrandt]] |
edits