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

SDL Discussion :

[SDL allié à OpenGL] Problème l'écran n'affiche rien


Sujet :

SDL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 13
    Points : 10
    Points
    10
    Par défaut [SDL allié à OpenGL] Problème l'écran n'affiche rien
    Bonjour, en fait j'aurais un petit soucis, et je crois que mon problème ne doit pas être posé tous les jours...
    En fait je cherche à crée un programme qui affiche un cube qui tourne sous OpenGL (je m'entraine pour l'instant...).
    Alors du coup faut que je fasse une animation, et je souhaiterai rappeler la fonction dessiner() toutes les 1000/60 milisecondes, pour ce au lieu de crée un timer qui met en pause ma fonction, je préfère utiliser SDL_AddTimer() pour rappeler la fonction dessin()...

    main.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef _MAIN_
    #define _MAIN_
     
    #define LARGEUR_ECRAN 800
    #define HAUTEUR_ECRAN 600
     
    #endif
    main.cpp
    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
     
    #include <iostream>
    #include <SDL/SDL.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include "objets.h"
    #include "main.h"
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
    	SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER); //on initialise la vide et les timers en SDL...
    	atexit(SDL_Quit);
    	SDL_Surface *ecran = NULL;
    	double Angle=0; //on crée un variable angle
    	ecran = SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, 32, SDL_OPENGL); //on initialise l'écran
    	glEnable(GL_DEPTH_TEST); //on initialise le Z-Buffer
    	glMatrixMode(GL_PROJECTION); //on se place dans la bonne matrice
    	glLoadIdentity(); //on initialise la matrice
    	gluPerspective(70, (double)(LARGEUR_ECRAN/HAUTEUR_ECRAN), 1, 1000); //on initialise la camera
    	SDL_TimerID timer = SDL_AddTimer(1000/60, dessin, &Angle); //on crée le callback
     
    	/*On attend l'évènement soit on appuie sur la croix, sur sur echap*/
    	SDL_Event event;
    	while(1)
    	{
    		SDL_PollEvent(&event);
    		switch(event.type)
    		{
    			case SDL_QUIT:
    				exit(EXIT_SUCCESS);
    			break;
    			case SDL_KEYDOWN:
    				switch(event.key.keysym.sym)
    				{
    					case SDLK_ESCAPE:
    						exit(EXIT_SUCCESS);
    					break;
    					default:
    					break;
    				}
    			break;
    		}
    		Angle++;
    		//dessin(3*Angle, 7*Angle);
    	}
     
    	/*On vide la mémoire*/
    	SDL_RemoveTimer(timer);
    	SDL_Quit();
    	return EXIT_SUCCESS;
    }
    objets.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef _OBJETS_
    #define _OBJETS_
     
    #include "main.h"
     
    #define COTE 1 //sert à dessiner le cube
    #define TAILLE 1 //sert à dessiner le cube
     
    Uint32 dessin(Uint32, void*);
     
    #endif
    objets.cpp
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include "objets.h"
     
    Uint32 dessin(Uint32 interval, void* parametre)
    {
     
    	double* Angle=(double*)parametre; //On prend le paramètre, et on le place dans un variable adaptée
    	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //on vide le buffer
    	glMatrixMode( GL_MODELVIEW ); //on se place dans la bonne matrice
    	glLoadIdentity( ); //On réinitialise la matrice
    	gluLookAt(4,3,2,0,0,0,0,0,1); //on place la camera
    	glRotated(*AngleZ, 0, 0, 1); //on fait tourner le cube selon l'axe Z
    	glRotated(*AngleY, 1, 0, 0); //on fait tourner le cube selon l'axe X
     
    	/*On dessine le cube*/
    	glBegin(GL_QUADS);
    		glColor3ub(255,0,0); //face +x
    		glVertex3d( COTE, TAILLE, TAILLE);
    		glVertex3d( COTE,-TAILLE, TAILLE);
    		glVertex3d( COTE,-TAILLE,-TAILLE);
    		glVertex3d( COTE, TAILLE,-TAILLE);
    		glColor3ub(0,255,0); //face +y
    		glVertex3d( TAILLE, COTE, TAILLE);
    		glVertex3d(-TAILLE, COTE, TAILLE);
    		glVertex3d(-TAILLE, COTE,-TAILLE);
    		glVertex3d( TAILLE, COTE,-TAILLE);
    		glColor3ub(0,0,255); //face -x
    		glVertex3d(-COTE, TAILLE, TAILLE);
    		glVertex3d(-COTE,-TAILLE, TAILLE);
    		glVertex3d(-COTE,-TAILLE,-TAILLE);
    		glVertex3d(-COTE, TAILLE,-TAILLE);
    		glColor3ub(255,255,0); //face +z
    		glVertex3d( TAILLE, TAILLE, COTE);
    		glVertex3d(-TAILLE, TAILLE, COTE);
    		glVertex3d(-TAILLE,-TAILLE, COTE);
    		glVertex3d( TAILLE,-TAILLE, COTE);
    		glColor3ub(0,255,255); //face -y
    		glVertex3d( TAILLE,-COTE, TAILLE);
    		glVertex3d(-TAILLE,-COTE, TAILLE);
    		glVertex3d(-TAILLE,-COTE,-TAILLE);
    		glVertex3d( TAILLE,-COTE,-TAILLE);
    		glColor3ub(255,0,255); //face -z
    		glVertex3d( TAILLE, TAILLE,-COTE);
    		glVertex3d(-TAILLE, TAILLE,-COTE);
    		glVertex3d(-TAILLE,-TAILLE,-COTE);
    		glVertex3d( TAILLE,-TAILLE,-COTE);
    	glEnd();
     
    	/*Puis on rafraîchis l'écran*/
    	glFlush();
    	SDL_GL_SwapBuffers();
     
    	return interval;
    }
    Et voila mon MakeFile:
    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
     
    OBJECTS = main.o objets.o
     
    install: all clean
     
    all: $(OBJECTS)
            g++ -Wall -o main $^ -lmingw32 -lopengl32 -lglu32 -lSDL -lSDLmain -lSDL.dll -LC:/SDL/lib
     
    main.o: main.cpp  main.h objets.h
            g++ -Wall -o $@ -c $< -IC:/SDL/include
     
    objets.o: objets.cpp main.h objets.h
            g++ -Wall -o $@ -c $< -IC:/SDL/include
     
    clean:
            del *.o *~
    Cependant tout ce qui s'affiche, c'est un écran noir...
    Je comprend pas, la fonction callback doit rappeler dessin toutes les 1000/60 millisecondes, Mais apparemment il ne fait rien , et si je place dessin dans le while ça marche pourtant...
    Je comprend pas. Aidez moi SVP...
    Merci d'avance...

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 892
    Points : 219 533
    Points
    219 533
    Billets dans le blog
    124
    Par défaut
    Bonjour,

    Je pense avoir trouver la solution.
    Sachez que faire un programme de ce genre, n'est pas rare. Par contre, il est un peu plus rare que les gens utilisent des timers.
    Du coup, j'ai du lire la documentation, qui dit:
    The timer callback function may run in a different thread than your main program, and so shouldn't call any functions from within itself. You may always call SDL_PushEvent, however.
    En français:
    La fonction de callback du timer peut être executé dans un thread différent que votre main, et donc vous ne pas appeler de fonction (SDL ?) dedans. Vous devez toujours appeler SDL_PushEvent, par contre.
    Ce que j'ose croire manquant (le SDL_PushEven)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Je crois que ouais, c'est ça le problème...
    Mais du coup je vois pas quoi faire, car SDL_PushEven sert probablement à la gestion des évènements tels qu'un appui sur une touche, ou un mouvement de souris...
    Je vois pas du tout quoi faire pour que ça marche...

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 892
    Points : 219 533
    Points
    219 533
    Billets dans le blog
    124
    Par défaut
    Comme je n'ai jamais utilisé de SDL_Timer, je vous conseille la lecture de ce tuto: http://loka.developpez.com/tutoriel/sdl/timer/
    Quoique, je me demande si cela utilise vraiment les SDL_Timer O_o ...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Et bien en fait, c'est encore des timer, ce qui fait que je reste dans un seul et unique processus, or, justement l'intérêt du callback, c'est que je pouvais crée deux processus différent qui s'exécutent en même temps, j'avais donc un processus qui modifiait les paramètres de mes objets (l'angle de rotation de mon cube dans mon cas), et l'autre qui rafraichissait l'écran automatiquement en fonction de ces paramètres...
    Par contre je crois que cette page me sera utile:
    http://loka.developpez.com/tutoriel/sdl/thread/
    Donc merci de votre aide...

  6. #6
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Comme je n'ai jamais utilisé de SDL_Timer, je vous conseille la lecture de ce tuto: http://loka.developpez.com/tutoriel/sdl/timer/
    Quoique, je me demande si cela utilise vraiment les SDL_Timer O_o ...
    [mode passage en coup de vent]
    Je confirme que le tuto n'utilise pas SDL_Timer mais simplement la création d'un timer en SDL.
    [/mode passage en coup de vent]

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

Discussions similaires

  1. [PC fixe] Ecran Noir (ACER Aspire Z3751) l'écran n'affiche rien ?
    Par hackoofr dans le forum Ordinateurs
    Réponses: 5
    Dernier message: 12/01/2014, 08h47
  2. problème de printf: n'affiche rien
    Par fomazou dans le forum Débuter
    Réponses: 15
    Dernier message: 21/04/2009, 15h09
  3. Problème d'écran noir openGL
    Par Elwood dans le forum OpenGL
    Réponses: 17
    Dernier message: 12/12/2007, 22h22
  4. Réponses: 3
    Dernier message: 23/08/2006, 12h29
  5. Afficher en SDL et en OpenGL sur un écran ?
    Par Tittom dans le forum API graphiques
    Réponses: 3
    Dernier message: 21/06/2006, 10h08

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