• Aucun résultat trouvé

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)

w

est la largeur de la fenêtre et

h

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 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

Documents relatifs