Partie II Outils d'aide à la pereption visuelle en réalité virtuelle
Chapitre 2 Stéréosopie et aélération graphique 37
2.3 Notre nouvelle méthode
2.3.2 Rendu
L'ensemble des proédés de restitution stéréosopiques étant variés, mais fondés sur
l'exploitation de deux images légèrement diérentes, il faut que notre méthode puisse
générer lerésultat dansdeux textures quipourrontêtre utiliséesquelque soitlematériel
employé.Leprinipeestalorsd'eetuerlaphasederendudugeometry shader dansdeux
buers séparésqui,dansleprogrammeprinipal,sontrattahés àdeuxframebuers
3
dis-tintsetquisontreprésentés pardes textures.Celan'est réalisablequ'en employantdeux
extensions OpenGLspéiques quisontlesFramebuer Objets aussionnussouslenom
deFBO)etMultiple DrawTarget (aussionnussouslenomdeMRT).LesFBO sontune
extension d'OpenGL [Khr08b℄ qui permet de gérer des ontextes supplémentaires à elui
initialement présent. L'autre partiularité des FBOs est d'orir la possibilité d'eetuer
le rendu dans une texture plutt que dans un buer propreà OpenGL. On retrouve une
utilisation ourante lors de la réupération d'une arte de profondeur diretement dans
une texture an qu'elle puisse être utilisée dans une tehnique de shadow mapping par
exemple e qui aélère grandement les traitements par rapport à une leture depuis un
3
Ensembledebuers assoiésàunontextedonnépermettantdestokerlerésultathromatiqued'un
buerOpenGL.La seonde extension[Khr08a℄ MRT a étéréée an depouvoireetuer
lerendu dans plus d'un buer hromatique.
Ainsipournotreméthode,nousallonsréerun nouveauframebuer viaunFBO dans
lequel deux textures dédiées aurendu hromatique serontajoutées.
L'utilisationde es extensions imposetoutefois un ertainnombre de ontraintes qu'il
fautprendre en ompte. En utilisant lesMRT nous avons l'obligationde rendre les
frag-mentsdans haundesbuers ardans leasontrairelanormedéritlerésultatomme
indéni.Une solution est d'utiliserla transparene pour aher les fragments qui ne
de-vraient pas apparaître en mettant leur valeur alpha à 0 et leur omposanteRVB à noir.
Ainsile listing2.2 devient :
Listing2.4:Codesouredugeometryshader modiépoursatisfairelaontraintedesMRT
1 #version 120
2 #extension GL_ARB_draw_buffers : enable
3
4 flat varying float in view;
5
6 void main(void)
7 {
8 if(view == 0.0){
9 gl_FragData [0℄ = ve4(gl_Color.rgb ,1.0);
10 gl_FragData [1℄ = ve4(0.0);
11 }else{
12 gl_FragData [0℄ = ve4(0.0);
13 gl_FragData [1℄ = ve4(gl_Color.rgb ,1.0);
14 }
15 }
Pour maintenir la possibilité d'utiliser la transparene de manière normale, le test à
appliquer dans le programme prinipal onsiste à éliminer les fragments dont la valeur
alphaest égale0etuniquementeux là.Ce proessuspeut êtremisen ÷uvreen ativant
l'alpha test 4
.
Une autre ontrainte est liée à l'utilisation ouplée des MRT et des FBO : il n'y a
qu'unbuer deprofondeurommunàhaquebuerderenduhromatique.T
raditionnelle-ment es extensions sont utilisées ensemble dans le adre de l'ahage d'une géométrie
similaire, mais ave de possibles variations de ouleurs e qui ne pose pas de problème
lors du test de profondeur ar les informations sont partagées. Dans notre as, l'emploi
d'unbuer deprofondeur ommunvaentraînerdesonitsetl'apparitiond'artefatslors
du rendu ar les points de vue ne sont pas les mêmes. Il existe trois solutions qui vont
4
Ce test permet d'éliminerdesfragmentsendénissantpréalablementdes onditionssurlesvaleurs
permettre d'outrepasser ette ontrainte. La première utilise l'algorithme du peintre
qui néessite un ordonnanement de l'ensemble des faettes de la sène en fontion de
leur distane par rapport aupoint de vue. Cette opérationpeut se révéler assez oûteuse
sile nombre de trianglesest important.Desproblèmes liésàl'algorithme même,peuvent
toujours subvenir ommepar exemple le as de deux trianglesse hevauhant.
La deuxième solution onsiste à faire un rendu dans une seule texture dont les
di-mensions orrespondent à l'union des deux textures de rendu initial. De ette manière,
nous nous retrouvons ave un seul buer de rendu hromatique, ertes de tailledoublée,
maisquiorel'avantagede pouvoirutiliserlebuer de profondeur sansontrainte.Cette
tehnique impose ependant quelques manipulations pour que les fragments destinés à
la vue de droite soient bien transférés dans la bonne zone et que le lipping
5
des deux
vues soitorret. Cesmodiationsnepeuvent avoirlieuquedanslegeometryshader ar
le pixel shader ne permet pas de modier la position d'un fragment. Le proessus est le
mêmequedanslaméthode dedépartàladiérenequ'unefoisquelesommetdutriangle
a étéprojeté,onvavérierqu'il appartient bien àl'espae de projetion
(0,0, w, h)
oùw
est la largeur de la fenêtre eth
sa hauteur. Si e n'est pas le as, on élimine le triangle.Cette solution permet également de se passer de la variable permettant de dénir si un
triangleappartientà lavuede droiteouàlavuede gauhe. Siuntriangleappartientàla
vuede gauhe, nousallonslelaisseren l'état,par ontresiun triangleappartientàlavue
de droite, alors après la projetion de haun de ses sommets, nous leur appliquons une
translation horizontale de veteur
(w,0,0)
.Le listing2.2 est transforméen onséquene:Listing2.5: Code soure du geometry shader modié pour le test de profondeur
1 #version 120 2 #extension GL_EXT_geometry_shader4 : enable 3 #extension GL_EXT_gpu_shader4 : enable 4 5 uniform mat4 modelviewprojetionmatrix; 6 uniform int width; 7 uniform int height; 8 9 void main(void) 10 { 11 ve4 position [3℄; 12 bool lipping = true; 13 for(int i =0; i < 3; ++i){ 14 position[i℄=gl_ModelViewProjetionMatrix*gl_PositionIn [i ℄; 15 if(position[ i ℄.x>width || position[ i ℄.x<0 || 16 position[ i ℄.y<0 || position[ i ℄.y>height){ 17 lipping == false ; 18 } 19 } 20 if(lipping ==true){ 5
21 for(int i =0; i < 3; ++i){
22 gl_Position = position[ i ℄;
23 gl_TexCoord[0℄ = gl_TexCoordIn[ i ℄[0℄;
24 EmitVertex(); 25 } 26 EndPrimitive (); 27 } 28 29 lipping = true; 30 for(int i =0; i < 3; ++i){ 31 position[ i ℄ = modelviewprojetionmatrix 32 * gl_PositionIn [i ℄; 33 if(position[ i ℄.x>width || position[ i ℄.x<0 || 34 position[ i ℄.y <0 || position[ i ℄.y>height){ 35 lipping == false ; 36 } 37 } 38 if(lipping ==true){ 39 for(int i =0; i < 3; ++i){ 40 gl_Position = position[ i ℄ + ve4(width ,0,0 ,0);
41 gl_TexCoord[0℄ = gl_TexCoordIn[ i ℄[0℄;
42 EmitVertex();
43 }
44 EndPrimitive ();
45 }
46 }
La limite de ette solution est double : d'un té le fait d'appliquer un lipping sur
les triangles peut provoquer des disparitions ou des apparitions subites de faettes aux
frontières de la zone de rendu (la solution qui onsiste à trouver le sous triangle
orre-spondantaudéoupageseraittropgourmandeen tempsde aluls),d'unautreté,ilya
lataillede la texture. Selon lesaratéristiquesdes artes graphiques, lataillemaximale
des textures utilisables est variable. Il se peut don que ertaines artes graphiques ne
permettentpas de doublerla taillede la texture.
Latroisièmesolutionpourraitêtrequaliéed'antiipation,arellen'estpasappliable
pour le moment, mais pourrait le devenir dans un avenir prohe ave le développement
de nouveaux pilotes pour les artes graphiques. Le prinipe de ette solution est de faire
notre propre test de profondeur dans le geometry shader en enregistrant la profondeur
d'unfragmentdans savaleuralpha. Pour haque nouveau fragment,il sut de omparer
saprofondeurà ellestokée dans latexture de rendu.Enonséquene,il estsoitéliminé
soit érit dans la texture de rendu à la plae du préèdent. C'est e méanisme de