#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 ).
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
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
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
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