Partage
  • Partager sur Facebook
  • Partager sur Twitter

Texture OpenGL

pb de compilation

Sujet résolu
4 juin 2007 à 10:30:53

slt tout le monde, je n'ai pas encore fait de C++ en fait, aprés avoir fini le C je suis passé a l'openGL mais arrivé au chapitre texture j'ai un pb de compilation, kay nous passe des fichiers au debut mais je n'ai pas vraiment compris se qu'il faut en fairee vu que si je les inclus le compilateur me dit qu'il y a des erreurs dedans et si je ne l'inclu pas le compileur ne reconnait pas loadTexture ^^ (sous dev)

voilà le code :

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

GLuint texture1; //en variable globale

void Dessiner();

int main(int argc, char *argv[])
{
    SDL_Event event;

    SDL_Init(SDL_INIT_VIDEO);
    atexit(SDL_Quit);
    SDL_WM_SetCaption("SDL GL Application", NULL);
    SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective(70,(double)640/480,1,1000);
    glEnable(GL_DEPTH_TEST);
   
    glEnable(GL_TEXTURE_2D);
    texture1 = loadTexture("stainedglass05.jpg");
   
    Dessiner();
   
    for (;;)
    {
        while (SDL_PollEvent(&event))
        {

            switch(event.type)
            {
                case SDL_QUIT:
                exit(0);
                break;
            }
        }


        Dessiner();

    }

    return 0;
}

void Dessiner()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity( );


    gluLookAt(3,4,2,0,0,0,0,0,1);

    glBindTexture(GL_TEXTURE_2D, texture1);
   
    glBegin(GL_QUADS);

    glColor3ub(255,0,0); //face avec une texture
    glTexCoord2d(0,1);  glVertex3d(1,1,1);
    glTexCoord2d(0,0);  glVertex3d(1,1,-1);
    glTexCoord2d(1,0);  glVertex3d(-1,1,-1);
    glTexCoord2d(1,1);  glVertex3d(-1,1,1);
    glEnd();

    glColor3ub(0,255,0); //face verte
    glVertex3d(1,-1,1);
    glVertex3d(1,-1,-1);
    glVertex3d(1,1,-1);
    glVertex3d(1,1,1);

    glColor3ub(0,0,255); //face bleue
    glVertex3d(-1,-1,1);
    glVertex3d(-1,-1,-1);
    glVertex3d(1,-1,-1);
    glVertex3d(1,-1,1);

    glColor3ub(255,0,255); //face violette
    glVertex3d(-1,1,1);
    glVertex3d(-1,1,-1);
    glVertex3d(-1,-1,-1);
    glVertex3d(-1,-1,1);

    glColor3ub(255,255,0); //face jaune
    glVertex3d(1,-1,-1);
    glVertex3d(1,1,-1);
    glVertex3d(-1,1,-1);
    glVertex3d(-1,-1,-1);
   
        glColor3ub(0,255,255); //face turquoise
    glVertex3d(1,-1,1);
    glVertex3d(1,1,1);
    glVertex3d(-1,1,1);
    glVertex3d(-1,-1,1);
   
    glEnd();

    glFlush();
    SDL_GL_SwapBuffers();
}


edit: si ça a une quelconque utilité je poste aussi les liens de l'editeur des options du projet

-lopengl32
-lglu32
-lmingw32
-lSDLmain
-lSDL
  • Partager sur Facebook
  • Partager sur Twitter
4 juin 2007 à 11:26:28

Si tu codes en C, normal qu'il détecte des erreurs, les fichiers sont en c++. Cela dit, très peu de trucs utilisent les fonctionnalités c++ et tu ne devrait pas avoir de mal à traduire ces fichiers en C.

Si tu ne veux utiliser que les textures, il ne faut garder que flipSurface et loadTexture comme fontions.

NOTE : puisqu'on est en C, il y a désormais un parametre obligatoire : le useMipMap, donc pour charger une texture, fait :

texture1 = chargerTexture("maTexture.png", 1)


#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <GL/gl.h>
#include <GL/glu.h>


#include "textures.h"



SDL_Surface* flipSurface(SDL_Surface* surface)

        {

        int currentLine;
        int pitch;

        SDL_Surface* flipedSurface;

        flipedSurface = 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(flipedSurface);


        pitch = surface->pitch;


        for (currentLine=0; currentLine<surface->h; currentLine++)

                {

                memcpy(&((unsigned char* )flipedSurface->pixels)[currentLine*pitch],

                       &((unsigned char* )surface->pixels)[(surface->h-1-currentLine)*pitch],

                       pitch);

                }



        SDL_UnlockSurface(flipedSurface);

        SDL_UnlockSurface(surface);


        return flipedSurface;

        }



GLuint chargerTexture(const char * filename, int useMipMap)

        {

        GLuint glID;

        SDL_Surface* picture_surface   = NULL;

        SDL_Surface* gl_surface        = NULL;

        SDL_Surface* gl_fliped_surface = NULL;

        Uint32 rmask;
        Uint32 gmask;
        Uint32 bmask;
        Uint32 amask;



        picture_surface = IMG_Load(filename);

        if (picture_surface == NULL)  return 0;



        if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
                {

                rmask = 0xff000000;

                gmask = 0x00ff0000;

                bmask = 0x0000ff00;

                amask = 0x000000ff;
                }

        else
                {

                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_SWSURFACE);

        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_FILTER,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_FILTER,GL_LINEAR);



        SDL_FreeSurface(gl_fliped_surface);

        SDL_FreeSurface(gl_surface);

        SDL_FreeSurface(picture_surface);



        return glID;

        }




A toi de modifier le .h (attention, la focntion s'appelle chargerTexture maintenant).



EDIT : les balises de codes se mettent à espacer le code automatiquement ? C'est pas que mais ça prend une place monstre comme ça :/
  • Partager sur Facebook
  • Partager sur Twitter
4 juin 2007 à 11:51:11

euh.... j'ai absolument rien compris ^u^ mais en fait c'est parce que les fichiers sont en C++ et que mon projet est en C ? Et pour resoudre ça il suffit pas de créer un nouveau programme en C++ au lieu de C ? ça m'arrangerai les seul trucs que j'ai compris c'est les fonctions sdl et les boucle (sans leur contenu :s ....)
  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2007 à 13:54:29

Salut !
Voici tes liens :
-lopengl32
-lglu32
-lmingw32
-lSDLmain
-lSDL

Il te manque SDL_image.
C'est normal qu'il ne reconnaisse pas loadTexture.
D'ailleurs tu as bien mis le include de SDL_image.h
  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2007 à 19:19:59

arf oki ^^
J'ai cherché SDL_Image dans les libs et je l'ai ajouté, maintenant le linker a :

-lopengl32
-lglu32
-lmingw32
-lSDLmain
-lSDL
../../../mingw32/lib/SDL_image.lib

mais j'ai la même erreur....
(j'ai toujours détesté cet "éditeur de liens" a chaque fois qu'on programme ne marche pas c'est parce que j'ai mal fait un truc dedans Oo et pk on met l devant une librairie ? c'est pour qu'il cherche tout seul les libs ?? ... ^^)
  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2007 à 23:12:01

Extrait du cours de C de M@teo21 ;)
Installer SDL_image



Téléchargement


Il y a une page spéciale sur le site de la SDL qui référence les librairies utilisant la SDL. Cette page s'intitule Libraries, vous trouverez un lien dans le menu de gauche.
Vous pourrez voir qu'il y a pas mal de librairies disponibles. Celles-ci ne proviennent pas des auteurs de la SDL généralement, ce sont plutôt des utilisateurs de la SDL qui proposent leurs librairies.
Certaines sont très bonnes et méritent le détour, d'autres sont moins bonnes et encore buggées. Il faut arriver à faire le tri ;)

Cherchez SDL_Image dans la liste...
Bon allez, je suis de bonne humeur : voici un lien direct vers la page de téléchargement de SDL_Image pour vous aider :p

Téléchargez la version de SDL_Image qui vous correspond dans la section Binary (ne prenez PAS la source, on n'en a pas besoin !)
Si vous êtes sous Windows téléchargez SDL_image-devel-1.2.4-VC6.zip même si vous n'utilisez pas Visual C++ !


Installation


Dans ce zip vous trouverez :

* SDL_image.h : le seul header dont a besoin la librairie SDL_image. Placez-le dans mingw32/include/SDL/, c'est-à-dire à côté des autres headers de la SDL.
* SDL_image.lib : placez-le dans mingw32/lib. Oui, je sais, je vous ai dit que normalement les .lib étaient des fichiers réservés à Visual, mais ici exceptionnellement le .lib fonctionnera même avec le compilateur mingw.
* Plusieurs DLL : placez-les toutes dans le dossier de votre projet (à côté de SDL.dll donc).


Ensuite, vous devez modifier les options de votre projet pour "linker" avec le fichier SDL_image.lib.

Si vous êtes sous Code::Blocks par exemple, allez dans le menu Projects / Build options. Dans l'onglet Linker, cliquez sur le bouton "Add" et indiquez où se trouve le fichier SDL_image.lib
Si on vous demande "Keep as a relative path ?", répondez ce que vous voulez ça ne changera rien dans l'immédiat. Je recommande de répondre "Non" personnellement :p

Ensuite, vous n'avez plus qu'à inclure le header SDL_image.h dans votre code source comme ceci :

Code : C
#include <SDL/SDL_image.h>


Et voilà, la librairie SDL_image devrait maintenant fonctionner (à condition que vous ayez bien fait exactement tout ce que j'ai indiqué bien sûr ;) )

Si vous êtes sous Dev-C++ ou Visual Studio, la manipulation est quasiment la même. Si vous avez réussi à installer la SDL, vous n'aurez aucun problème pour installer SDL_image ;)
  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2007 à 0:34:37

oui mais j'avais deja refait cette prti du cour pour vérifier et je l'ai encore fait mais tt est bon....

edit
-----

=> j'ai le header avec #include <SDL/SDL_image.h>

=> toute les dlls son dans le dossier

=> le linker est a jour ex:

-lopengl32
-lglu32
-lmingw32
-lSDLmain
-lSDL
C:/Dev-Cpp/mingw32/lib/SDL_image.lib


donc il faut surment inclure #include "sdlglutils.h" mais si je l'inclu (le projet doit etre en C car certanes formulation echappe au compileur

sdlglutils.h
------------

#ifndef SDLGLUTILS_H
#define SDLGLUTILS_H

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

#ifndef GL_CLAMP_TO_EDGE
#define GL_CLAMP_TO_EDGE 0x812F
#endif

GLuint loadTexture(const char * filename,bool useMipMap = true);
int takeScreenshot(const char * filename);
void drawAxis(double scale = 1);
int initFullScreen(unsigned int * width = NULL,unsigned int * height = NULL);
int XPMFromImage(const char * imagefile, const char * XPMfile);
SDL_Cursor * cursorFromXPM(const char * xpm[]);

#endif //SDLGLUTILS_H



log de compilation (ac #include "sdlglutils.h")
-------------------

Compilateur: Default compiler
Building Makefile: "C:\Dev-Cpp\projets\Projets Open GL\Texture\Makefile.win"
Exécution de  make...
make.exe -f "C:\Dev-Cpp\projets\Projets Open GL\Texture\Makefile.win" all
gcc.exe -c main.c -o main.o -I"C:/Dev-Cpp/include"    -w

In file included from main.c:7:
sdlglutils.h:11: error: syntax error before "bool"
sdlglutils.h:13: error: syntax error before '=' token
sdlglutils.h:14: error: syntax error before '=' token

make.exe: *** [main.o] Error 1

Exécution terminée

dites moi si quelque chose cloche moi je vais voir en recréer un proojet C++ ; les fautes trouvée n'ont pas l'air dur a traduire en C mais je n'ai pas envi de changer le sens ^^

Alors avec le compilateur en C++ je n'ai plus les erreurs précédente mais j'en ai encore une ^^' je poste le log


log de compilation (ac #include "sdlglutils.h") en C++
------------------

Compilateur: Default compiler
Building Makefile: "C:\Dev-Cpp\projets\Projets Open GL\Texture (en C++)\Makefile.win"
Exécution de  make...
make.exe -f "C:\Dev-Cpp\projets\Projets Open GL\Texture (en C++)\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include"    -w

g++.exe main.o  -o "Projet1.exe" -L"C:/Dev-Cpp/lib" -mwindows -lopengl32 -lglu32 -lmingw32 -lSDLmain -lSDL  C:/Dev-Cpp/mingw32/lib/SDL_image.lib 

main.o(.text+0xc3):main.cpp: undefined reference to `loadTexture(char const*, bool)'
collect2: ld returned 1 exit status

make.exe: *** [Projet1.exe] Error 1

Exécution terminée
 
  • Partager sur Facebook
  • Partager sur Twitter
8 juin 2007 à 1:45:33

Peut être, tout simplement, pour les libs :

-lopengl32
-lglu32
-lmingw32
-lSDLmain
-lSDL
-lSDL_image

Si la lib est dans le bon dossier (ce qui est le cas), il suffit de prendre son nom sans l'extension .lib (SDL_image) et le prefixer de "-l" (-lSDL_image) pour indiquer au compilateur que c'est une lib et que t'en a besoin pour compiler.

Le compilateur utilisé par Code::Blocks est mingw, un dérivé de gcc. Il utilise donc les mêmes paramètres en ligne de commande.
exemple pour compiler en ligne de commande :
gcc fichier.c main.c -o prog.exe -lLib1 -lLib2

avec des paramètres de la forme :
-lXXX : utiliser la lib XXX lors de l'édition de liens
-o XXX : le fichier créé s'appelle XXX
XXX : XXX est un fichier à compiler
-c : indique qu'il ne doit que compiler, pas lier les objets, ça créé des fichiers avec l'extension .o, faits pour être liés plus tard
il y en a plein d'autres, faciles à trouver avec du google-fu

Donc si tu ne mets pas le "-l" avant le nom, forcément ça marche pas, puisqu'il va croire que c'est un fichier à compiler alors qu'en fait c'est une lib.
  • Partager sur Facebook
  • Partager sur Twitter
8 juin 2007 à 15:36:22

oki pour le -l c'est bon et pour régler le pb de compilation avec loadTexture je fais quoi svp ?
  • Partager sur Facebook
  • Partager sur Twitter
8 juin 2007 à 16:15:49

As-tu bien mis le fichier sdlglutils.cpp dans ton projet ?

  • Partager sur Facebook
  • Partager sur Twitter
9 juin 2007 à 9:09:25

oui le .cpp et le .h sont dans le dossier et le .h a été ajoutté au projet....mais pas le cpp..... ^^

Pk je fais toujours des fautes debil XD le cpp n'était pas ajouté au projet :euh::p je perd en crédibilité là ^^ voilà merci a tous pour votre aide surtout à lucky55 ^^ je n'avais vu aucun appel au fichier cpp donc je croyais que le fichier servirai pour plus tard dans d'autre programme ^^ ; donc le fichier cpp c'est celui qui créer LoadTexture si j'ai bien compris ^^
  • Partager sur Facebook
  • Partager sur Twitter