IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

affichage scintillant avec deux viewport


Sujet :

OpenGL

  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Santé

    Informations forums :
    Inscription : Août 2012
    Messages : 18
    Par défaut affichage scintillant avec deux viewport
    Bonjour,
    je veux dessiner 2 vues dans une même fenetre.
    j'ai donc écrit le code suivant (j'utilise SFML pour le fenetrage OpenGL)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
     
          // Request a 24-bits depth buffer when creating the window
    	sf::ContextSettings contextSettings;
    	contextSettings.depthBits = 24;
     
    	// Create the main window
    	sf::Window window(sf::VideoMode(640, 480), "SFML window with OpenGL", sf::Style::Default, contextSettings);
     
     
    	// Make it the active window for OpenGL calls
    	window.setActive();
     
    	//initialisation etats OPENGL
     
    	glClearDepth(1.f);
    	glClearColor(0.f, 0.f, 0.f, 1.f);
     
    	glEnable(GL_DEPTH_TEST);
    	glDepthMask(GL_TRUE);
     
            //   BOUCLE DES MESSAGES
     
    	while (window.isOpen())
    	{
    		// Process events
    		sf::Event event;
    		while (window.pollEvent(event))
    		{
     
    			if (event.type == sf::Event::Closed)
    				window.close();
     
    			if (event.type == sf::Event::KeyPressed)
    			{
    				switch (event.key.code)
    				{
    				case sf::Keyboard::Escape:
    				{
    					window.close();
    					break;
    				}
    				default: {}
    				}
    			}
     
    			if (event.type == sf::Event::Resized)
    				glViewport(0, 0, event.size.width, event.size.height);
    		}
     
     
    			//----------------------------------------
    			//  première viewport 500/480
    			//-----------------------------------------
     
     
    			glViewport(0, 0, 500, 480);	//xinfG,yinfG,Larg,Hauteur)
    			glMatrixMode(GL_PROJECTION);
    			glLoadIdentity();
    			gluPerspective(45.0f, (GLfloat)500 / (GLfloat)480, 0.1f, 100.0f);
    			glMatrixMode(GL_MODELVIEW);
    			glLoadIdentity();
    			gluLookAt(0.0, 0.0, -3.0,
    				0.0, 0.0, 0.0,
    				0.0, 1.0, 0.0);
     
    			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    			glColor3d(1.0, 0.0, 0.0);
    			glBegin(GL_QUADS);
    			glVertex3f(-1.0, -1.0, 0.0);	//IG
    			glVertex3f(1.0, -1.0, 0.0);		//ID
    			glVertex3f(1.0, 1.0, 0.0);		//SD
    			glVertex3f(-1.0, 1.0, 0.0);		//SG
    			glEnd();
     
    			window.display();   //swap
     
     
     
     
     
    			//------------------------------------
    			// second viewport
    			//------------------------------------
     
     
    			glViewport(500, 0, 140, 480);
    			glMatrixMode(GL_PROJECTION);
    			glLoadIdentity();
    			gluPerspective(45.0f, (GLfloat)500 / (GLfloat)480, 0.1f, 100.0f);
    			glMatrixMode(GL_MODELVIEW);
    			glLoadIdentity();
     
    			gluLookAt(0.0, 0.0, -3.0,
    				0.0, 0.0, 0.0,
    				0.0, 1.0, 0.0);
     
    			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
                            glColor3d(0.0, 1.0, 0.0);
    			glBegin(GL_QUADS);
    			glVertex3f(-1.0, -1.0, 0.0);	//IG
    			glVertex3f(1.0, -1.0, 0.0);		//ID
    			glVertex3f(1.0, 1.0, 0.0);		//SD
    			glVertex3f(-1.0, 1.0, 0.0);		//SG
    			glEnd();
     
    			window.display();    //swap
     
     
    	}
     
    	return 0;

    les deux dessins s'affichent bien dans leur viewport respective mais l'affichage clignote un maximum.
    Comment peut on éviter cela ?

    Merci pour votre aide.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 156
    Billets dans le blog
    151
    Par défaut
    Bonjour,

    La piste que je vois est que le glClear() (nettoyage du tampon), ne devrait être fait qu'une fois, au début du rendu. En effet, je ne pense pas que cette fonction prenne en compte le viewport, donc, elle nettoie l'intégralité du tampon.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Santé

    Informations forums :
    Inscription : Août 2012
    Messages : 18
    Par défaut
    Bonjour LittleWhite,

    Merci de m'avoir répondu.
    Malheureusement le fait de supprimer un glClear() ne change rien, ça clignote toujours autant.
    Par contre si je supprime un window.display(),cad que si je n'affiche que un seul viewport,ça ne clignote plus .
    voici le code qui ne clignote plus;
    ????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    int main()
    {
     
     
    	sf::ContextSettings contextSettings;
    	contextSettings.depthBits = 24;
    	sf::Window window(sf::VideoMode(640, 480), "SFML window with OpenGL", sf::Style::Default, contextSettings);
    	window.setActive();
     
    	//----------------------------
    	//initialisation etats OPENGL
    	//----------------------------
     
    	glClearDepth(1.f);
    	glClearColor(0.f, 0.f, 0.f, 1.f);
     
     
    	//-------------------------------------
    	// boucle des messages
    	//-------------------------------------
     
     
    	while (window.isOpen())
    	{
     
    		sf::Event event;
    		while (window.pollEvent(event))
    		{
     
    			if (event.type == sf::Event::Closed)
    				window.close();
    			if (event.type == sf::Event::KeyPressed)
    			{
    				switch (event.key.code)
    				{
    				case sf::Keyboard::Escape:
    				{
    					window.close();
    					break;
    				}
     
    				default: {}
    				}
    			}
    			if (event.type == sf::Event::Resized)
    				glViewport(0, 0, event.size.width, event.size.height);
    		}
     
     
    			//----------------------------------------
    			//  premier ecran 500/480
    			//-----------------------------------------
     
     
    			glViewport(0, 0, 500, 480);	//xinfG,yinfG,Larg,Hauteur)
    										//projection
    			glMatrixMode(GL_PROJECTION);
    			glLoadIdentity();
    			gluPerspective(45.0f, (GLfloat)500 / (GLfloat)480, 0.1f, 100.0f);
     
    			glMatrixMode(GL_MODELVIEW);
    			glLoadIdentity();
    			gluLookAt(0.0, 0.0, -3.0,
    				0.0, 0.0, 0.0,
    				0.0, 1.0, 0.0);
     
    			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    			glColor3d(1.0, 0.0, 0.0);
    			glPolygonMode(GL_FRONT_FACE, GL_LINE);
    			glBegin(GL_QUADS);
    			glVertex3f(-1.0, -1.0, 0.0);	//IG
    			glVertex3f(1.0, -1.0, 0.0);		//ID
    			glVertex3f(1.0, 1.0, 0.0);		//SD
    			glVertex3f(-1.0, 1.0, 0.0);		//SG
    			glEnd();
     
    			window.display();
     
     
    			//------------------------------------
    			// second ecran
    			//------------------------------------
     
    			glViewport(500, 0, 140, 480);
     
    			glMatrixMode(GL_PROJECTION);
    			glLoadIdentity();
    			gluPerspective(45.0f, (GLfloat)500 / (GLfloat)480, 0.1f, 100.0f);
     
    			glMatrixMode(GL_MODELVIEW);
    			glLoadIdentity();
     
    			gluLookAt(0.0, 0.0, -3.0,
    				0.0, 0.0, 0.0,
    				0.0, 1.0, 0.0);
     
    			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    			glColor3d(0.0, 1.0, 0.0);
    			glPolygonMode(GL_FRONT_FACE, GL_LINE);
    			glBegin(GL_QUADS);
    			glVertex3f(-1.0, -1.0, 0.0);	//IG
    			glVertex3f(1.0, -1.0, 0.0);		//ID
    			glVertex3f(1.0, 1.0, 0.0);		//SD
    			glVertex3f(-1.0, 1.0, 0.0);		//SG
    			glEnd();
     
    			//window.display();
     
    	}
     
    	return 0;
     
     
    }

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 156
    Billets dans le blog
    151
    Par défaut
    Ah oui. Le swap indique que vous donner l'ordre d'affichage de votre rendu à l'écran. Il ne faut le faire qu'une fois (comme le glClear), tout à la fin, lorsque l'image est prête.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Santé

    Informations forums :
    Inscription : Août 2012
    Messages : 18
    Par défaut
    Merci LittleWhite,

    ça marche !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Affichage Gridview avec deux paramétres
    Par ameura1 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 10/06/2016, 17h47
  2. Réponses: 3
    Dernier message: 07/05/2008, 11h25
  3. Affichage arborescence avec deux table
    Par hichamy dans le forum SQL
    Réponses: 8
    Dernier message: 09/01/2008, 21h00
  4. affichage d'une valeur en relation avec deux tables
    Par mealtone dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 04/08/2006, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo