Changes

Jump to: navigation, search

Fr/Projet Rembrandt

3,793 bytes added, 11:25, 6 January 2013
m
Pipeline configurable
[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 éclairages 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 ? ==
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 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]]
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 étapeles étapes suivantes.
;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 normales 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 :
: 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 l'éclairagela lumière, avec plusieurs sous-stades :
:*<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 modulé modulée avec la couleur ambiante de la scène, et est dessiné 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>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 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.
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 quelque addition quelques ajouts ou modifications.
== 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 bin 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.
=== Rendu des surfaces transparentes ===
[[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 qui captent la nuance et reçoivent des suggestions de rendu TRANSPARENT_BIN In the culling passAu stade collection, the cull visitor orders transparent le collecteur commande les surfaces in transparentes dans le le bac transparent bin. In a cull callback attached to the Geometry cameraDans un retour, after the scenegraph traversalattaché à la caméra Géometry, the après la traversée scénographe, les bacs transparent bins are removed from the render stage and saved in a temporary collectionsont enlevés de la phase rendu et sauvegardés dans un espace temporaire. In a cull callback attached to the Lighting cameraDans un retour attaché la caméra Éclairage, after the scenegraph traversalaprès la traversée sceneraph, the transparent bins saved at the previous stageles bacs transparents sauvegardent au prochain stade, are added to the render stage of the Lighting camera with a high order numsont ajoutés au stade rendu de la caméra éclairageavec un numéro d'ordre. That wayAinsi, the transparent surface are drawn on top of the les surfaces transparentes sont dessinées au sommet de la scene lighted from the Gbufferéclairée à partir de G-buffer .
=== Consommation de mémoire ===
* 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 kes 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.
</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 grpope groupe de cameras.Ce fichier mntre décrit la façon dont les tampons intermédiaires sont installésétablis, et comment les stades des différents rendus différentes étapes du rendu sont agencésagencées. Le schéma général du fichier pipeline est le suivant :
<syntaxhighlight lang="xml">
<!-- BUFFERS -->
<buffer>
<!-- First buffer definition 1ere définition de tampon -->
</buffer>
<buffer>
<!-- nth buffer definition n ème définition de tampon -->
</buffer>
<!-- STAGES -->
<stage>
<!-- First stage definition 1ère définition d'étape -->
</stage>
<stage>
<!-- nth stage definition n ème définition d'étape -->
</stage>
</PropertyList>
</syntaxhighlight>
==== 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 la une taille fixée fixe est prise en charge ( typique pour la carte shadowd'ombres). La description d'un tampon suit :
<syntaxhighlight lang="xml">
</syntaxhighlight>
 ==== Stages Phases ====A stage is an unit of rendering to a group of bufferUne phase est une unité de rendu d'un groupe de tampons. Most stages are predefined and their La plupart des phases sont pré-définies et leur type is not freen'est pas libre. When a Quand un type is not specifiedn'est pas spécifié, the name is used. Stage le nom est utilisé? Les types are de phases sont :
{| class="wikitable"
!align="left"| Stage type
|-
|geometry
|The geometry stage initialize most of the buffers and works on the real objects and La phase geometryinitialise la plupart des tampons et agit sur les objets réels et la géométrie. Transparent objects are set aside and will be used untouched in the lighting stageLes objets transparents sont placés à côté, et seront utilisés tels quels dans la phase lumière. Other Le reste de la géométrie opaque geometry is rendered with the est rendu avec les effets standard effects that do the hard work to put , permettant de mettre la donnée sensible data in the buffersdans les tampons.
|-
|shadowombre|In this stageDans cette phase, the geometry is rendered in the normal map from the la géométrie est rendue dans la carte normale à partir de la perspective of the sundu soleil.
|-
|lightinglumière|This stage uses the buffers filled by the previous stages to light every Cette phase utilise les tampons remplis par les phases précédrntes pour éclairer chaque pixel of the scenede la scène. The result is rendered in another buffer to allow post effectsLe résultat est rendu dans un autre tampon pour permettre des effets ultérieurs.
|-
|fullscreenplein écran|Stages of this Les phases de ce type are used to alter the whole scene or transform data from a particular buffersont utilisés pour changer la scène entière, ou transformer une donnée à partir d'un tampon particulier.
|-
|displayaffichage|Final rendering of the scene to the screen or the Le rendu final de la scène à l'écran est jugé à l'écran, ou la texture defined in the camera groupest définie dans le groupe caméra .
|}
A stage Ci-dessous, une description is outlined below de phase :
<syntaxhighlight lang="xml">
<stage>
<name>stage-name</name>
<type>stage-type</type> <!-- optional if name is one of the predefined type except fullscreen optionnel si le nom est l'un des types prédéfinis sauf plein écran -->
<order-num>-1</order-num>
<effect>Effects/fullscreen-effect</effect> <!-- only if seulement si type == fullscreen --> <needs-du-dv>true</needs-du-dv> <!-- only if seulement si type == fullscreen --> <scale-factor>0.25</scale-factor> <!-- only if seulement si type == fullscreen -->
<!-- optional condition -->
</stage>
</syntaxhighlight>
Stages render in buffers Les phases sont rendues dans les tampons (except for the display stagesauf pur la phase affichage). Attachments describe which buffers are affected by each stageLes pièces jointes disent quels tampons sony affectés par chaque phase.
===== Attachments Pièces jointes =====Attachment describe bindings between buffer and attachment point La pièce jointe décrit la liaison entre tampon et poit d'attachement :
<syntaxhighlight lang="xml">
<attachment>
</syntaxhighlight>
===== Passes Permissions(passes) =====Les Passes are only available in the sont seulement disponibles dans la phase <tt>lighting</tt> stage. Three kind of stage are allowed trois sortes de phases sont autorisées :
{| class="wikitable"
|-
|sky-clouds
|Renders the skydomeRendus de la voûte céleste, sunsolei, moonlune, planetplanète, stars and cloudsétoiles et nuages
|-
|lightslumières|Renders additional spot and point lightsRendus des taches additionnelles et points lumineux
|-
|fullscreenplein écran|Fullscreen Le pass analog to a fullscreen stage except that it renders in the buffers attached to the lighting stageanalogue à une phase fullscreen sauf qu'il est rendu dans des tampons attachés à la phase lumière
|}
A Un pass is defined like below est défini ci-dessous :
<syntaxhighlight lang="xml">
<pass>
<name>pass-name</name>
<type>pass-type</type> <!-- optional if name is one of the predefined type except optionnel si le nom est prédéfini excepté fullscreen -->
<order-num>-1</order-num>
<effect>Effects/fullscreen-effect</effect> <!-- only if seulement si type == fullscreen -->
<!-- optional condition -->
</syntaxhighlight>
A typical lighting stage is a Une phase lumière typique est une succession of de 5 passes pass:
# <tt>sky-clouds</tt> pass
# <tt>fullscreen</tt> pass for ambient lightpour lumière ambiante# <tt>fullscreen</tt> pass for sun light pour lumière solaire (and shadowset ombres)
# <tt>lights</tt> pass
# <tt>fullscreen</tt> pass for fogpour brouillard
Each effect attached to the fullscreen passes define the way blending is done between the Chaque effet attaché au plein écran définit le mélange fait entre le pass and the previous accumulation of renderet la somme précédente de rendu.
== Running Flightgear with Démarrage de FlightGear avec Rembrandt ==[[File:Rembrandt dialog.png|thumb|270px|dialogue Rembrandt dialog]]The Le rendu Rembrandt renderer is now integrated in the main repository but needs to be enabled to runest maintenant intégré dans le répertoire principal, mais doit être activé pour démarrer. There are two ways to enable it Il y a deux façons de l'activer (only one is needed!une seule est nécessaire):* <code>--enable-rembrandt</code> (when using lorsqu'on utilise [[FGRun]], you may add this behind the on peut ajouter ceci derrière le <tt>FG_EXECUTABLE</tt> on the first sur la première page). * <code>--prop:/sim/rendering/rembrandt/enabled=true</code> (with avec FGRun this can be added on peut ajouter ceci via <tt>Advanced > Properties</tt> on the last sur la dernière page).
The Le <tt>View > Rendering Options > Rembrandt Options</tt> dialog allows you to toggle and adjust the various features that dialogue vous permet de basculer et d'ajuster les différentes options offertes par Rembrandt offers.
Rembrandt is quite demanding in est très gourmand en ressources GPU resources and may fail to run with the default et son démarrage peut échouer avec les optionspar défaut. The more frequent symptom is an OSG Le symptome le plus fréquent est un message in the OSG dans la console :
RenderStage::runCameraSetUp(), FBO setup failed, FBO status= 0x8cd6
Warning: RenderStage::runCameraSetUp(State&) Pbuffer does not support multiple color outputs.
Some card also exhibit messages like this On peut voir aussi :
glLinkProgram "" FAILED
0(34) : error C6013: Only arrays of texcoords may be indexed in this profile, and only with a loop index variable
There is a number of additional Des options that can help to avoid these problems additionnelles peuvent éviter ces problèmes :
{| class="wikitable"
|<tt>--prop:/sim/rendering/rembrandt/use-color-for-depth=true</tt>
|Some old Certaines vieilles cartes NVidia cards, such as comme 7600GT, donn't give enough resolution for depth and that result in ont pas assez de résolution pour la profondeur, et on voit des "fog curtainsrideaux de brouillard" at few meters from the viewerà quelques mètres devant. One trick is to encode depth in another Une astuce consiste à encoder la profondeur dans une autre texture and get the proper value afterwardet donner la valeur correcte ensuite. This Cette option enables thatpermet cela.
|-
|<tt>--prop:/sim/rendering/shadows/enabled=false</tt>
|Disable shadows altogetherDésactive les ombres tout à fait.
|-
|<tt>--prop:/sim/rendering/shadows/num-cascades=1</tt>
|Avoid the Évite le message "error C6013" message on old cards at the cost of resolution in the cockpitsur les vieilles cartes en manque de résolution dans le cockpitt. Set Mettez <tt>/sim/rendering/shadows/cascade-far-m[0]</tt> to change the shadow map rangepour changer la taille de la carte d'ombre. The more the rangePlus de taille, the less the resolution et moins de résolution (default value is la valeur par défaut est 5 metersmètres)
|-
|<tt>--prop:/sim/rendering/shadows/map-size=<power-of-two></tt>
|Set the shadow map sizeDéfinnissez la taille de la carte d'ombres. Useful values are Les valeurs utilles sont 1024, 2048, 4096 or ou 8192. Few cards have the resources to support Peu de cartes supportent 16384.
|-
|<tt>--prop:/sim/rendering/shadows/num-cascades</tt>
|Set the shadow map cascade numberDéfinissez le nombre de cascades de la carte ombre. Less Moins de cascades means less time spent in signifie moins de temps passé à générer la carte shadow map generation, but also means lower shadow qualitymais aussi signifie une qualité moindre de l'ombre. Integer between Mettez entre 1 and et 4.
|-
|<tt>--prop:/sim/rendering/shadows/cascade-far-m[i]</tt>
(1 <= i <= <tt>/sim/rendering/shadows/num-cascades</tt> <= 4)
|Set the shadow map Définissez la taille de cascade range for each de la carte shadow pour chaque cascade. Default values are Les valeurs par défaut sont 5m, 50m, 500m and et 5000m for pour 4 cascades.
|-
|<tt>--prop:/sim/rendering/rembrandt/no-16bit-buffer=false</tt>
|By defaultPar défaut, Rembrandt uses utilise normalement des tampons de 8 bit buffers for normals bits (so the property is set to true by defaultainsi, la propriété est vraiment définie par défaut). This may create banding artifacts on Ceci peut créer des artefacts pour les éclairages specular highlights. If itSi c's unacceptable and the est inacceptable et si le GPU supports itle supporte, set to mettez false to have better precision for normals and effects relying on normal pour avoir une meilleure précision pour les normales et les effets s'appuyant sur une directionnormale.
|}
== Guidelines for Lignes directrices pour les écritures shader writers ===== Predefined uniforms Uniformes prédéfinis ===These Ces uniformes glsl uniforms donn't need to be declared in the effect file.ont pas besoin d'être déclarés dans le fichier effet
{| class="wikitable"
!NameNom
!Type
!PurposeObjectif
|-
|<tt>fg_ViewMatrix</tt>
|<tt>mat4</tt>
|In fullscreen En pass onlyplein écran seulement, view matrix used to transform the screen utilisé our transformer la position to view écran en directionvue
|-
|<tt>fg_ViewMatrixInverse</tt>
|<tt>mat4</tt>
|In fullscreen En pass onlyplein écran seulement, view matrix inverse used to transform the screen employé pour transformer la position to view écran en directionvue
|-
|<tt>fg_ProjectionMatrixInverse</tt>
|<tt>mat4</tt>
|In fullscreen En pass onlyplein écran seulement, projection matrix matri inverse used to transform the screen employé pour transformer la position to view écran en directionvue
|-
|<tt>fg_CameraPositionCart</tt>
|<tt>vec3</tt>
|Position of the camera in world space, expressed in cartesian coordinatesde la caméra en coordonnées cartésiennes
|-
|<tt>fg_CameraPositionGeod</tt>
|<tt>vec3</tt>
|Position of the camera in world spacede la caméra dans l'espace, expressed in geodesic coordinates exprimé en coordonnées géodésiques (longitude in radians, et latitude in en radians, elevation in metersélévation en mètres)
|-
|<tt>fg_SunAmbientColor</tt>
|<tt>fg_DepthInColor</tt>
|<tt>bool</tt>
|Tells if the depth is stored in a depth Dire si la profondeur est rangée dans une texture or a color profondeur ou une texturecouleur
|-
|<tt>fg_Planes</tt>
|<tt>vec3</tt>
|Used to convert the value of the depth buffer to a depth that can be used to compute the eye space Utilisé pour convertir la valeur du tampon profondeur en une profondeur qui peut être utilisée pour calculer la position of the dans l'espace du fragment.
|-
|<tt>fg_BufferSize</tt>
|<tt>vec2</tt>
|Dimensions of the bufferdu tampon, used to convert utilisé pour convertir gl_FragCoord into the range dans la taille [0..1][0..1]
|-
|<tt>osg_ViewMatrix</tt>
|<tt>mat4</tt>
|Defined by Definie par OSG, used only when working on actual geometryemployé seulement lors du travail sur la géométrie réelle
|-
|<tt>osg_ViewMatrixInverse</tt>
|<tt>mat4</tt>
|Defined by Definie par OSG, used only when working on actual geometryemployé seulement lors du travail sur la géométrie réelle
|}
They still have to be declared in the .Ils doivent encore être déclarés dans le fragment or the du vertex shader to be used.
=== Utility functions Fonctions utilitaires ===
To ease the Pour faciliter la maintenance of des shaders, several utility functions are available for the plusieurs fonctions utilitaires sont disponibles pour le fragment shader. These functions are put together in two files Ces fonctions sont placées ensemble dans deux fichiers : <tt>gbuffer-functions.frag</tt> and et <tt>gbuffer-encode.frag</tt>.
==== gbuffer-encode.frag ====
;<tt>void encode_gbuffer(vec3 normal, vec3 color, int mId, float specular, float shininess, float emission, float depth)</tt>
:Used to encode all the values of the Utilisé pour encoder youtes les valeurs de G-Buffer in dans material shaders
==== gbuffer-functions.frag ====
;<tt>vec2 normal_encode(vec3 n)</tt>
:Used to compress Employé pour compresser normals into the à l'intérieur de G-Buffer in dans material shaders. Normally called from Normalement appelé de <tt>encode_gbuffer()</tt>
;<tt>vec3 normal_decode(vec2 enc)</tt>
:Reconstruct Reconstruit normals from the à partir de G-Buffer. Used in fullscreen Employé dans shaders and light plein écran et shaderslumière
;<tt>vec3 float_to_color(in float f)</tt>
:Encode les valeurs float values in the range dans la taille [0..1] in the dans les 24 bits of a colord'une couleur. This function is used by cette fonction est employée par <tt>encode_gbuffer()</tt> if the si le <tt>/sim/rendering/use-color-for_depth</tt> is trueest vrai, for old cards that donpour les vieilles cartes qui ne fournissent pas d't provide depth information with enough resolution inside fullscreen or light profondeur avec assez de résolution dans les shadersfullscreen ou lumière.
;<tt>float color_to_float(vec3 color)</tt>
:Decode Décode les valeurs float values in the range dans la taille [0..1] from the dans les 24 bits of a colord'une couleur. This function is used by cette fonction est employée par <tt>position()</tt> if the si le <tt>/sim/rendering/use-color-for_depth</tt> is trueest vrai, for old cards that donpour les vieilles cartes qui ne fournissent pas d't provide depth information with enough resolution inside fullscreen or light profondeur avec assez de résolution dans les shadersfullscreen ou lumière.
;<tt>vec3 position( vec3 viewDir, float depth )</tt>
:Reconstruct Reconstruit la position eye space à partir de la direction view position from the a partir de la view direction and the depth read from the depth bufferet la profondeur lue du tampon profondeur
;<tt>vec3 position( vec3 viewDir, vec3 depthColor )</tt>
:Reconstruct :Reconstruit la position eye space position from the view à partir de la direction and the depth encoded in a color read from the depth bufferview et la profondeur encodée dans une couleur lue du tampon profondeur
;<tt>vec3 position( vec3 viewDir, vec2 coords, sampler2D depth_tex )</tt>
:Reconstruct Reconstruit la position eye space position from the view à partir de la direction and the depth buffer vue et du tampon profondeur (real depth or color, according to the value of profondeur réelle ou couleur selon la valeur de <tt>/sim/rendering/use-color-for_depth</tt>) at a given à un fragment on screendonné sur l'écran, given by donné par <tt>coords</tt>
==== Usage ====
For material Pour les shadersmaterial, it is necessary to provide both il faut fournir à la fois <tt>gbuffer-functions.frag</tt> and et <tt>gbuffer-encode.frag</tt> in the effect filedans le fichier effet, like this comme suit :
<syntaxhighlight lang="xml">
</syntaxhighlight>
For Pour les shaders fullscreen passes shaders, only on doit fournir seulement <tt>gbuffer-functions.frag</tt> should be provided, like this comme ceci :
<syntaxhighlight lang="xml">
</syntaxhighlight>
In the main function of the Dans la principale fonction du shader, the functions referenced need to be declared firstles fonctions référencées doivent être écrites en premier. With Avec no #include files, the whole function le prototype needs to be typed de la fonction entière nécessite d'être typé :
<syntaxhighlight lang="glsl">
void encode_gbuffer(vec3 normal, vec3 color, int mId, float specular, float shininess, float emission, float depth);
 
main() {
vec3 normal;
</syntaxhighlight>
=== Phase Geometry Stage ===The La phase Geometry Stage is there to fill the est là pour remplir le G-buffertampon. '''Shading doesnL't occur at this stageombrage n'intervient pas à cette phase, so light or fog computation should not be part of the et le calcul lumière ou brouillard ne doit pas faire partie du shader'''. The required operation in the Fragment L'opération requise dans le fragment Shader is to fill every individual buffer with est de remplir avec une valeur sensible value chaque tampon individuel :
{| class="wikitable" style="text-align: center;"
|depth pràfondeur (gl_FragDepth)||GL_DEPTH_COMPONENT32||colspan="4"|Fragment depthprofondeur
|-
|gl_FragData[0]||GL_RG16||colspan="2"|normal.x * 0.5 + 0.5||colspan="2"|normal.y * 0.5 + 0.5
|}
This is the default layout expected by the sunlight Ceci est la couche par défaut attendue par le shader. material Id can be used to detect a different layoutpeut être utilisé pour détecter une couche différente
<!--
#Depth buffer, modified with gl_FragDepth, will record the distance between the fragment and the camera. Default behavior is to avoid to touch it, living the GPU rasterizer doing sensible things by interpolating vertex gl_Position from the Vertex or the Geometry Shader. If altering the computed depth is required, like in the Urban shader, the value of gl_FragDepth should be set.
#Normal buffer, modified with gl_FragData[0].xyz, will record the normal of the fragment in eye coordinates. gl_FragData[0].w is reserved for future use. The interpolated normal is usually simply stored but bump mapping or relief mapping affecting the normal can be computed here.
#Diffuse color buffer, modified with gl_FragData[1].rgb, will hold the unshaded color of the fragment, usually modulating the material diffuse+ambient color with the texture map. Diffuse color from environment mapping should also go here.
#Specular color, modified with gl_FragData[2].rgb, and specular shininess in gl_FragData[2].a, will retain the specular color of the fragment.
#Emission color, modified with gl_FragData[3].rgb
In anyway, don't use gl_FragColor as it is incompatible with MRT (Multi Render Target) and would affect the four last buffers with the same value. In that case, the model will glow (emission buffer initialized) and parts will disappear at certain view angles because normals are not initialized properly.
<span style="color:red;font-size:1== 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.5em;font-weight:bold">This layout is going to change in the official repository when the merge will be doneAvec 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. The goal of this change is to fill more useful data into less texture memory and get rid of a stupid IP issue on float textures</span>
-->===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.
=== Additional light pass Pass fleur===There would be a single shader for each light type used. The plan is to create lights like animations in the model XML file. The light shader will retrieve scene geometry by combining screen space position converted in view space ray by the inverse of the projection matrix (an helper function should be provided), and the fragment depth at that screen position read from the depth bufferC'est un effet double pass qui rend flou le tampon lumière dans une petite texture. With the help of the fragment normal, the diffuse and specular color and the properties of the light the shader implements, it will be possible to add to the lighting buffer the contribution of the light renderedCette texture est ensuite ajoutée au tampon lumière lors de la phase affichage.
=== Fog Pass Effets requis ===Using the fragment depth, it will be possible to compute any fog distribution. For the moment, the simple fog equation is implemented. === Bloom Pass ===This is a two-Plusieurs pass effect that blurs the lighting buffer in a small texturesont mis en œuvre pour l'utilisation du système effet. This texture is then added to the lighting buffer at the display stage. === Required Effects ===Several pass are implemented using the effect system. For this purposeDans ce but , some effects are referenced in the des effets sont référencés dans le code core code using reserved namesutilisant des noms réservés. these effects areCes effets sont:
{| class="wikitable" cellpadding="3"
!NameNom!KindType!PurposeBut
|-
|<tt>Effects/ssao</tt>
|Works on a full screen Agit sur un quadplein écran|Compute ambient Calcule l'occlusion from the ambiante à partir du tampon normal buffer and the depth bufferet du tampon profondeur
|-
|<tt>Effects/ambient</tt>
|Works on a full screen Agit sur un quadplein écran |Copies the Copie le tampon couleur diffuse color buffer multiplied by the ambient light to the lighting buffer multiplié par la lumière ambiante au tampon éclairage. Ambient Occlusion can also affect ambient lightL'occlusion ambiante peut aussi affecter la lumière ambiante .
|-
|<tt>Effects/light-spot</tt>
|Works on real geometry of the light Agit sur la géométrie réeelle du volumede la lumière|Computes the light Calcule la contribution of a spot light defined in a lumière d'un point lumineux défini dans une animation <tt>light</tt> animation having a ayant un <tt>light-type</tt> of de '''<tt>spot</tt>'''
|-
|<tt>Effects/fog</tt>
|Works on a full screen Agit sur un quadde plein écran|Computes the fog from the GCalcule le brouillard à partir du C-buffer and the lighting parameterset les paramètres de l'éclairage
|-
|<tt>Effects/display</tt>
|Works on a full screen Agit sur un quadde plein écran|Renders the composite final Rends l'image from the finale composite à partir du G-buffer and the lighting et du bufferéclairage
|}
== Guidelines for modelers Lignes-guide pour modeleurs ==
=== Porting aircraft Portage d'avion ===* Rembrandt computes shadows calcule les ombres => no more fake shadows in the modelplus de fausses ombres dans le modèle* Rembrandt computes ambient calcule l'occlusion ambiante => no ambient pas d'occlusion baked into ambiante incluse dans les textures* Rembrandt has light est en lumière => les cartes lumière static lightmap are not neededne sont pas nécéssaires, emissive color to see models at night is not needed and would interferela couleur émissive pour voir les modèles n'est pas nécessaire, et pourrait interférer* Rembrandt has glow est brillant => incorrectly used emissive colors may blur displays and make some text unreadableles couleurs émissives incorrectement utilisées peuvent rendre flou, et rendre du texte illisible. Light size may have to be adjustedL'intensité de la lumière devra être réglée* Rembrandt has strict needs with a des besoins précis avec les shaders => les shaders need to be adjusted to comply with the new framework otherwise the view will be plain wrongnécessitent un ajustement pour se conformer au nouveau cadre, sinon la vue sera faussée* Rembrandt can't do transparent ne peut faire des surfaces transparentes => transparent surface need to be properly registered to render them with the classical pathles surfaces transparentes doivent être dûment enregistrées pour les atteindre avec le chemin classique
=== Registering all translucent Enregistrement de toutes les surfaces translucides ===
Every model is, by default, rendered using the Chaque modèle est par défaut rendu en utilisant l'effet <tt>Effects/model-default</tt> effect. This effect initialize the Cet effet initialise le G-buffer, ignoring transparent en ignorant les surfacestransparentes, by doing en mettant alpha testing and rendering all the geometry in the default bintest et rendu de toute la geometrie dans la poubelle. It is not Il n'est pas possible to redirect rendering to transparent bins when the associated de rediriger le rendu vers les bacs transparents lorsque la texture has associée a un canal alpha channel because most models use a single car la plupart des modeles emploient un atlas simple texture atlas and even opaque parts are rendered with et même les parties opaques sont rendues avec texture with avec alpha channelcanal.
If a model needs to have transparent or translucent Si un modèle nécessite des surfacestranslucides ou transparentes , these ces objets surface objects need to be assigned a different effect that sets explicitly the render bin to doivent être assignés à un effet différent qui place explicitement le bac rendu à "DepthSortedBin", or sets the rendering hint to ou met la suggestion rendu à "transparent". This tells the renderer to render this object using forward renderingCeci dit au moteur de rendu de rendre cet objet opérant avant le rendu, so lighting and fog need to be enabledainsi, and if a la clarté et le brouillard doivent être activés, et si un programme shader program is usedest utilisé, they should be computed in the classical wayet s'ils ont été calculés en manière classique. The Le <tt>Effects/model-transparent</tt> can be used to register simple transparentpeut être utilisé pour enregistrer simlement les surfaces transparentes/translucent surfacestranslucides. You assign this effect to an object Vous attribuez cet effet à un objet (or multiple objectsou à de multiples objets) likecomme:
<effect>
<inherits-from>Effects/model-transparent</inherits-from>
</effect>
If opaque surface need to have special effect'''Attention: <Effect> agit seulement sur les objets réels, for example to apply bump mapping, this effect should use the "RenderBin" bin, or the rendering hint set to "opaque", and the G-buffer needs to be initialized correctly in the Geometry stagepas sur des groupes d'objets ou des animations.'''
=== Adding lights to Si la surface opaque a model ===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.
There are two things to consider: the appearance of the light source and the illuminated area. For the appearance of the light source (what you see when you look at the bulb), you need a model with an emissive material that will produce the glow effect and that is visible at night.=== Soyez sûr que toute la Geometry distribuera l'ombre ===
For the effect of the source on its environment Pour limiter la quantité de rendu geometry dans la carte shadow, et aussi pour réduire les artefacts (the lit areaacnée shadow), we must have in the 3D model (the seulement les faces ne regardant pas le soleil distribuent les ombres.ac file) a volume that includes the effect (Light Volume)Le test est effectué en utilisant l'orientation normale. It can be a large cone for spotlights or a sphere for point lightCela veut dire que les polygones à double côté, ou mesh non fermés, seront transparents à la lumière sous certains angles de soleil. It'Pour éviter ça, les modeleurs peuvent:*s important that the light volume is closed'assurer que l'objet est toujours dans l'ombre d'autres objets,*fermer leur mesh, convex and itou*doubler les polygones avec l's normals are oriented outward.endroit normal à l'opposé
The light volume must be part of the geometry of the model and be referenced in the animation file. No need to add a color or an effect to this volume. Light calculation is only done on the fragments covered by the light volume, but has no influence on the color or the attenuation of the light.=== Ajouts de lumière à un modèle===
All available animations are possible on the light volume, except 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 materialqui produira l''' and '''texture'''. It is not possible to change color of lights for the moment, except switching to another animation. Axis and position are in object space and are transformed by the subsequent animationseffet 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. ==== Spotlights Taches lumineuses ====
{|cellpadding=10|
|valign=top|
|valign=top|
{| class="wikitable" cellpadding="3"
!NameNom!PurposeObjectif
|-
|<tt>type</tt>
|Install the Installe l'animation <tt>'''light'''</tt> animation
|-
|<tt>light-type</tt>
|This is a C'est une lumière <tt>'''spot'''</tt> light
|-
|<tt>name</tt>
|Name given to this Nom donné à cette animation
|-
|<tt>object-name</tt>
|Name of the light Nom du volume in the 3d model lumière dans le modèle 3D (typically a cone with an apex at typiquement un cône avec un sommet à <tt>position</tt>, along le long de l'axe <tt>direction</tt> axis if si <tt>cutoff</tt> is lesser than est inférieur à 90 degreesdegrés, or a sphere centered at ou une sphère centrée à <tt>position</tt> if si <tt>cutoff</tt> is greater than est supérieur à 90 degrees degrés )
|-
|<tt>nopreview</tt>
|Hide light Cache le volume in lumière dans fgrun 3d preview
|-
|<tt>position</tt>
|In object spaceDans espace objet, position of the lightde la lumière
|-
|<tt>direction</tt>
|In object spaceDans espace objet, direction to the center of the spotvers le centre de la tache
|-
|<tt>ambient</tt>
|Ambient color of the lightCouleur ambiante de la lumière
|-
|<tt>diffuse</tt>
|Diffuse color of the lightCouleur diffuse de la lumière
|-
|<tt>specular</tt>
|Specular color of the lightCouleur specular de la lumière
|-
|<tt>dim-factor</tt>
|Group of parameters to control a factor that is applied to Groupe de paramètres pour contrôler un facteur appliqué en même temps à ambient, diffuse and et specular at the same time
|-
|<tt>attenuation</tt>
|Three Trois element vector. <c> element is the est le facteur constant factor, <l> element is the linear factor and est le facteur linéaire et <q> element is the quadratic factorest le facteur quadratique.<br />Attenuation of color at de couleur à distance d is est [[File:Spotlight_attenuation.png]]
|-
|<tt>exponent</tt>
|Attenuation is multiplied by multiplié par <tt>pow( dot( lightDir, <direction> ), <exponent> )</tt>, lightDir being étant vector from light position to point, in camera space.
|-
|<tt>cutoff</tt>
|Point is lit by this source if <tt>dot( lightDir, <direction> ) > <cutoff></tt> , lightDir being vector from light vecteur à partir de la position to lumière vers le point, in camera spacedans l'espace caméra.
|-
|<tt>near-m</tt>
|Minimum distance of Distance minimum d'influence, from à partir de la position, in metersen mètres
|-
|<tt>far-m</tt>
|Maximum distance of Distance maximum d'influence, from à partir de la position, in metersen mètres
|}
|}
==== Point lights Points lumineux ====
{|cellpadding=10|
|valign=top|
|valign=top|
{| class="wikitable" cellpadding="3"
!NameNom!PurposeObjectif
|-
|<tt>type</tt>
|Install the Installe l'animation <tt>'''light'''</tt> animation
|-
|<tt>light-type</tt>
|This is a C'est une lumière <tt>'''point'''</tt> light
|-
|<tt>name</tt>
|Name given to this Nom donné à cette animation
|-
|<tt>object-name</tt>
|Name of the light Nom du volume in the 3d model lumière dans le modèle 3D (typically a sphere centered on typiquement une sphère centrée sur <tt>position</tt>, with a radius of avec un rayon de <tt>far-m</tt>)
|-
|<tt>nopreview</tt>
|Hide light volume in Volume lumière cachée dans fgrun 3d preview
|-
|<tt>position</tt>
|In Dans espace object space, position of the lightde la lumière
|-
|<tt>ambient</tt>
|Ambient color of the lightCouleur ambiante de la lumière
|-
|<tt>diffuse</tt>
|Diffuse color of the lightCouleur diffuse de la lumière
|-
|<tt>specular</tt>
|Specular color of the lightCouleur specular de la lumièret
|-
|<tt>dim-factor</tt>
|Group of parameters to control a factor that is applied to Groupe de paramètres pour contrôler un facteur appliqué à ambient, diffuse and et specular at the same timeen même temps
|-
|<tt>attenuation</tt>
|Three Trois element vector. <c> element is the est le facteur constant factor, <l> element is the linear factor and est le facteur linéaire et <q> element is the quadratic factorest le facteur quadratiquer.<br />Attenuation of color at de couleur à distance d is est [[File:Spotlight_attenuation.png]]
|-
|<tt>near-m</tt>
|Minimum distance of Distance minimum d'influence, from à partir de la position, in metersen mètres
|-
|<tt>far-m</tt>
|Maximum distance of Distance maximum d'influence, from à partir de la position, in metersen mètres
|}
|}
==== 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/lightsLe 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 List Liste ==
=== Completed tasks Tâches à compléter ===*Fix Fixer le rendu shadow rendering when using multi threading in quand on emploie plusieurs liens en OSG*Implement Implementer Cascaded Shadow Map (need to be optimized a besoin d'être optimisée - frustum calculation and nightet nuit)*Honor 'noshadow' animation (done)*See what happens with glow in fog Voir ce qui arrive avec brillance dans le brouillard: unknown landclass creates white une sorte de terrain inconnu crée des patches in the blancs dans le buffer emission buffer - scenery generation problemproblème de génération de scène *Test multi-screen écran (mostly done)*Restore Restorer splashscreen*Draw transparent objects with forward rendering Dessiner des objets transparents avec rendu en premier (may need to peut nécessiter la capture the transparent bin from the geometry stage and move it in the display stagedu bac transparence à partir de la phase géométrie et le placer dans la phase affichage) (OK - needs model nécessite une contributionmodèle)*Add spotlights as animations (nearly finished)*find a Trouver une solution for pour couleur ambient and et emissive color of de material (may need an additional peut nécessiter un bufferadditionnel)*Provide a Fournir un shader for transparent objects that could render to the pour objets transparents qui puisse rendre le buffer emissive buffer too infaisable (using en utilisant MRT) not doable. Light pass can't use La phase lumière ne peut utiliser MRT *Use Utiliser un buffer stencil buffer to limit light rangepour limiter la taille lumière (no - done in light non fait dans shaderlumière)**needed for nécessaire pour la lumière de cockpit light to implement fake shadows and avoid lighting the pour réaliser des faux shadowws et éviter d'éclairer le runway from the cabin through the airframede la cabine*Use effect system instead of hard-coded Utiliser un système effet à la place des shaderslourdement codés*Add new animation to link a light source to a model (need to provide point light animation duplicating spot light) (done)*Tidy up the architecture (done)*Global strength of glow or ambient Intensités globales de brillance, ou occlusion ambiante via slider in rendering dialog*Fix dim-factor in multiplayer mode (done)*Design and implement a configurable pipeline (done)*Document rendering pipeline configuration file format (done)curseur dans le dialogue rendu
=== Near term tasks Tâches à court terme ===*Convert existing Convertir les shaders to deferred renderingexistants en rendu différé*Avoid to redraw opaque objects in the light passÉviter de redessiner les objets opaques dans la phase lumière. Involve OSG Améliorer le masque node mask not properly initializedOSG .*take care of particles and precipitationS'occuper des particules et précipitations*Fix fog on cloudsFixer le brouillard sur les nuages *Fix shadow Fixer les matrices in shadow dans multi-screen*Implement IMettre en œuvre un lightfield shader
=== Long term ideas Idées à long terme (unsortednon classées) ===
*implement strength of glow (in the emissive buffer alpha channel)
**provide levels 0 to 5 - we are currently at level 5
*Implement quality vs performance user control
== Gallery 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}}
== Appendix Appendice ==
{{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 }}
269
edits

Navigation menu