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

OpenGL Discussion :

prob de placage de texture en 2d


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Par défaut prob de placage de texture en 2d
    J'utilise sdl et opengl pour faire de la 2d. Pour les fonctions de 2d classiques, pas de problèmes (ligne, ellipses, rectangles, ...).

    Je cherche aussi a afficher des "sprites" (des surfaces SDL), mais il ne m'affiche qu'un quadrilatère blanc ....

    Le code :
    l'initialisation de l'écran
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    		gluOrtho2D(0.0f, GLdouble(this->GetWidth()), GLdouble(this->GetHeight()), 0.0f);
    		// enable blending, should work like 2d sdl does
    		glEnable(GL_BLEND);
    		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    		// enable anti-aliasing
    		glEnable(GL_POINT_SMOOTH);
    		glEnable(GL_LINE_SMOOTH);
    		glShadeModel(GL_SMOOTH);
    		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    l'affichage du "sprite"
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    	if (surface->flags & SDL_OPENGL)
    	{
    		ManageTexture();
    		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, hTexture->w, hTexture->h, 0, GL_RGBA,
    			GL_UNSIGNED_BYTE, hTexture->pixels);
     
    		glBegin(GL_QUADS);
    		glTexCoord2f(0, 0);
    		glVertex2d(x, y);
    		glTexCoord2f(0, hTexWidth);
    		glVertex2d(x + hSurface->w, y);
    		glTexCoord2f(hTexHeight, hTexWidth);
    		glVertex2d(x + hSurface->w, y + hSurface->h);
    		glTexCoord2f(hTexHeight, 0);
    		glVertex2d(x, y + hSurface->h);
    		glEnd();
     
    		return;
    	}
     
    static int GetPowerSize(int value)
    {
    	int result = 0, count = 0;
     
    	while (result < value)
    	{
    		result = int(pow (2, count));
    		count++;
    	}
     
    	return (result);
    }
     
    void SDLgfx::ManageTexture()
    {
    	/* hTexture is of 2 power of n size so if hSurface is equal or smaller
    	than hTexture then there is no need to redefine it, only clean it and blit
    	hSurface into hTexture 
     
    	hTexture is of RGBA (32 bits) format */
     
    	/* define the size of hTexture */
    	int texHeight = GetPowerSize(hSurface->h);
    	int texWidth = GetPowerSize(hSurface->w);
     
    	/* define hTexture if it isn't */
    	if (!hTexture)
    	{
    		hTexture = SDL_CreateRGBSurface(SDL_SWSURFACE, texWidth, texHeight, 32, 0, 0, 0, 0);
    		hTextureStatus = TEX_TO_RELOAD;
    	}
     
    	/* do we need to resize hTexture ? */
    	if (((hSurface->w) > (hTexture->w)) || ((hSurface->h) > (hTexture->h)))
    	{
    		SDL_FreeSurface(hTexture);
    		hTexture = SDL_CreateRGBSurface(SDL_SWSURFACE, texWidth, texHeight, 32, 0, 0, 0, 0);
    		hTextureStatus = TEX_TO_RELOAD;
    	}
     
    	if (hTextureStatus & TEX_TO_RELOAD)
    	{
    		SDL_FillRect(hTexture, NULL, 0);
    		SDL_BlitSurface(hSurface, NULL, hTexture, NULL);
    	}
     
    	/* ratio for the texture coords */
    	hTexWidth = GLdouble(hSurface->w) / hTexture->w;
    	hTexHeight = GLdouble(hSurface->h) / hTexture->h;
    }
    Merci pour votre aide

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Je conseille de regarder ici :

    http://jeux.developpez.com/faq/sdl/?...PENGL_textures

    1) Il faut générer un indice pour la texture
    2) Utiliser glBindTexture pour dire quel indice on utilise
    3) Créer la texture

    Pour le moment, tu vérifies les dimensions de la texture -> c'est bien

    Par contre tu charges la texture à chaque affichage -> pas bien

    Jc

  3. #3
    Membre expérimenté Avatar de Sixissor
    Étudiant
    Inscrit en
    Février 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 206
    Par défaut
    Salut.

    Un petit problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, hTexture->w, hTexture->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, hTexture->pixels);
     
    	glBegin(GL_QUADS);
    	    glTexCoord2f(0, 0);
    	    glVertex2d(x, y);
    	    glTexCoord2f(0, hTexWidth);
    	    glVertex2d(x + hSurface->w, y);
    	    glTexCoord2f(hTexHeight, hTexWidth);
    	    glVertex2d(x + hSurface->w, y + hSurface->h);
    	    glTexCoord2f(hTexHeight, 0);
    	    glVertex2d(x, y + hSurface->h);
    	glEnd();
    Tu inverses les coordonnées de textures X et Y.
    Remplaces ton code d'affichage par ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	glBegin(GL_QUADS);
    	    glTexCoord2f(0, 0);
    	    glVertex2d(x, y);
    	    glTexCoord2f(hTexWidth, 0);
    	    glVertex2d(x + hSurface->w, y);
    	    glTexCoord2f(hTexWidth, hTexHeight);
    	    glVertex2d(x + hSurface->w, y + hSurface->h);
    	    glTexCoord2f(0, hTexHeight);
    	    glVertex2d(x, y + hSurface->h);
    	glEnd();
    Ca empeche pas de voir la texture mais ça la tourne.

    Ensuite y'a un truc qui me gêne beaucoup....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (surface->flags & SDL_OPENGL)
    {
       [...]
       return;
    }
    Pourquoi un return ici ?

    Petite info:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    est inutile dans ton cas (sauf erreur de ma part). OpenGL assemble par défaut ses primitives, donc 1 ligne de code en moins

    Sinon fearyourself a dit pourquoi ça fonctionnait pas.

    PS: moyen la fonction ManageTexture(): y'a plus simple comme solution... Je te conseilles d'utiliser gluBuildMipmaps2D().

    ++

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Par défaut
    Ok merci pour vos reponses pleines de sens

    Maintenant ça s'affiche

    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
     
    void SDLgfx::Blit(SDL_Surface *surface, int x, int y)
    {
     
    	if (!surface || !hSurface)
    		return;
     
    	// TODO if gl Window on other SDL_Surface
    	if (hSurface->flags & SDL_OPENGL)
    		return;
     
    	// gl Window
    	if (surface->flags & SDL_OPENGL)
    	{
    		ManageTexture();
    		glBegin(GL_QUADS);
    		glTexCoord2f(0, 0);
    		glVertex2d(x, y);
    		glTexCoord2f(1, 0);
    		glVertex2d(x + hSurface->w, y);
    		glTexCoord2f(1, 1);
    		glVertex2d(x + hSurface->w, y + hSurface->h);
    		glTexCoord2f(0, 1);
    		glVertex2d(x, y + hSurface->h);
    		glEnd();
    	}
    	else
    	{
    		SDL_Rect dest;
    		dest.x = x;
    		dest.y = y;
     
    		if (SDL_BlitSurface(hSurface, NULL, surface, &dest)<0)
    			std::cout << "something goes wrong" << std::endl;
    	}
    }
     
    void SDLgfx::ManageTexture()
    {
    	if (!hTextureIndex)
    	{
    		glGenTextures(1, &hTextureIndex);
    		hTextureStatus = TEX_TO_RELOAD;
    	}
     
    	glEnable(GL_TEXTURE_2D);
    	glBindTexture(GL_TEXTURE_2D, hTextureIndex);
     
    	if (hTextureStatus & TEX_TO_RELOAD)
    		gluBuild2DMipmaps(GL_TEXTURE_2D, 4, hSurface->h, hSurface->w, GL_RGBA,
    		GL_UNSIGNED_BYTE, hSurface->pixels);
     
    }
    Pour info, ce pitit morceau de code c'est pour gambas http://gambas.sourceforge.net

    ++

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

Discussions similaires

  1. Objet en GL_TRIANGLES et placage de texture
    Par themoye dans le forum OpenGL
    Réponses: 4
    Dernier message: 27/08/2009, 14h19
  2. [opengl] probleme d artefact au placage des textures
    Par ubenz dans le forum Moteurs 3D
    Réponses: 0
    Dernier message: 07/11/2008, 12h23
  3. placage de textures
    Par xelif dans le forum Moteurs 3D
    Réponses: 2
    Dernier message: 17/04/2008, 22h17
  4. Réponses: 5
    Dernier message: 18/12/2006, 17h02
  5. Placage de texture
    Par Teapot dans le forum OpenGL
    Réponses: 22
    Dernier message: 10/09/2006, 13h41

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