Salut à tous.
J'ai un problème sur la pose de texture avec OpenGL.
Je suit le tuto suivant :
http://www.siteduzero.com/tutoriel-3-4956-les-textures.html
Après avoir galérer à trouver les bonnes librairies etc ...., mon programme ce crash en disant qu'il écrit dans un endroit ou il a pas le droit (erreur de segmentation).
Voilà ou ce passe l'erreur du code :
#include <cstdlib>
#include <stdlib.h>
void Dessiner();
double AngleX = 0, AngleZ = 0;
GLuint texture2;
GLuint texture1;
int main ( int argc, char** argv )
{
int LARGEUR_ECRAN = 640, HAUTEUR_ECRAN = 480;
SDL_Init(SDL_INIT_VIDEO);
SDL_WM_SetCaption("SDL GL Application", NULL);
SDL_Surface* ecran = SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, 32, SDL_OPENGL);
SDL_Flip(ecran);
bool continuer = true;
SDL_Event event;
glMatrixMode( GL_PROJECTION );
glLoadIdentity( );
gluPerspective(70,(double)LARGEUR_ECRAN/HAUTEUR_EC
RAN,
1,1000);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
const char* filename = "tiles_ctf05r.jpg";
texture1 = loadTexture("wood.jpg");
Il rentre dans loadTexture :
SDL_Surface * flipSurface(SDL_Surface * surface);
GLuint loadTexture(const char * filename,bool useMipMap)
{
GLuint glID;
SDL_Surface * picture_surface = NULL;
SDL_Surface *gl_surface = NULL;
SDL_Surface * gl_fliped_surface = NULL;
Uint32 rmask, gmask, bmask, amask;
picture_surface = IMG_Load(filename);
if (picture_surface == NULL){
const char* test = IMG_GetError();
return 0;
}
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
rmask = 0x000000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0xff000000;
SDL_PixelFormat format = *(picture_surface->format);
format.BitsPerPixel = 32;
format.BytesPerPixel = 4;
format.Rmask = rmask;
format.Gmask = gmask;
format.Bmask = bmask;
format.Amask = amask;
gl_surface = SDL_ConvertSurface(picture_surface,&format,SDL_SWS
URFACE);
gl_fliped_surface = flipSurface(gl_surface);
glGenTextures(1, &glID);
glBindTexture(GL_TEXTURE_2D, glID);
if (useMipMap)
{
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, gl_fliped_surface->w,
gl_fliped_surface->h, GL_RGBA,GL_UNSIGNED_BYTE,
gl_fliped_surface->pixels);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE
R,
GL_LINEAR_MIPMAP_LINEAR);
}
else
{
glTexImage2D(GL_TEXTURE_2D, 0, 4, gl_fliped_surface->w,
gl_fliped_surface->h, 0, GL_RGBA,GL_UNSIGNED_BYTE,
gl_fliped_surface->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
}
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTE
R,GL_LINEAR);
SDL_FreeSurface(gl_fliped_surface);
SDL_FreeSurface(gl_surface);
SDL_FreeSurface(picture_surface);
return glID;
}
int takeScreenshot(const char * filename)
{
GLint viewport[4];
Uint32 rmask, gmask, bmask, amask;
SDL_Surface * picture, * finalpicture;
glGetIntegerv(GL_VIEWPORT, viewport);
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
rmask = 0x000000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0xff000000;
picture = SDL_CreateRGBSurface(SDL_SWSURFACE,viewport[2],vie
wport[3],
32,
rmask, gmask, bmask, amask);
SDL_LockSurface(picture);
glReadPixels(viewport[0],viewport[1],viewport[2],v
iewport[3],GL_RGBA,
GL_UNSIGNED_BYTE,picture->pixels);
SDL_UnlockSurface(picture);
finalpicture = flipSurface(picture);
Il rentre dans flipSurface :
SDL_Surface * flipSurface(SDL_Surface * surface)
{
int current_line,pitch;
SDL_Surface * fliped_surface = SDL_CreateRGBSurface(SDL_SWSURFACE,
surface->w,surface->h,
surface->format->BitsPerPixel,
surface->format->Rmask,
surface->format->Gmask,
surface->format->Bmask,
surface->format->Amask);
SDL_LockSurface(surface);
SDL_LockSurface(fliped_surface);
pitch = surface->pitch;
for (current_line = 0; current_line < surface->h; current_line ++)
{
memcpy(&((unsigned char* )fliped_surface->pixels)[current_line*pitch],
&((unsigned char* )surface->pixels)[(surface->h - 1 -
current_line)*pitch],
pitch); <----------------- Ici
}
SDL_UnlockSurface(fliped_surface);
SDL_UnlockSurface(surface);
return fliped_surface;
}
A memcopy il y a une erreur de segmentation .... ça fait des heures et des heures que je cherche mais bon je ne sait comment résoudre ce problème.
Donc si vous avez la réponse, ou un moyen plus simple d'appliqué des textures n'hésitez pas =)
Premièrement poste ton code sur pastebin, ce sera plus agréable à lire pour nous.
Ensuite, qu'est-ce que tu cherches à faire avec ta fonction flipSurface ? A première vue, j'ai l'impression qu'elle fait un truc bien inutile...
Et bah je viens de faire un petit tour sur le site du zéro et ce tuto OpenGL m'a l'air absolument épouvantable...
Non seulement il est dépassé (car on ne code plus du tout comme ça en OpenGL depuis la sortie de la version 3.1 en 2009), mais en plus il fait l'impasse sur certains détails importants (la présentation du pipeline graphique par exemple...) et donne l'impression d'avoir été fait par quelqu'un qui apprenait OpenGL en même temps qu'il écrivait le tuto...
Et en plus le tuto ne va vraiment pas loin dans la présentation d'OpenGL (pas de matériaux, pas de lumières...).
Si tu veux vraiment faire de l'OpenGL trouve des tutos mieux foutus, ce lui là m'a l'air atroce ![]()
A priori, ce tuto suivant a l'air un peu mieux foutu et plus à jour, même s'il reste limité :
http://www.siteduzero.com/tutoriel-3-421554-introduction.html
Ok merci =)
Je suis pas d'accord, le tuto cité par l'auteur est pas si mal.
Pas si mal pour un truc du site du zero (car le second est tout aussi zero, c'est dingue cette mauvaise habitude qu'on les auteur de tuto a faire croire qu'ils connaissent tout quand ils connaissent rien).
Si tu veux des tutos sympa :
http://nehe.gamedev.net/
C'est simple, concis, mais complet, et les différentes possibilités sont abordé les une après les autre. A la fin des tutos tu trouve en plus le code pour différentes palteforme et langage... ![]()
Dommage que ce soit en anglais mais il à l'air très complet.
Je m'y mettrait après avoir bien utilisé la librairie SDL.
Merci =)
PS : Si vous avez d'autres site de tuto pour un débutant en créa jeux vidéo comme moi n'hésitez pas =D
(Je ne débute pas en programmation par contre)
"Si tu veux des tutos sympa :
http://nehe.gamedev.net/ "
+1 les tutos sur ce site sont de qualité, même si obsolètes (les fonctions glVertex(), glRotate(), glPushMatrix(), glMatrixMode(), etc. sont toutes dépréciées aujourd'hui).
"+1 les tutos sur ce site sont de qualité, même si obsolètes (les fonctions glVertex(), glRotate(), glPushMatrix(), glMatrixMode(), etc. sont toutes dépréciées aujourd'hui)."
oui mais bon, une chose après l'autre... ces fonctions facilitent quand meme l'apprentissage.
"oui mais bon, une chose après l'autre... ces fonctions facilitent quand meme l'apprentissage. "
Pas sûr. Mais je dis peut-être ça parce que j'ai appris sans.
Pour moi ces fonctions cachent le fonctionnement interne d'OpenGL, et du coup on ne comprends pas ce qu'on fait réellement. Je pense qu'un bon tuto OpenGL devrait commencer par introduire le rendu 2D (avec VAO ou VBO et shaders), puis seulement introduire les transformations géométriques pour passer en 3D. C'est plus lent comme apprentissage, plus complexe (car plus poussé mathématiquement), mais à mon avis beaucoup plus solide. C'est pour ça que je trouvais que le tuto SdZ que je citais plus haut n'était pas mauvais (même si je l'ai juste survolé et n'ai pas vérifié s'il y avait des erreurs).
Ca amene a la quaestion suivante: Y a t'il un bon cours ou tuto en ligne (francais ou anglais) pour de l'OpenGL moderne?
Personnellement, j'ai fait de l'openGL en 2004 et je n'ai jamais mis a jour mes competences. J'ai entendu que ca a beaucoup changer, mais concretement il y a une source simple pour me "mettre a niveau" (ou tout simplement un texte qui reprends tout correctement depus le debut).
PS: J'ai pas peur des details sordides.
Aldebran : je pense pas que utiliser glVertex etc soit un mal en soit...
C'est ni plus ni moins qu'une autre facon de passer les infos. Effectivement c'est sous optimal, mais ca c'est pas important au debut.
Commencer par vbo + shader c'est quand meme destine au maso quand on sait a quel point c'est dependant du driver!
Godrik : mmm j'ais pas d'url en tete comme ca, mais bon y'a pas non plus un changement radical. Tu n'as peut etre pas vu les shaders? (GLSL semble le plus interesant je pense).
J'ai toujours trouvé les tutos de Nehe assez imbuvables. Y'a une traduction FR des premiers sur developpez pour les intéressés : http://nehe.developpez.com/
Ceux-là sont plutôt bons :
http://en.wikibooks.org/wiki/OpenGL_Programming
http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Table-of-Contents.html
(En anglais bien sûr, mais ça ne gène aucun bon programmeur)
"Ca amene a la quaestion suivante: Y a t'il un bon cours ou tuto en ligne (francais ou anglais) pour de l'OpenGL moderne? "
Je sais qu'en livres, il y a ceux-ci :
http://www.amazon.fr/gp/product/0321773039/ref=s9_simh_gw_p14_d0_g14_i1?pf_rd_m=A1X6FK5RDHNB96&pf_rd_s=center-2&pf_rd_r=1P8R2PQV9D7BY3QFPNR6&pf_rd_t=101&pf_rd_p=463375533&pf_rd_i=405320
http://www.amazon.fr/OpenGL-SuperBible-Comprehensive-Tutorial-Reference/dp/0321712617/ref=sr_1_1?ie=UTF8&qid=1339970479&sr=8-1
En ligne ça devient plus compliqué de trouver des tutos sur l'OpenGL moderne. Je connaissais pas les liens cités par Awesome_Guiber mais ils ont l'air plutôt pas mal, surtout celui là http://en.wikibooks.org/wiki/OpenGL_Programming
"C'est ni plus ni moins qu'une autre facon de passer les infos. Effectivement c'est sous optimal, mais ca c'est pas important au debut. "
Non seulement c'est sous-optimal, mais en plus c'est obsolète. Techniquement on ne doit plus utilisé ces fonctions (celles du pipeline fixe), elles ont été retirées des spécifications OpenGL depuis la version 3.1.
Alors autant commencer dès le début à avoir les bonnes pratiques. En plus celles-ci montrent bien le fonctionnement d'OpenGL et permettent de mieux maîtriser et appréhender ce qu'on fait. C'est quand même mieux quand on apprend de ne pas se retrouver face à des fonctions "magiques" mais de comprendre exactement ce qu'on fait, sinon on finit inévitablement par ne pas savoir comment obtenir un résultat spécifique juste parce qu'on ne comprends pas en détail le fonctionnement de 75% des fonctions qu'on a l'habitude d'utiliser.
"Commencer par vbo + shader c'est quand meme destine au maso quand on sait a quel point c'est dependant du driver! "
J'ai jamais eu de problèmes spécifiques aux drivers, même en ayant codé sous différentes machines ayant différentes cartes graphiques. A mon avis, faut vraiment aller dans des trucs poussés pour avoir des soucis liés au driver de la carte graphique : pour afficher un cube coloré, on ne devrait pas avoir de problèmes ![]()
"J'ai jamais eu de problèmes spécifiques aux drivers, même en ayant codé sous différentes machines ayant différentes cartes graphiques."
tu n'as que 21ans, ca viendra sur des gros (vrai) projets ;)
Je n'ai jamais vu opengl en entier. Juste les polygone, le z buffer, l'eclairage (et normales au surface), naturellement les transformation, viewport en empilement de matrices.
Apres ca, j'ai fait un peu de CUDA recement, mais ca n'a pas grand chose a voir.
godrik: ben regarde les deux liens donné Awesome_Guiber, je pense que tu y trouvera de quoi compléter tes connaissances
(le OpenGL Programming sur wikibook est pas mal).
http://www.mbsoftworks.sk/index.php?page=tutorials&series=1