Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/11/2007, à 10:50

pierre_lenain

[OpenGl] (et SDL) Rien ne s'affiche !

Bonjour !

Pris d'une subite inspiration , j'ai décidé de me lancer dans la programation opengl ... probleme, ca ne fonctionne pas !

prenons le code suivant:

#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>

#define LARGEUR_BASE 50
#define HAUTEUR_BASE 20

#define LARGEUR_BRAS_1 150
#define HAUTEUR_BRAS_1 15

#define LARGEUR_BRAS_2 50
#define HAUTEUR_BRAS_2 10

#define TAILLE_CAISSE 10

#define LARGEUR_ECRAN (LARGEUR_BASE + LARGEUR_BRAS_1 + HAUTEUR_BRAS_2 + 50)
#define HAUTEUR_ECRAN (HAUTEUR_BASE + LARGEUR_BRAS_1 + HAUTEUR_BRAS_2 + 50)

int main(int argc, char *argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    SDL_WM_SetCaption("Mon premier programme OpenGL !",NULL);
    SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, 32, SDL_OPENGL);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,LARGEUR_ECRAN,0,HAUTEUR_ECRAN);

    SDL_EnableKeyRepeat(10,10);

    bool continuer = true;
    SDL_Event event;
    int angle1 = 45, angle2 = -20, longueur = 50;

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
            continuer = false;
            break;
            case SDL_KEYDOWN:
            switch (event.key.keysym.sym)
            {
                case SDLK_UP:
                longueur --;
                if (longueur < 10)
                    longueur = 10;
                break;
                case SDLK_DOWN:
                longueur ++;
                if (longueur > 100)
                    longueur = 100;
                break;
                case SDLK_LEFT:
                if ((event.key.keysym.mod & KMOD_LSHIFT) == KMOD_LSHIFT)
                {
                    angle1++;
                    if (angle1 > 90)
                        angle1 = 90;
                }
                else
                {
                    angle2++;
                    if (angle2 > 90)
                        angle2 = 90;
                }
                break;
                case SDLK_RIGHT:
                if ((event.key.keysym.mod & KMOD_LSHIFT) == KMOD_LSHIFT)
                {
                    angle1--;
                    if (angle1 < 10)
                        angle1 = 10;
                }
                else
                {
                    angle2--;
                    if (angle2 < -90)
                        angle2 = -90;
                }
                break;
            }
            break;
        }

        glClear(GL_COLOR_BUFFER_BIT);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glTranslated(25,25,0);

        glBegin(GL_QUADS);
        glColor3ub(255,127,0);
        glVertex2d(0,0);
        glVertex2d(LARGEUR_BASE,0);
        glVertex2d(LARGEUR_BASE,HAUTEUR_BASE);
        glVertex2d(0,HAUTEUR_BASE);
        glColor3ub(255,255,0);
        glEnd();

        glTranslated(LARGEUR_BASE/2,HAUTEUR_BASE,0);
        glRotated(angle1,0,0,1);

        glBegin(GL_QUADS);
        glVertex2d(0,-HAUTEUR_BRAS_1/2);
        glVertex2d(LARGEUR_BRAS_1,-HAUTEUR_BRAS_1/2);
        glVertex2d(LARGEUR_BRAS_1,HAUTEUR_BRAS_1/2);
        glVertex2d(0,HAUTEUR_BRAS_1/2);
        glColor3ub(127,255,0);
        glEnd();

        glTranslated(LARGEUR_BRAS_1,0,0);
        glRotated(angle2,0,0,1);

        glBegin(GL_QUADS);
        glVertex2d(0,-HAUTEUR_BRAS_2/2);
        glVertex2d(LARGEUR_BRAS_2,-HAUTEUR_BRAS_2/2);
        glVertex2d(LARGEUR_BRAS_2,HAUTEUR_BRAS_2/2);
        glVertex2d(0,HAUTEUR_BRAS_2/2);
        glColor3ub(255,255,255);
        glEnd();

        glTranslated(LARGEUR_BRAS_2,0,0);
        glRotated(-angle1-angle2,0,0,1);

        glBegin(GL_LINES);
        glVertex2d(0,0);
        glVertex2d(0,-longueur);
        glColor3ub(0,255,0);
        glEnd();

        glTranslated(0,-longueur-TAILLE_CAISSE/2,0);

        glBegin(GL_QUADS);
        glVertex2d(-TAILLE_CAISSE/2,-TAILLE_CAISSE/2);
        glVertex2d(-TAILLE_CAISSE/2,TAILLE_CAISSE/2);
        glVertex2d(TAILLE_CAISSE/2,TAILLE_CAISSE/2);
        glVertex2d(TAILLE_CAISSE/2,-TAILLE_CAISSE/2);
        glEnd();

        glFlush();
        SDL_GL_SwapBuffers();
    }

    SDL_Quit();

    return 0;
}

(et il marche en tant normal ... il est tiré du siteduzero.com !)
compilons avec le make suivant :

SOURCES =	main.cpp
OBJECTS	=	$(SOURCES:.cpp=.o)
TARGET	=	sdlgl_test	
LIBS	=	$(shell sdl-config --libs) -lSDL_image -lGL -lGLU 

all: $(OBJECTS)
	g++ $(LIBS) -o $(TARGET) $(OBJECTS)

%o: %cpp
	g++ -o $@ -c $<

x: all
	./$(TARGET)

clean:
	rm -rf $(OBJECTS)

superclean : clean
	rm -rf $(TARGET)

(make standard, toujours tiré du sdz !)
compilation, pas de probleme. execution, fenetre vide. j'ai bien installé la sdl et elle fonctionne bien. j'ai testé d'autres codes avec opengl et sdl, meme probleme. je n'ai pas essayé de code avec opengl tout cours parce que il font tous appel a la windows.h ...

Vous pouvre m'aider ? merci !!!!!!!!!!


Linux ne peut changer le monde seul ... Alors aidons le!
Software is like the sex, it's better if it's free !
Tux, parce que je le vaut bien !
--- Pierre !

Hors ligne

#2 Le 25/11/2007, à 11:05

teto

Re : [OpenGl] (et SDL) Rien ne s'affiche !

Ca fait lgtps que j'ai plus toucher à  opengl donc je ne saurais de dire exactement mais voici qques pistes:
-Essaye d'enlever ton glClear pour voir si qque chose s'affiche.Si oui essaye de le mettre juste avant ton SDL_GL_SwapBuffers()
-vérifie bien que toutes tes coordonnées rentrent dans ton écran ( vérifier l'ordre de définition des coordonnées dans GluOrtho )

Bonne chance opengl ca rox ^^


La révolution est en marche.

Hors ligne

#3 Le 25/11/2007, à 11:19

robrob

Re : [OpenGl] (et SDL) Rien ne s'affiche !

J'ai compilé directement avec:
g++ -o main main.cpp -lSDL -lGL -lGLU

Et ça fonctionne. Je penche donc pour un problème de drivers ou autre (compiz...)?

Dernière modification par robrob (Le 25/11/2007, à 11:20)

Hors ligne

#4 Le 25/11/2007, à 11:28

pierre_lenain

Re : [OpenGl] (et SDL) Rien ne s'affiche !

je n'ai pas compiz pk ?
c'est ma carte graphique !
mais il y a longtemps, j'ai essayé sur une 6.10 qu'y avait sur mon pc et ca marchait ...
qu'est ce qui a changé depuis !


Linux ne peut changer le monde seul ... Alors aidons le!
Software is like the sex, it's better if it's free !
Tux, parce que je le vaut bien !
--- Pierre !

Hors ligne

#5 Le 25/11/2007, à 20:02

robrob

Re : [OpenGl] (et SDL) Rien ne s'affiche !

Ca peut venir aussi de différences de comportement au niveau des pilotes. Par exemple le code ne définie pas d'éclairage, ça passe chez moi, mais peut-être qu'avec un autre pilote ou une autre carte graphique ça coince.

Essaye de rajouter un glDisable(GL_LIGHTING);
(à  placer par exemple après le gluOrtho2D(0,LARGEUR_ECRAN,... )

Dernière modification par robrob (Le 25/11/2007, à 20:03)

Hors ligne

#6 Le 25/11/2007, à 21:57

pierre_lenain

Re : [OpenGl] (et SDL) Rien ne s'affiche !

Alors pour l'info, glxgears fonctionne très bien. 2 questions: j'peux avoir les source de glxgears? et comme je croix que le prob viend de sdl, y'a moyen d'utiliser opengl avec une autre lib comme gtk ou qt?


Linux ne peut changer le monde seul ... Alors aidons le!
Software is like the sex, it's better if it's free !
Tux, parce que je le vaut bien !
--- Pierre !

Hors ligne

#7 Le 25/11/2007, à 22:09

robrob

Re : [OpenGl] (et SDL) Rien ne s'affiche !

Tu as essayé d'ajouter glDisable(GL_LIGHTING)?*

Sinon oui tu peux avoir le code source de glxgears, de mémoire le paquet o๠il se trouve est mesa-utils (ou libmesa-utils ou un truc du genre lol).
Oui tu peux utiliser opengl avec une autre lib, glut par exemple.

*ne pas définir de lumière revient à  se reposer sur la comportement par défaut de l'implémentation opengl. Ca me semble assez risqué.

Hors ligne

#8 Le 26/11/2007, à 18:55

pierre_lenain

Re : [OpenGl] (et SDL) Rien ne s'affiche !

Si je te dis 'que dale rien du tout'.
bon. 2 choses: est ce que quelqun peut poster un code d'exemple opengl-glut que je le compile pour voir? merci!  2. y parrait que les cartes graphiques savage font de la résistance. j'ai trouvé un driver spécial mais j'ai pas le temps aujourd'hui pour faire ce qui est demandé! donc poster vos msg tout en sachant qu'il est possible que le problème vienne de la et soit ainsi résolu. merci
note: j'veux bien le code quand mème!


Linux ne peut changer le monde seul ... Alors aidons le!
Software is like the sex, it's better if it's free !
Tux, parce que je le vaut bien !
--- Pierre !

Hors ligne

#9 Le 26/11/2007, à 20:43

robrob

Re : [OpenGl] (et SDL) Rien ne s'affiche !

Pour glxgears tu as le code source ici:
http://debian.mirror.inra.fr/debian/pool/main/m/mesa-utils/
(mesa-utils_6.3.2.orig.tar.gz)
Il y a 3 versions dans l'archive (glxgears.c / glxgears2.c glxgears_fbconfig.c) je ne sais pas laquelle est la bonne.

Pour glut, voici un code d'exemple tiré du site de NeHe:
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=05
Ce n'est pas du grand code, mais ça fonctionne à  peu près (modulo quelques bugs d'affichage).

Je remet le code ici, car le code proposé pour glut a été prévu pour windows et j'ai fait les petits changement nécessaires pour qu'il se compile sous nunux (à  compiler avec gcc -o test test.cpp -lGL -lglut):

/*
When creating your project, uncheck OWL,
uncheck Class Library, select Static
instead of Dynamic and change the target
model to Console from GUI.
Also link glut.lib to your project once its done.
*/

#include <stdio.h>
#include <stdlib.h>
#include <GL/gl.h>     // The GL Header File
#include <GL/glut.h>   // The GL Utility Toolkit (Glut) Header

float	rtri;						// Angle For The Triangle
float	rquad;						// Angle For The Quad


void InitGL ( GLvoid )     // Create Some Everyday Functions
{

	glShadeModel(GL_SMOOTH);							// Enable Smooth Shading
	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);				// Black Background
	glClearDepth(1.0f);									// Depth Buffer Setup
	glEnable(GL_DEPTH_TEST);							// Enables Depth Testing
	glDepthFunc(GL_LEQUAL);								// The Type Of Depth Testing To Do
	glEnable(GL_COLOR_MATERIAL);
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

void display ( void )   // Create The Display Function
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Clear Screen And Depth Buffer
   glLoadIdentity();									// Reset The Current Modelview Matrix
   glPushMatrix();
	glTranslatef(-1.5f,0.0f,-6.0f);						// Move Left 1.5 Units And Into The Screen 6.0
   glRotatef(rtri,0.0f,1.0f,0.0f);				// Rotate The Triangle On The Y axis
	glBegin(GL_TRIANGLES);								// Drawing Using Triangles
		glColor3f(1.0f,0.0f,0.0f);			// Red
		glVertex3f( 0.0f, 1.0f, 0.0f);			// Top Of Triangle (Front)
		glColor3f(0.0f,1.0f,0.0f);			// Green
		glVertex3f(-1.0f,-1.0f, 1.0f);			// Left Of Triangle (Front)
		glColor3f(0.0f,0.0f,1.0f);			// Blue
		glVertex3f( 1.0f,-1.0f, 1.0f);			// Right Of Triangle (Front)
		glColor3f(1.0f,0.0f,0.0f);			// Red
		glVertex3f( 0.0f, 1.0f, 0.0f);			// Top Of Triangle (Right)
		glColor3f(0.0f,0.0f,1.0f);			// Blue
		glVertex3f( 1.0f,-1.0f, 1.0f);			// Left Of Triangle (Right)
		glColor3f(0.0f,1.0f,0.0f);			// Green
		glVertex3f( 1.0f,-1.0f, -1.0f);			// Right Of Triangle (Right)
      glColor3f(1.0f,0.0f,0.0f);			// Red
		glVertex3f( 0.0f, 1.0f, 0.0f);			// Top Of Triangle (Back)
		glColor3f(0.0f,1.0f,0.0f);			// Green
		glVertex3f( 1.0f,-1.0f, -1.0f);			// Left Of Triangle (Back)
		glColor3f(0.0f,0.0f,1.0f);			// Blue
		glVertex3f(-1.0f,-1.0f, -1.0f);			// Right Of Triangle (Back)
		glColor3f(1.0f,0.0f,0.0f);			// Red
		glVertex3f( 0.0f, 1.0f, 0.0f);			// Top Of Triangle (Left)
		glColor3f(0.0f,0.0f,1.0f);			// Blue
		glVertex3f(-1.0f,-1.0f,-1.0f);			// Left Of Triangle (Left)
		glColor3f(0.0f,1.0f,0.0f);			// Green
		glVertex3f(-1.0f,-1.0f, 1.0f);			// Right Of Triangle (Left)
    glEnd();											// Finished Drawing The Triangle

	glLoadIdentity();					// Reset The Current Modelview Matrix
    glTranslatef(1.5f,0.0f,-6.0f);				// Move Right 1.5 Units And Into The Screen 6.0
	glRotatef(rquad,1.0f,0.0f,0.0f);			// Rotate The Quad On The X axis
	glColor3f(0.5f,0.5f,1.0f);							// Set The Color To Blue One Time Only
	glBegin(GL_QUADS);									// Draw A Quad
		glColor3f(0.0f,1.0f,0.0f);			// Set The Color To Blue
		glVertex3f( 1.0f, 1.0f,-1.0f);			// Top Right Of The Quad (Top)
		glVertex3f(-1.0f, 1.0f,-1.0f);			// Top Left Of The Quad (Top)
		glVertex3f(-1.0f, 1.0f, 1.0f);			// Bottom Left Of The Quad (Top)
		glVertex3f( 1.0f, 1.0f, 1.0f);			// Bottom Right Of The Quad (Top)
		glColor3f(1.0f,0.5f,0.0f);			// Set The Color To Orange
		glVertex3f( 1.0f,-1.0f, 1.0f);			// Top Right Of The Quad (Bottom)
		glVertex3f(-1.0f,-1.0f, 1.0f);			// Top Left Of The Quad (Bottom)
		glVertex3f(-1.0f,-1.0f,-1.0f);			// Bottom Left Of The Quad (Bottom)
		glVertex3f( 1.0f,-1.0f,-1.0f);			// Bottom Right Of The Quad (Bottom)
		glColor3f(1.0f,0.0f,0.0f);			// Set The Color To Red
		glVertex3f( 1.0f, 1.0f, 1.0f);			// Top Right Of The Quad (Front)
		glVertex3f(-1.0f, 1.0f, 1.0f);			// Top Left Of The Quad (Front)
		glVertex3f(-1.0f,-1.0f, 1.0f);			// Bottom Left Of The Quad (Front)
		glVertex3f( 1.0f,-1.0f, 1.0f);			// Bottom Right Of The Quad (Front)
		glColor3f(1.0f,1.0f,0.0f);			// Set The Color To Yellow
		glVertex3f( 1.0f,-1.0f,-1.0f);			// Bottom Left Of The Quad (Back)
		glVertex3f(-1.0f,-1.0f,-1.0f);			// Bottom Right Of The Quad (Back)
		glVertex3f(-1.0f, 1.0f,-1.0f);			// Top Right Of The Quad (Back)
		glVertex3f( 1.0f, 1.0f,-1.0f);			// Top Left Of The Quad (Back)
		glColor3f(0.0f,0.0f,1.0f);			// Set The Color To Blue
		glVertex3f(-1.0f, 1.0f, 1.0f);			// Top Right Of The Quad (Left)
		glVertex3f(-1.0f, 1.0f,-1.0f);			// Top Left Of The Quad (Left)
		glVertex3f(-1.0f,-1.0f,-1.0f);			// Bottom Left Of The Quad (Left)
		glVertex3f(-1.0f,-1.0f, 1.0f);			// Bottom Right Of The Quad (Left)
		glColor3f(1.0f,0.0f,1.0f);			// Set The Color To Violet
		glVertex3f( 1.0f, 1.0f,-1.0f);			// Top Right Of The Quad (Right)
		glVertex3f( 1.0f, 1.0f, 1.0f);			// Top Left Of The Quad (Right)
		glVertex3f( 1.0f,-1.0f, 1.0f);			// Bottom Left Of The Quad (Right)
		glVertex3f( 1.0f,-1.0f,-1.0f);			// Bottom Right Of The Quad (Right)
	glEnd();						// Done Drawing The Quad
  												// Done Drawing The Quad
  glPopMatrix();
   rtri+=0.2f;						// Increase The Rotation Variable For The Triangle ( NEW )
	rquad-=0.15f;						// Decrease The Rotation Variable For The Quad     ( NEW )


  glutSwapBuffers ( );
  // Swap The Buffers To Not Be Left With A Clear Screen
}

void reshape ( int width , int height )   // Create The Reshape Function (the viewport)
{
  if (height==0)										// Prevent A Divide By Zero By
	{
		height=1;										// Making Height Equal One
	}

	glViewport(0,0,width,height);						// Reset The Current Viewport

	glMatrixMode(GL_PROJECTION);						// Select The Projection Matrix
	glLoadIdentity();									// Reset The Projection Matrix

	// Calculate The Aspect Ratio Of The Window
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

	glMatrixMode(GL_MODELVIEW);							// Select The Modelview Matrix
	glLoadIdentity();									
}

void keyboard ( unsigned char key, int x, int y )  // Create Keyboard Function
{
  switch ( key ) {
    case 27:        // When Escape Is Pressed...
      exit ( 0 );   // Exit The Program
      break;        // Ready For Next Case
    default:        // Now Wrap It Up
      break;
  }
}

void arrow_keys ( int a_keys, int x, int y )  // Create Special Function (required for arrow keys)
{
  switch ( a_keys ) {
    case GLUT_KEY_UP:     // When Up Arrow Is Pressed...
      glutFullScreen ( ); // Go Into Full Screen Mode
      break;
    case GLUT_KEY_DOWN:               // When Down Arrow Is Pressed...
      glutReshapeWindow ( 500, 500 ); // Go Into A 500 By 500 Window
      break;
    default:
      break;
  }
}


int main ( int argc, char** argv )   // Create Main Function For Bringing It All Together
{
  glutInit            ( &argc, argv ); // Erm Just Write It =)
  glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE ); // Display Mode
  glutInitWindowSize  ( 500, 500 ); // If glutFullScreen wasn't called this is the window size
  glutCreateWindow    ( "NeHe's OpenGL Framework" ); // Window Title (argv[0] for current directory as title)
//   glutFullScreen      ( );          // Put Into Full Screen
  InitGL ();
  glutDisplayFunc     ( display );  // Matching Earlier Functions To Their Counterparts
  glutReshapeFunc     ( reshape );
  glutKeyboardFunc    ( keyboard );
  glutSpecialFunc     ( arrow_keys );
  glutIdleFunc		  ( display );
  glutMainLoop        ( );          // Initialize The Main Loop
	
	return 0;
}

Hors ligne

#10 Le 28/11/2007, à 19:22

pierre_lenain

Re : [OpenGl] (et SDL) Rien ne s'affiche !

Ca marche !!!
bon ben plus qu'a apprendre a ce servir de glut !
alors deux choses... est ce que quelqu'un aurait temporerement un code pour que le prog bouffe moins de cpu genre le SDL_Delay de la sdl ? (j'ai déja entendu parler de sleep c'est possible ??) et est ce que quelqu'un aurait l'adresse d'un bon tuto glut ??
merci !


Linux ne peut changer le monde seul ... Alors aidons le!
Software is like the sex, it's better if it's free !
Tux, parce que je le vaut bien !
--- Pierre !

Hors ligne

#11 Le 28/05/2008, à 10:05

Avicenne

Re : [OpenGl] (et SDL) Rien ne s'affiche !

J'ai eu le même problème hier : un code simple, une compilation parfaite, une fenêtre et... rien ne s'affiche sad

J'ai mis un peu temps avant de découvrir le problème : Les effets de bureaux!

Les effets étaient activé, du coup la fenêtre ne s'affiche pas en une seule fois. ce qui fait que ce qui est affiché par openGL se retrouve rapidement effacé car la fenêtre est redessinée wink

La solution?
- Désactiver les effets du bureau.
- Ajouter un SDL_Delay() avant de dessiner.

Voilà, j'espère que cela vous évitera une petite prise de tête avec votre PC smile

Hors ligne

#12 Le 28/05/2008, à 13:51

LittleWhite

Re : [OpenGl] (et SDL) Rien ne s'affiche !

Pour remplacer le SDL_Delay de la SDL quand j'utilise du GLUT je fais des gettimeofday et du usleep.

Je te laisse chercher de la doc car à chaque fois je m'inspire des pages de man ( faut installer le man, j'espère que tu l'as fais ).

Donc une méthode relativement bien ( que j'utilise ) pour faire une tempo assez bonne ( on peut ralentire à 60 FPS ) , et donc ne prends pas beaucoup de processeur.

fonction_de_dessin()
{
   start = gettimeofday()
   dessin de la scene
   end = gettimeofday()

   si ( end - start < 10 milli secondes )
      usleep(10 - ( end - start ))

}

C'est écrit vite fais mais c'est le principe
Par contre je crois que c'est compatible qu'avec les machines linux ( compatible POSIX )


Linux ou mourir
Pour avoir des problemes : demarrer Windows
Script de compression multi archive : http://forum.ubuntu-fr.org/viewtopic.php?id=225297

Hors ligne